Makefile从不同目录中的Python脚本生成JSON

时间:2014-12-09 12:12:42

标签: shell makefile

我有一个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'.

2 个答案:

答案 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。

相关问题