Вам нужно, чтобы значение переменной подстановки @libexecdir@
(как используется, например, Makefile.in
) было доступно вашему коду C ++. Самый простой и надежный способ сделать это с помощью переключателя -D
в командной строке компилятора для объектного файла, который должен знать:
foo.o: CPPFLAGS += -DLIBEXECDIR='"$(libexecdir)"'
В foo.cc
, LIBEXECDIR
будет макросом препроцессора, расширяющимся до строковой константы с нужным вам путем. Два предостережения: приведенный выше фрагмент Makefile использует функцию make GNU, переменные, специфичные для цели . Это не будет работать в других реализациях Make. Кроме того, я не стал цитировать символы в расширении $(libexecdir)
. Полностью оборонительное цитирование будет выглядеть примерно так:
foo.o: CPPFLAGS += \
-DLIBEXECDIR='"$(subst ",\",$(subst ','\'',$(subst \,\\,$(libexecdir))))"'
Вам определенно понадобится, по крайней мере, самая внутренняя конструкция $(subst ...)
, если вы хотите использовать имена путей Windows, с косой чертой, идущей в неправильном направлении. Люди обычно не помещают ' или " в имена путей, поэтому я, вероятно, не стал бы беспокоиться о внешних двух, пока кто-то не пожаловался.
Тот же метод будет работать для любой переменной подстановки @whatever@
, которая также не является AC_DEFINE
.
Вы можете подумать, что можете каким-то образом использовать AC_DEFINE_UNQUOTED
, чтобы получить значение $(libexecdir)
в config.h
, и поэтому избегайте всего этого бреда с командной строкой. К сожалению, Autoconf не полностью вычисляет значение своих замен @*dir@
во время настройки:
# near the top of the generated 'configure':
exec_prefix=NONE
libexecdir='${exec_prefix}/libexec'
# much, much later -- as part of AC_OUTPUT:
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
Поэтому, если вы сделаете очевидную вещь с AC_DEFINE_UNQUOTED
, вы получите что-то вроде
#define LIBEXECDIR "${exec_prefix}/libexec"
в вашем config.h. Так что это не сработает, и я не вижу хорошего способа заставить это работать.