在我的项目中,系统的各种目录,文件和其他组件的许多路径作为#defines存储在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中的反引号中执行它)但是我更喜欢一个更简单,更健壮的方法,比如写一半 – 穿过cpp的C半壳状物会产生正确的输出,或类似的东西.
最佳答案 把它放在你的Makefile中:
filenames.sh: filenames.h
awk '/^#define/{print;printf "_%s=%s\n",$2,$2}' $< \
| cpp -P \
| sed 's/^_//;s/" "//;' > $@