将C #defines导出为shell变量

时间:2010-02-12 11:04:17

标签: c shell environment-variables c-preprocessor header-files

在我的项目中,系统的各种目录,文件和其他组件的许多路径都作为#define存储在filenames.h中,所有需要它们的文件都包含在该文件中。它适用于编译生成的所有各种二进制文件,但该项目还包括一些使用相同路径的shell脚本。目前这意味着当路径发生变化时,我所要做的就是编辑filenames.h并重新编译以获取可执行文件集来理解新路径,但我必须手动编辑每个shell脚本。

所以问题是,如何将#defines转换为shell变量,例如生成一些可以从其他脚本调用以初始化它们的filenames.sh脚本。例如:

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

会创建

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

当然可以编写一个 C 程序来创建它(甚至将它打印到stdout然后在shell中的反引号中执行它)但是我更喜欢更简单的,更强大的方法,比方说,写一个半C的半壳类似于贯穿cpp的东西会产生正确的输出,或类似的东西。

3 个答案:

答案 0 :(得分:1)

反过来 - 将master作为shell脚本并从中生成标题 - 会更容易。如果您的标头非常风格化,您可以编写一个shell脚本(或使用awk / sed / perl / ...)来解析它并生成shell片段。

答案 1 :(得分:1)

将它放在Makefile中:

filenames.sh: filenames.h
        awk '/^#define/{print;printf "_%s=%s\n",$2,$2}' $< \
        | cpp -P \
        | sed 's/^_//;s/" "//;' > $@

答案 2 :(得分:0)

如果您使用make构建程序,并且make执行shell脚本作为构建过程的一部分,则可以将其转为:

  • 单一来源Makefile
  • 中的变量
  • 将它们导出到shell脚本的环境中。
  • 将它们作为命令行选项传递给C编译器。 (这假设您的编译器支持-D parameter或类似的东西。)

示例(未经测试):

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

如果您不使用make-D选项仍然可能对您有用:您可以在shell脚本中而不是在头文件中单源化变量。