for makefile中的shell循环

Kev*_*vin 1 makefile

我写了一个makefile,希望它可以按顺序生成文件

1.out
2.out
3.out
Run Code Online (Sandbox Code Playgroud)

生成文件

TOUCH := $(shell for n in 'seq 1 3'; do echo $$n ;done)
.PHONY: test
test:
    @$(TOUCH)
Run Code Online (Sandbox Code Playgroud)

[确定]结果:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但是,当我用触摸替换回声时,

TOUCH := $(shell for n in 'seq 1 3'; do touch $$n.out ;done)
Run Code Online (Sandbox Code Playgroud)

[错]结果:

1
seq
3.out
Run Code Online (Sandbox Code Playgroud)

tri*_*eee 5

你似乎在这里混合了两个完全独立的结构.

VARIABLE := value
Run Code Online (Sandbox Code Playgroud)

将分配value给变量.

VARIABLE := $(shell echo value)
Run Code Online (Sandbox Code Playgroud)

将使用shell生成一个字符串,然后将该字符串赋值给VARIABLE.这Makefile在解析时发生,即在Make尝试实际执行任何配方之前.

我想你正在寻找这个:

TOUCH := for n in $$(seq 1 3); do touch $$n.out; done
.PHONY: test
test:
        @$(TOUCH)
Run Code Online (Sandbox Code Playgroud)

当然也可以内联;

.PHONY: test
test:
        @for n in $$(seq 1 3); do touch $$n.out; done
Run Code Online (Sandbox Code Playgroud)

更好的设计是让Make in charge,尽管:

.PHONY: test
test: 1.out 2.out 3.out
%.out:
        @touch $@
Run Code Online (Sandbox Code Playgroud)

(就个人而言,我会在@任何地方都省略前缀,这样你就可以看到发生了什么.make -s如果输出困扰你,一旦你调试了东西就运行.)