【问题标题】:How to control behavior of makefile by a macro definition in a header?如何通过标头中的宏定义控制makefile的行为?
【发布时间】:2021-05-11 01:13:38
【问题描述】:

在我的项目中,我在头文件config.h 中定义了一个名为ACT_STATE 的宏来编译不同的代码块。宏 ACT_STATE 可以是 ACT_DEVELOP(值 0) 或 ACT_DEPLOY(值 1),我希望名为 User 的文件夹中的源文件可以在状态 ACT_DEPLOY 下编译,并将这些源文件单独留在状态 @ 987654329@。我知道我可以在调用make 时将宏定义传递给makefile,但是通过这种方式我需要定义ACT_STATE 两次。因此,我认为是否可以让make从头文件中读取宏定义,从而可以根据头文件中的宏定义编译不同的文件?

【问题讨论】:

  • 没有标准或简单的方法可以从标头中读取宏值。更常见的做法是让 make 指定值,这样标题就不必指定,或者如果 make 没有指定值,则标题指定默认值。
  • 宏不需要定义两次。如果你通过 Make (make ACT_STATE=ACT_DEPLOY) 传递它,那么没有理由在标题中定义它。
  • 请记住,C 代码(尤其是某些#included 文件)可以由程序生成GNU autoconf 工具可能对您有用
  • @Beta 为了进行适当的配置管理,最好不要依赖于启动构建过程的非常短暂且易变的命令行。当然,总是可以添加另一层脚本,但恕我直言,这也是不可取的。
  • @Vroomfondel:我见过配置管理系统执行的操作,例如,每天午夜扫描主分支的备份和构建。但是我从来没有见过一个构建系统可以以依赖于命令行的方式根据命令构建某些东西。 (当然,我不计算基于 GUI 的憎恶)。如果有更好的选择,我很想学习。

标签: c makefile gnu-make


【解决方案1】:

Preprocessor options,

gcc -D name=definition

但是,ACT_DEVELOP 0ACT_DEPLOY 1 并不是生成二进制变量的最简单方法。没有理由不能写#define ACT_STATE 7#undef ACT_STATE,导致复杂的范围检查。更好的方法是#ifdef#if defined(...)

gcc -D name

除非您有充分的理由这样做,否则请考虑使用C 标准assert.h。使用C11,可以执行static_assert,这在某些情况下非常有用。 assert.h 触发器是 NDEBUG,它在定义时使 assert 参数编译为 (void)0

另请参阅passing additional variables to make 编辑Makefile

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    相关资源
    最近更新 更多