我有一种非常舒适的方式来通过几行bash命令编译我的项目.但现在我需要通过makefile编译它.考虑到每个命令都在自己的shell中运行,我的问题是在makefile中运行多行bash命令的最佳方法是什么,相互依赖? 例如,像这样:
for i in `find`
do
    all="$all $i"
done
gcc $all
另外,有人可以解释为什么即使单行命令bash -c 'a=3; echo $a > file'在终端中工作正常,但在makefile情况下创建空文件?
Eld*_*mov 116
我会使用反斜杠换行符:
foo:
    for i in `find`;     \
    do                   \
        all="$$all $$i"; \
    done;                \
    gcc $$all
或者,如果只想将返回的整个列表传递find给gcc:
foo:
    gcc `find`
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 ;\
    }
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 $@
但是有一个缺点:特殊前缀字符('@'、'-' 和 '+')的解释不同。
https://www.gnu.org/software/make/manual/html_node/One-Shell.html