如何编写重复过程的makefile?

时间:2014-02-23 18:46:19

标签: makefile

我有一个项目对10个不同的文件进行相同的分析。例如,我从test1.txt .... test10.txt开始。它们分别设置在名为test1 .... test10的10个不同文件夹中。我有一个python脚本,对文件运行一些测试并生成test1_v1.txt ... test10_v1.txt,然后使用Rscript进行另一轮分析并生成test1_v12.txt ... test10_v2.txt 。现在我有makefile这样的设置:

TEST_FOLDER=test1 test2 test3 test4 test5 test6 test7 test8 test9 test10

test3/%_v1.txt:
    @$(foreach var, $(TEST_FOLDER), python run_test.py -in $(var)/$(var).txt -out $(var)/$(var)_v1.txt;)


test3/%_v1.txt: 
    @$(foreach var, $(TEST_FOLDER), Rscript run_stat.R -in $(var)/$(var)_v1.txt -out $(var)/$(var)_v2.txt;)

我知道这确实是一个糟糕的设置,并且没有正确的依赖关系。它仅取决于test3/%_v1.txt中的文件。我尝试过使用类似的东西:

$(TEST_FOLDER)/$(TEST_FOLDER)_v1.txt:$(TEST_FOLDER)/$(TEST_FOLDER).txt
       python run_test.py -in $^ -out $@

但是,它没有用。任何关于使makefile工作为makefile而不是shell脚本的建议都会很棒。

make很棒,只需要更多练习!!

1 个答案:

答案 0 :(得分:2)

关于make的诀窍是你必须向后工作。从最后想要的内容开始。在这种情况下,_v2.txt个文件。所以这些是你all所依赖的东西:

TEST_FOLDER=test1 test2 test3 test4 test5 test6 test7 test8 test9 test10

all: $(foreach T,$(TEST_FOLDER),$T/$T_v2.txt)

现在如何构建其中一个单个?每当你编写一个make规则时,理想情况下每个规则应该运行一个命令或一组生成一个输出的命令;不要在一个规则中使用循环来构建多个相同类型的输出。接下来将该规则写为模式规则:

%_v2.txt : %_v1.txt
        Rscript run_stat.R -in $< -out $@

现在编写规则来创建_v1.txt文件:

%_v1.txt : %.txt
        python run_test.py -in $< -out $@

现在你已经完成了!