我有一个项目对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
很棒,只需要更多练习!!
答案 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 $@
现在你已经完成了!