Экспорт C # определяет как переменные оболочки - PullRequest
4 голосов
/ 12 февраля 2010

В моем проекте несколько путей к различным каталогам, файлам и другим компонентам системы хранятся как #define s в filenames.h, файле, включенном всеми, кто в них нуждается. Он хорошо работает для всех различных двоичных файлов, сгенерированных компиляцией, но проект также включает несколько сценариев оболочки, которые используют одинаковые пути. В настоящее время это означает, что при изменении пути все, что мне нужно сделать, это отредактировать filenames.h и перекомпилировать, чтобы получить набор исполняемых файлов, чтобы понять новый путь, но я должен редактировать каждый скрипт оболочки вручную.

Таким образом, вопрос в том, как преобразовать #defines в переменные оболочки, например, сгенерировать некоторый сценарий filenames.sh, который будет вызываться из других сценариев для их инициализации. Так, например:

#define TMP_PATH      "/ait/tmp/"
#define SYNCTMZFILE   TMP_PATH "sync_tmz"

создаст

TMP_PATH="/ait/tmp/"
SYNCTMZFILE="/ait/tmp/sync_tmz" 

Конечно, можно написать программу C , которая ее создаст (даже распечатывает ее на стандартный вывод, а затем выполняет ее в обратном порядке в оболочке), но я бы предпочел более простую, более скажем, надежный метод написания наполовину С-наподобие оболочки, которая проходит через cpp, создаст правильный вывод или что-то похожее.

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Поместите это в ваш Makefile:

filenames.sh: filenames.h
        awk '/^#define/{print;printf "_%s=%s\n",$2,$2}' $< \
        | cpp -P \
        | sed 's/^_//;s/" "//;' > $@
1 голос
/ 12 февраля 2010

Обратное - сохранить мастер как сценарий оболочки и сгенерировать заголовок из этого - было бы проще. Если ваш заголовок очень стилизован, вы можете написать скрипт оболочки (или использовать awk / sed / perl / ...), чтобы проанализировать его и сгенерировать фрагмент оболочки.

0 голосов
/ 13 февраля 2010

Если вы строите свою программу, используя make, а сценарии оболочки выполняются make как часть процесса сборки, вы можете изменить ее:

  • Один источник переменных в вашем Makefile.
  • Экспорт их в среду для сценариев оболочки.
  • Передайте их компилятору C в качестве параметров командной строки. (Предполагается, что ваш компилятор поддерживает -D параметр или что-то подобное.)

Пример (не проверено):

export TMP_PATH := /ait/tmp/
export SYNCTMZFILE := $(TMP_PATH)sync_tmz
CFLAGS += -DTMP_PATH="$(TMP_PATH)" -DSYNCTMZFILE="$(SYNCTMZFILE)"

Если вы не используете make, опция -D все еще может быть вам полезна: вы можете использовать переменные из единого источника в сценарии оболочки вместо файла заголовка.

...