重构makefile以避免冗余实现

时间:2013-11-09 22:16:39

标签: bash shell makefile

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.txtfetch/list2.txt包含两个文件列表(路径+文件名),make list1make list2将分别通过2个列表并运行{{1}再次文件。这很好。

问题在于,我有几个文件列表$(BIN)list1,并且make的过程始终相同。有谁知道如何简化list2,以便makefilemake listA等做他们应该做的事情?

3 个答案:

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