如何在makefile规则中设置变量

时间:2016-08-04 07:28:40

标签: xml unix makefile

问题:目标没有获得构建,因为依赖项列表是在运行时构建的。如果在声明变量文件不存在时如何指定依赖关系列表。

如何从配方(规则)重新定义变量VIP_FOFs VIP_XMLs?

代码: (* .fof文件是由目标copy_fof的脚本temp.pl生成的)所以有没有办法从copy_fof的配方声明以下VIP_FOF和VIP_XML?

VIP_FOFs := $(wildcard $(RECITAL_PATH)/vip_xml/xml_generation/*.fof)

VIP_XMLs = $(VIP_FOFs:.fof=.xml)

all: copy_fof $(RECITAL_PATH)/catalog/catalog.xml

copy_fof:
        `perl temp.pl`

%.xml: %.fof
    rpfImport \
        --view rtl_simulation \
        --append_log \
        --log $(RECITAL_PATH)/logs/rpfImport.log \
        --format fof  --vlnv ,,$(notdir $(basename $< .fof)), \
        --output $@  $< ;

$(RECITAL_PATH)/catalog/catalog.xml: $(VIP_XMLs)  
    @echo "#  generating catalog.xml "; \
    rpfCatalog --add $(VIP_XMLs)

1 个答案:

答案 0 :(得分:0)

make旨在根据目标/先决条件依赖项的描述仅重建需要的内容。如果,每次调用make时,*.fof脚本会重新构建temp.pl目标,make就会毫无用处。为了每次都重建所有内容,只需调整perl脚本即可完成工作,不要使用make

在下文中,我将假设,只要temp.pl脚本没有更改,就不需要重建*.fof。我还假设您无法预测*.fof文件的名称,这似乎是您的主要问题。

要解决此问题,您可以使用递归make(make calling make):

VIP_FOFs := $(wildcard $(RECITAL_PATH)/vip_xml/xml_generation/*.fof)
VIP_XMLs := $(patsubst %.fof,%.xml,$(VIP_FOFs))

.PHONY: all

all: copy_fof
    $(MAKE) $(RECITAL_PATH)/catalog/catalog.xml

copy_fof: temp.pl
    perl temp.pl
    touch $@

$(VIP_XMLs): %.xml: %.fof
    rpfImport \
        --view rtl_simulation \
        --append_log \
        --log $(RECITAL_PATH)/logs/rpfImport.log \
        --format fof  --vlnv ,,$(notdir $(basename $< .fof)), \
        --output $@  $< ;

$(RECITAL_PATH)/catalog/catalog.xml: $(VIP_XMLs)  
    @echo "#  generating catalog.xml "; \
    rpfCatalog --add $(VIP_XMLs)

当您调用make时,它将构建all虚假目标。由于all是虚假的,其配方将始终执行。如果copy_fof空文件比temp.pl脚本更新,则all的先决条件无关,*.fof文件是最新的。否则,将运行temp.pl脚本,创建*.fof文件并创建或修改copy_fof空文件以指示作业已完成。

然后,将运行all食谱,第二次调用make来构建$(RECITAL_PATH)/catalog/catalog.xml。这一次,*.fof文件存在,VIP_FOFsVIP_XMLs变量将采用您期望的值。