Makefile子目录中的多个源文件

问题描述 投票:0回答:1

我在目录中有几个.yml文件,这些文件是创建.json文件的python脚本的输入,.json位于与不带扩展名的源相同名称的子目录中。

Makefile与一个目标一起使用,但不适用于多个目标,它会创建循环依赖项

sources = DOC-A1 DOC-A2
pyscript=~/Documents/Programmation/myscript.py

all: $(sources)/$(sources)-ref.json $(sources)/$(sources)-enr.json

$(sources)/$(sources)-ref.json: $(sources).yml
    python3 $(pyscript) --ref --graph $<

$(sources)/$(sources)-enr.json: $(sources).yml
    python3 $(pyscript) --enr --graph $<



makefile
1个回答
0
投票

假设您具有源文件:DOC-A1.yml DOC-A2.yml,那么您需要执行以下操作:

# Source file base list (without yml extensions)
sources = DOC-A1 DOC-A2
# Create a list of ref output files from the base names
outputs_ref = $(addsuffix -ref.json,$(sources))
# Do the same with the enr files
outputs_enr = $(addsuffix -enr.json,$(sources))

# Print the list of output files you want (for ref)
$(info outputs_ref: $(outputs_ref))
$(info outputs_enr: $(outputs_enr))

pyscript=~/Documents/Programmation/myscript.py

# All now depends on the two lists of output files
all: $(outputs_ref) $(outputs_enr)

# Pattern-rule to generate -ref.json files, dependant on a .yml file with the same base-name
%-ref.json : %.yml
    @echo python3 $(pyscript) --ref --graph $<

# Pattern-rule to generate -enr.json files, dependant on a .yml file with the same base-name
%-enr.json: %.yml
    @echo python3 $(pyscript) --enr --graph $<

[注意:我仅使用的规则打印出命令-运行,从行首删除@echo部分

更新我忘记提及模式规则了。规则:%.a : %.b将扩展为与%.a匹配的所有目标,其中%是通配符。必须具有匹配的%.b依赖性,其中%也是通配符。因此,如果您具有源文件1.b, 2.b, 3.b,并且想要将其编译为1.a, 2.a, 3.a,则模式规则%.a : %.b将为您执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.