首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在makefile规则中设置变量

问如何在makefile规则中设置变量
EN

Stack Overflow用户
提问于 2016-08-04 15:28:40
回答 1查看 378关注 0票数 0

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

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

代码:(*.fof文件是由脚本temp.pl从目标copy_fof生成的)那么有没有办法从copy_fof的配方中声明下面的VIP_FOFs和VIP_XMLs呢?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-05 20:48:16

make旨在根据对目标/先决条件依赖关系的描述,仅重建需要重建的内容。如果每次调用make时,temp.pl脚本都会重新构建*.fof目标,那么make就没有什么用处了。为了每次重新构建所有内容,只需调整您的perl脚本来完成工作,并且不要使用make。

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

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

代码语言:javascript
复制
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_FOFs和VIP_XMLs变量将采用您所期望的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38761038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档