4

在我的项目中,系统的各种目录、文件和其他组件的许多路径都存储为#defines 中的 s ,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程序(甚至将其打印到标准输出,然后在 shell 中以反引号执行),但我更喜欢更简单、更健壮的方法,比如写一个半-像 C 半壳一样运行的东西cpp会产生正确的输出,或者类似的东西。

4

3 回答 3

1

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

于 2010-02-12T11:57:03.403 回答
1

把它放在你的 Makefile 中:

filenames.sh: filenames.h
        awk '/^#define/{print;printf "_%s=%s\n",$2,$2}' $< \
        | cpp -P \
        | sed 's/^_//;s/" "//;' > $@
于 2010-02-12T12:18:48.343 回答
0

如果您使用构建程序make并在构建过程中执行 shell 脚本make,则可以将其转过来:

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

示例(未经测试):

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

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

于 2010-02-13T16:32:24.247 回答