Autoconf: Как установить пути установки в config.h

Моя программа должна загружать некоторые файлы во время выполнения, которые будут установлены в любую папку для ./configure --datadir=/somewhere

Как моя программа должна знать, где находится эта папка во время выполнения, мне нужно #define символ где-нибудь, чтобы код C мог получить доступ к пути в виде строки.

В настоящее время я делаю это, изменяя флаги компилятора:

AM_CPPFLAGS = -DDATA_PATH=\"$(pkgdatadir)\"

Однако, поскольку configure script уже создает файл config.h с кучей других вещей в нем, я хотел бы, чтобы вместо этого появился символ.

Возможно ли это?

Ответ 1

AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"])

Хотя модификация флагов компилятора действительно более обычный способ сделать это.

Ответ 2

Ваше решение правильное. Причина, по которой Autoconf/Automake (легко) не поддерживает перенос путей установки в config.h, заключается в том, что вы теоретически должны быть способны переопределять пути во время сборки, например make prefix=/else/where. Эта возможность в настоящее время несколько загадочна, но причина. (Обратите внимание, что это отличается от make install prefix=/else/where/, что по-прежнему полезно, несмотря на DESTDIR.)

Ответ 3

Ваш ответ - предпочтительный способ сделать это. В руководстве autoconf объясняется, как переопределить различные переменные на этапе "make install" (что очень полезно для упаковки, например). При этом он говорит (в разделе "Переменные каталога установки" ):

   A corollary is that you should not use these variables except in
makefiles.  For instance, instead of trying to evaluate `datadir' in
`configure' and hard-coding it in makefiles using e.g.,
`AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you
should add `-DDATADIR='$(datadir)'' to your makefile definition of
`CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake).

autotools и системы сборки в целом - это запутанный бизнес, и никто еще не придумал хороших и опрятных способов сделать вещи, которые являются достаточно общими, а это значит, что мы должны читать такие разделы, как этот, и полностью его разрабатывать, В любом случае ваша интуиция была правильной!

Ответ 4

Если у вас есть целая серия таких путей, которые должны быть известны вашему исходному коду, и вы хотите избежать чрезмерного шума в своих компиляциях (например, -DPATH1 =/path/to/something -DPATH2 =/path2/to/something2 -DPATH3 =/path3/to/something3... ad infinitum), альтернативой, которая может быть желательной для некоторых людей, является создание нового "mynewheader.h.in", с линиями

#define PATH1 "@[email protected]"
#define PATH2 "@[email protected]"
#define PATH3 "@[email protected]"

и добавьте его в строку configure.ac AC_CONFIG_FILES, например:

AC_CONFIG_FILES([Makefile mynewheader.h])