我有一种非常舒适的方式来通过几行bash命令编译我的项目.但现在我需要通过makefile编译它.考虑到每个命令都在自己的shell中运行,我的问题是在makefile中运行多行bash命令的最佳方法是什么,相互依赖? 例如,像这样:
for i in `find`
do
all="$all $i"
done
gcc $all
Run Code Online (Sandbox Code Playgroud)
另外,有人可以解释为什么即使单行命令bash -c 'a=3; echo $a > file'在终端中工作正常,但在makefile情况下创建空文件?
Eld*_*mov 116
我会使用反斜杠换行符:
foo:
for i in `find`; \
do \
all="$$all $$i"; \
done; \
gcc $$all
Run Code Online (Sandbox Code Playgroud)
或者,如果只想将返回的整个列表传递find给gcc:
foo:
gcc `find`
Run Code Online (Sandbox Code Playgroud)
nob*_*bar 77
如问题所示,每个子命令都在自己的shell中运行.这使得编写非平凡的shell脚本有点乱 - 但它是可能的! 解决方案是将您的脚本合并到将考虑单个子命令(单行)的内容中.
$通过替换来逃避脚本的使用$$;在命令之间插入,将脚本转换为单行\set -e匹配make的配置以在子命令失败时中止()或{}强调多行序列的内聚性 - 这不是典型的makefile命令序列这是一个受OP启发的例子:
mytarget:
{ \
set -e ;\
msg="header:" ;\
for i in $$(seq 1 3) ; do msg="$$msg pre_$${i}_post" ; done ;\
msg="$$msg :footer" ;\
echo msg=$$msg ;\
}
Run Code Online (Sandbox Code Playgroud)
ONESHELL 指令允许编写要在同一个 shell 调用中执行的多行配方。
all: foo
SOURCE_FILES = $(shell find . -name '*.c')
.ONESHELL:
foo: ${SOURCE_FILES}
FILES=()
for F in $^; do
FILES+=($${F})
done
gcc "$${FILES[@]}" -o $@
Run Code Online (Sandbox Code Playgroud)
但是有一个缺点:特殊前缀字符('@'、'-' 和 '+')的解释不同。
https://www.gnu.org/software/make/manual/html_node/One-Shell.html
| 归档时间: |
|
| 查看次数: |
90647 次 |
| 最近记录: |