Makefile引用外部变量

Posted by LuckXiang on August 21, 2016

Makefile的变量是一个文本字符串,有点像c语言中的宏,我们需要记住很重要的一点,Makefile中的变量和函数的展开是在make读取Makefile文件的时候进行的。我们可以在使用make命令的时候给把外部变量作为参数传进去。现在假设有这样一个场景,用户需要从Makefile外部读取一个存在文件中的变量,然后根据这个变量来链接不同的lib库。我们应该如何做呢?文件内容如下:

CUSFLG=123;

下边是一种错误的做法:在Makefile语法中引用shell语法,通过shell命令从文件中解析出变量值,然后再把这个值赋值给Makefile变量。这个过程可能会在两个地方做,一个是在规则内,如

def:
    CID=`awk -f ";" '{print $$1}' ./cfg.tmp`

ifeq($(CID), 123)
LDFLAGS += -lgca
#endif

这里有个小细节,一个$表示的是Makefile变量,shell变量是两个$$,Makefile中一行shell命令就是一个进程,shell变量根本没法传到进程之外,所以这样做根本得不到正确结果,那么,我们把赋值过程放在规则之外呢?

CID=`awk -f ";" '{print $$1}' ./cfg.tmp`

ifeq($(CID), 123)
LDFLAGS += -lgca
#endif

这样执行的结果就是CID的值是字符串=awk -f ";" '{print $$1}' ./cfg.tmp,而不是123,Makefile的变量永远是一个字符串。那么就没办法完成这个任务了吗?NO,我这有一种办法,我们可以把这个cfg.tmp文件看作是一个Makfile文件,这样在Makfefile脚本中把它include进来,CUSFLG就变成了一个Makfile变量,它的值是字符串”123;”,代码如下:

include cfg.tmp

ifeq($(CUSFLG), 123;)
LDFLAGS += -lgca
#endif

这个;是不是很讨厌,注意,这里还没办法用Makefile提供的函数去掉;号,想不要这个;号,那只能在cfg.tmp里去掉它了。