问题:目标无法构建,因为依赖列表是在运行时构建的。如果声明变量文件不存在,如何指定依赖项列表。
如何从配方(规则)重新定义变量VIP_FOFs VIP_XMLs?
代码:(*.fof文件是由脚本temp.pl从目标copy_fof生成的)那么有没有办法从copy_fof的配方中声明下面的VIP_FOFs和VIP_XMLs呢?
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)发布于 2016-08-05 20:48:16
make旨在根据对目标/先决条件依赖关系的描述,仅重建需要重建的内容。如果每次调用make时,temp.pl脚本都会重新构建*.fof目标,那么make就没有什么用处了。为了每次重新构建所有内容,只需调整您的perl脚本来完成工作,并且不要使用make。
因此,在下文中,我将假设,只要temp.pl脚本没有更改,就不需要重新构建*.fof。我还假设您无法预测*.fof文件的名称,这似乎是您的主要问题。
要解决此问题,您可以使用递归make (make调用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_FOFs和VIP_XMLs变量将采用您所期望的值。
https://stackoverflow.com/questions/38761038
复制相似问题