我makefile
的一部分如下:
list1: all
for f in \
`less fetch/list1.txt`; \
do \
...
./$(BIN) $$f & \
...
done
list2: all
for f in \
`less fetch/list2.txt`; \
do \
...
./$(BIN) $$f & \
...
done
fetch/list1.txt
和fetch/list2.txt
包含两个文件列表(路径+文件名),make list1
和make list2
将分别通过2个列表并运行{{1}再次文件。这很好。
问题在于,我有几个文件列表$(BIN)
和list1
,并且make的过程始终相同。有谁知道如何简化list2
,以便makefile
,make listA
等做他们应该做的事情?
答案 0 :(得分:1)
您可以使用Pattern Rule:
all: @echo "The all recipe" list%: all @echo "This recipe does something with $@.txt"
输出是:
$ make list1 The all recipe This recipe does something with list1.txt $ make list256 The all recipe This recipe does something with list256.txt $
答案 1 :(得分:0)
我不建议在makefile中执行脚本。它经常会导致任意的,不一致的错误和其他形式的挫折。
将Make用于具有依赖关系的执行控制(如同,确定在何时执行),但单独编写实际的原语(脚本或其他程序),并从Make中调用它们。
bar: foo1 foo2 foo3
# bar is the make target. Foo1, 2, and 3 are sub-targets needed to make bar.
foo1:
fooscript1 # Written as an individual script, outside Make.
fooscript2
答案 2 :(得分:0)
怎么样:
all:
@echo "All"
action_%:
@./$(BIN) $*
ACTION=$(patsubst %,action_%,$(shell cat $(ACT_FILE)))
actionList:
@make $(ACTION)
list%: all
@make ACT_FILE=fetch/list$*.txt actionList
支持所有列表: - )
而不是允许无限并行(你使用./$(BIN) fileName &
)。您可以使用Make的内置功能控制实际的并行度。
make -j8 list1
# ^ Parallelism set to 8