Ответ 1
AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"])
Хотя модификация флагов компилятора действительно более обычный способ сделать это.
Моя программа должна загружать некоторые файлы во время выполнения, которые будут установлены в любую папку для ./configure --datadir=/somewhere
Как моя программа должна знать, где находится эта папка во время выполнения, мне нужно #define символ где-нибудь, чтобы код C мог получить доступ к пути в виде строки.
В настоящее время я делаю это, изменяя флаги компилятора:
AM_CPPFLAGS = -DDATA_PATH=\"$(pkgdatadir)\"
Однако, поскольку configure script уже создает файл config.h с кучей других вещей в нем, я хотел бы, чтобы вместо этого появился символ.
Возможно ли это?
AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"])
Хотя модификация флагов компилятора действительно более обычный способ сделать это.
Ваше решение правильное. Причина, по которой Autoconf/Automake (легко) не поддерживает перенос путей установки в config.h
, заключается в том, что вы теоретически должны быть способны переопределять пути во время сборки, например make prefix=/else/where
. Эта возможность в настоящее время несколько загадочна, но причина. (Обратите внимание, что это отличается от make install prefix=/else/where/
, что по-прежнему полезно, несмотря на DESTDIR
.)
Ваш ответ - предпочтительный способ сделать это. В руководстве 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 и системы сборки в целом - это запутанный бизнес, и никто еще не придумал хороших и опрятных способов сделать вещи, которые являются достаточно общими, а это значит, что мы должны читать такие разделы, как этот, и полностью его разрабатывать, В любом случае ваша интуиция была правильной!
Если у вас есть целая серия таких путей, которые должны быть известны вашему исходному коду, и вы хотите избежать чрезмерного шума в своих компиляциях (например, -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])