有条件地包括其他makefile

时间:2013-01-08 11:18:07

标签: bash include makefile conditional


我想有条件地包含makefile,具体取决于xml文件和产品的内容 我的xml文件(myxml.xml):

<product1>
  <component1 dirname=dir1 />
  <component2 dirname=dir2 />
</product1>
<product2>
  <component1 dirname=dir1 />
  <component3 dirname=dir3 />
</product2>

在dir1中,我有一个config.mk文件,如下所示:

SRC_JS+=dir1/file1.js
SRC_JS+=dir1/file2.js
SRC_HTML+=dir1/file3.html

dir2和dir3相同,它们都是makefile目录的子目录。

现在我希望根据指定的产品包含某些config.mk文件,根据xml文件中的内容 所以我的makefile:

myjscode.js: myxml.xml
  read_dirs.py -p $PRODUCT $< > mydirs.txt
  while read mydir; do \
    include $$mydir/config.mk ; \
  done < mydirs.txt;
  js-compiler $(addprexis --js ,$SRC_JS) -output $@

可以这样做吗? 仅供参考:我正在使用bash,read_dirs.py脚本输出“每个目录一行”列表。

2 个答案:

答案 0 :(得分:0)

首先是简单的部分。 include指令不能出现在规则中的命令中。修改read_dirs.py以生成类似的内容(当PRODUCT =“product2”时):

include dir1/config.mk
include dir3/config.mk

然后在你的makefile中:

mydirs.mk: myxml.xml
    read_dirs.py -p $PRODUCT $< > $@

include mydirs.mk

没有必要依赖mydirs.mk;因为这个makefile includes,Make会在必要时重建它。

现在困难的部分。我认为您希望选择包含的makefile不仅可以在myxml.xml更改时更改,还可以在PRODUCT更改时更改。但是PRODUCT不是文件,所以我们有一些选择。我们可以有一个包含product.mk变量的文件PRODUCT。或者代替mydirs.mk,我们可以为每个PRODUCT提供不同的文件。或者我们每次都可以强制建造mydirs.mk。这取决于您设置PRODUCT的方式以及您的优先级。

答案 1 :(得分:0)

include $(shell read_dirs.py -p $(PRODUCT) myxml.xml|sed s,$$,/config.mk,)
myjscode.js: myxml.xml
    js-compiler ...