我有一个Makefile,它在一个目录中从几个不同的Python脚本(脚本打印到stdout)生成JSON,例如。
/src
scriptOne.py
scriptTwo.py
scriptThree.py
将JSON输出到文件夹:
/templates
scriptOne.json
scriptTwo.json
scriptThree.json
我正在尝试重组,以便例如每个脚本都在其自己的子目录中,并且Makefile在其后续子目录中创建JSON模板,如下所示:
/src
/importantTemplates
scriptOne.py
/notSoImportantTemplates
scriptTwo.py
scriptThree.py
输出:
/templates
/importantTemplates
scriptOne.json
/notSoImportantTemplates
scriptTwo.json
scriptThree.json
当前的Makefile如下:
SOURCES := $(shell echo src/*.py)
TARGETS := $(patsubst src/%.py,templates/%.json,$(SOURCES))
all: $(TARGETS)
clean:
rm -f $(TARGETS)
templates/%.json: src/%.py
python2 $< > $@
我尝试更改通配符以包含每行的子目录,例如/src/*/*.py
,虽然我最终得到以下内容:
make: Nothing to be done for `all'.
答案 0 :(得分:1)
请注意,第二次运行make时,它会显示消息(如果没有新文件):
make: Nothing to be done for `all'.
尝试运行make clean并查看是否收到相同的消息。
这是Makefile,它可以做你想要的:
SOURCES := $(wildcard src/*/*.py)
TARGETS := $(patsubst src/%.py,templates/%.json,$(SOURCES))
FOLDERS := $(sort $(dir $(TARGETS)))
all: $(TARGETS)
clean:
rm -rf $(TARGETS) $(FOLDERS)
$(FOLDERS):
mkdir -p $@
$(TARGETS): $(SOURCES) $(FOLDERS)
python2 $< > $@
FOLDERS变量将包含您需要在模板目录中创建的文件夹。 (排序将删除重复项,因此每个文件夹只会出现一次)
$(FOLDERS)规则将创建文件夹。 干净的规则也将删除文件夹。
如果您需要添加更多来源,请按以下步骤操作:
SOURCES := $(wildcard src/*/*.py)
SOURCES += $(wildcard src/*.py)
...
答案 1 :(得分:1)
您需要一个静态模式规则(4.12 Static Pattern Rules)。
SOURCES := $(wildcard src/*/*.py)
TARGETS := $(patsubst src/%.py,templates/%.json,$(SOURCES))
all: $(TARGETS)
clean:
rm -rf templates
$(TARGETS) : templates/%.json: src/%.py
mkdir -p $(@D)
python2 $< > $@
如果您愿意,可以避免在该规则体中需要mkdir -p
(并且在目录中使用仅限订单的先决条件),但我不确定这项工作是否值得节省执行成本。如果您愿意,可以通过组合两行mkdir -p $(@D) && python2 $< > $@
来避免额外的shell。