1

我的一部分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.txtandfetch/list2.txt包含两个文件列表(路径+文件名),make list1andmake list2将分别遍历这两个列表并$(BIN)再次运行文件。这工作正常。

问题是,我有几个文件列表list1list2,并且制作过程总是相同的。有谁知道如何简化makefile这样make listA,make list4等等 做他们应该做的事情?

4

3 回答 3

1

您可以使用模式规则

全部:
    @echo“所有食谱”

列表%:全部
    @echo "这个食谱对 $@.txt 有作用"

输出是:

$ 制作清单1
所有食谱
这个食谱对 list1.txt 做了一些事情
$ 制作清单256
所有食谱
这个食谱对 list256.txt 做了一些事情
$
于 2013-11-09T22:29:04.280 回答
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
于 2013-11-10T00:30:55.723 回答
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
于 2013-11-09T23:19:18.320 回答