在我的项目中,系统的各种目录,文件和其他组件的许多路径都作为#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
的东西会产生正确的输出,或类似的东西。
答案 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
。-D
parameter或类似的东西。)示例(未经测试):
export TMP_PATH := /ait/tmp/
export SYNCTMZFILE := $(TMP_PATH)sync_tmz
CFLAGS += -DTMP_PATH="$(TMP_PATH)" -DSYNCTMZFILE="$(SYNCTMZFILE)"
如果您不使用make
,-D
选项仍然可能对您有用:您可以在shell脚本中而不是在头文件中单源化变量。