Передать каталог в приложение C ++ из компилятора - PullRequest
2 голосов
/ 25 ноября 2011

Некоторые приложения содержат сценарии, которые запускаются основным приложением, находящимся в / usr / libexec. Однако сценарии autoconf могут изменить этот каталог, передав --libexecdir в сценарий настройки.

Например, при запуске ./configure в исходном коде git я могу установить для --libexecdir любой каталог, который мне нужен, и программа все равно будет работать.

Что мне нужно добавить в C ++, чтобы эта функция работала? Другими словами, как мне задать имя каталога, заданное сценарием настройки, скомпилированным в программу?

1 Ответ

3 голосов
/ 25 ноября 2011

Вам нужно, чтобы значение переменной подстановки @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. Так что это не сработает, и я не вижу хорошего способа заставить это работать.

...