我写了一个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)
你似乎在这里混合了两个完全独立的结构.
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如果输出困扰你,一旦你调试了东西就运行.)
| 归档时间: |
|
| 查看次数: |
3842 次 |
| 最近记录: |