Makefile引用外部变量

版权声明:博客搬运自个人博客www.bigxiangbaobao.com,转载须经本人同意 https://blog.csdn.net/Zx_SSSS/article/details/79673664
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里去掉它了。

猜你喜欢

转载自blog.csdn.net/Zx_SSSS/article/details/79673664