代码之家  ›  专栏  ›  技术社区  ›  SF.

export c定义为shell变量

  •  4
  • SF.  · 技术社区  · 14 年前

    在我的项目中,许多指向不同目录、文件和系统其他组件的路径存储为 #define A中的S filenames.h ,包含所有需要它们的文件。它适用于编译生成的所有不同的二进制文件,但该项目还包括一些使用相同路径的shell脚本。现在这意味着当路径改变时,我所要做的就是编辑 文件名.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半shell类型的东西来运行 cpp 会产生正确的输出,或者类似的东西。

    3 回复  |  直到 8 年前
        1
  •  1
  •   mouviciel    14 年前

    把这个放到makefile中:

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

    相反,将master保存为shell脚本并从中生成头文件会更容易。如果您的头非常样式化,那么可以编写一个shell脚本(或者使用awk/sed/perl/…)来解析它并生成shell片段。

        3
  •  0
  •   bk1e    14 年前

    如果您使用 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)"
    

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