从`make`命令行触发C源#define

时间:2018-01-10 08:43:05

标签: makefile

我想将C源#define“链接”到makefile变量 - 以便能够通过make定义或取消定义。

例如,

// my C source file
#ifdef SOMETHING
   // do something
#else
   // do something else
#endif 

然后SOMETHING将从make命令行触发:

make something=true

这适用于我的makefile

ifeq ($(something),true)
    COMPILER_FLAGS += -DSOMETHING   
endif

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

1 个答案:

答案 0 :(得分:2)

以下不是一个临时解决方案,但它要求您使用make库:gmtt是GNUmake表工具包,并且考虑到这样的用例或多或少地设计了。您可以使用关系数据库中已知的select语句的(适度)形式指定您访问的表。这样您就可以转义复杂的ifeq层次结构,并且可以轻松地引入构建参数。当然有人可以争辩说,在我的例子中,三个非常简单的ifeq段落也会做,而不会引入一个make库,但下面解决方案的优点是表格强迫你分离关注点而你不会# 39;除了生成ifeq之外,还需要担心有人在其中一个#define中潜入了附加功能。

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))

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