我想将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
我在徘徊,这是正确的方法吗? 有更简单或更好的解决方案吗?
答案 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
,它将作为普通头文件而不是命令行中的不可见定义。