Makefile 从'make'命令行触发C源定义

Makefile 从'make'命令行触发C源定义,makefile,Makefile,我想将C源代码define链接到makefile变量,以便能够通过make定义或取消定义 比如说, // my C source file #ifdef SOMETHING // do something #else // do something else #endif 然后,将从make命令行触发某些内容: 使某事成真 这适用于我的makefile: 我在徘徊,这是正确的方式吗? 有更简单或更好的解决方案吗 以下不是一个特别的解决方案,但它要求您使用make库:是GNUmak

我想将C源代码define链接到makefile变量,以便能够通过make定义或取消定义

比如说,

// my C source file
#ifdef SOMETHING
   // do something
#else
   // do something else
#endif 
然后,将从make命令行触发某些内容:

使某事成真

这适用于我的makefile:

我在徘徊,这是正确的方式吗?
有更简单或更好的解决方案吗

以下不是一个特别的解决方案,但它要求您使用make库:是GNUmake table工具包,设计时或多或少考虑了这样一个用例。您可以使用关系数据库中已知的适度形式的select语句指定要访问的表。通过这种方式,您可以避开复杂的ifeq层次结构,并且可以很容易地引入构建参数。当然,有人会说,在我的例子中,如果不引入make库,三个非常简单的ifeq段落也可以做到,但下面的解决方案的优点是,表格迫使您分离关注点,您不必担心除了生成define之外,还有人在ifeq中偷偷加入了附加功能


使用此makefile,您现在可以调用make project type=type-1等等,并且makefile将为您生成project_def.h,它将用作普通头文件,而不是命令行中的不可见定义。

以下不是特别的解决方案,但它要求您使用make库:是GNUmake table toolkit和was设计时或多或少会考虑到这样一个用例。您可以使用关系数据库中已知的适度形式的select语句指定要访问的表。通过这种方式,您可以避开复杂的ifeq层次结构,并且可以很容易地引入构建参数。当然,有人会说,在我的例子中,如果不引入make库,三个非常简单的ifeq段落也可以做到,但下面的解决方案的优点是,表格迫使您分离关注点,您不必担心除了生成define之外,还有人在ifeq中偷偷加入了附加功能


有了这个makefile,您现在可以调用make project type=type-1等等,makefile将为您生成project_def.h,它将作为一个普通的头文件,而不是命令行中的不可见定义。

是的,这是这类事情的一个非常常见的习惯用法。你有什么特别的问题吗?谢谢。没有任何问题。我只是想确定这是正确的方法,因为,在一次定义之后,似乎我还需要添加一些…这很常见,但有一个相当令人不快的警告:如果您正在调试或生成一个自动报告,例如软件进程检查点,那么您需要以某种方式将定义的宏从临时命令行传输到某个稳定的存储表单,这意味着在构建过程中将控制台输出记录到某个文件中,该文件将成为发行版的一部分。因为它不是源代码的一部分,所以即使是聪明的调试器也常常无法定义。你必须决定simple beats在你的情况下是否稳定。请注意,现在所有的酷孩子似乎都在使用更高级别的构建系统,比如CMake——我想这可能会使管理构建变体比直接在makefiles上操作的临时解决方案容易得多。是的,这是这类事情的一个非常常见的习惯用法。你有什么特别的问题吗?谢谢。没有任何问题。我只是想确定这是正确的方法,因为,在一次定义之后,似乎我还需要添加一些…这很常见,但有一个相当令人不快的警告:如果您正在调试或生成一个自动报告,例如软件进程检查点,那么您需要以某种方式将定义的宏从临时命令行传输到某个稳定的存储表单,这意味着在构建过程中将控制台输出记录到某个文件中,该文件将成为发行版的一部分。因为它不是源代码的一部分,所以即使是聪明的调试器也常常无法定义。您必须决定simple beats在您的情况下是否稳定。请注意,现在所有的酷孩子似乎都在使用更高级别的构建系统,如CMake—我想这可能会使管理构建变体比直接在makefiles上操作的临时解决方案容易得多。
ifeq ($(something),true)
    COMPILER_FLAGS += -DSOMETHING   
endif
include gmtt/gmtt.mk

#define a 3-column table; there must be no empty cells (put in a comment)!
define project-defs =
3
type-1   APPLES   15
type-1   ORANGES  0
type-1   PEARS   /*empty*/

type-2   APPLES   0
type-2   ORANGES  15
type-2   PEARS   /*empty*/

type-3   APPLES   15
type-3   ORANGES  15
endef

#select column 2 and 3 of the above table and create a C-source line with '#define' from them
define project-defines :=
$(call map-select,2 3,$(project-defs),$$(call str-eq,$$1,$(project-type)),\#define $$1 $$2$$(newline))
endef

$(info Building with the following defines: $(project-defines))

$(file > project_def.h,$(project-defines))