问题:目标没有获得构建,因为依赖项列表是在运行时构建的。如果在声明变量文件不存在时如何指定依赖关系列表。
如何从配方(规则)重新定义变量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)
答案 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_FOFs
和VIP_XMLs
变量将采用您期望的值。