md5sum在Makefile指令中更改目录后找不到文件

md5sum在Makefile指令中更改目录后找不到文件,makefile,md5sum,Makefile,Md5sum,我在使用makefile生成包含md5sum文件的包时遇到问题 我确实找到了解决办法,但我并不满意 这是我的makefile工作原理的一个示例,它可以用来重现我在file1中遇到的问题,以及我在file2中的解决方法 VERSION:=1 DIR:=tmp file: #rule to build the file with current version tag touch $(DIR)/file-$(VERSION) $(DIR)/

我在使用makefile生成包含md5sum文件的包时遇到问题

我确实找到了解决办法,但我并不满意

这是我的makefile工作原理的一个示例,它可以用来重现我在
file1
中遇到的问题,以及我在
file2
中的解决方法

    VERSION:=1
    DIR:=tmp

    file: #rule to build the file with current version tag
            touch $(DIR)/file-$(VERSION)

    $(DIR)/file1.tar:file #rule that fails to create the md5 file
            cd $(DIR)
            md5sum -b \
                    file-$(VERSION) \
                    >> file-$(VERSION).md5
            tar -cf $@ \
                    file-$(VERSION) \
                    file-$(VERSION).md5
            cd -

    $(DIR)/file2.tar:file #workaround that fails to create the md5 file
            md5sum -b \
                    $(DIR)/file-$(VERSION) \
                    >> $(DIR)/file-$(VERSION).md5
            tar -cf $@ -C $(DIR) \
                    file-$(VERSION) \
                    file-$(VERSION).md5

    file1: $(DIR) $(DIR)/file1.tar

    file2: $(DIR) $(DIR)/file2.tar

    $(DIR):
            mkdir -p $(DIR)
运行
file1
,生成失败,我得到以下输出:

:~/tmp$ make file1
mkdir -p tmp
touch tmp/file-1
cd tmp
md5sum -b \
    file-1 \
    >> file-1.md5
md5sum: file-1: No such file or directory
Makefile:8: recipe for target 'tmp/file1.tar' failed
make: *** [tmp/file1.tar] Error 1
运行
file2
,文件成功生成:

:~/tmp$ make file2
touch tmp/file-1
md5sum -b \
    tmp/file-1 \
    >> tmp/file-1.md5
tar -cf tmp/file2.tar -C tmp \
    file-1 \
    file-1.md5

我的问题是,当
md5sum
工具用作
Makefile
指令时,为什么调用
cd dir
后,它在运行的目录中找不到该文件?或者,我遗漏了什么?

配方中的每一行都由单独的shell调用执行。因此,您的
cd$(DIR)
行由一个shell执行,对另一个shell执行的下一行(
md5sum…
)没有影响。在您的情况下,一个简单的解决方案是链接所有命令,以便make将它们视为一行,并由同一个shell执行:

target: prerequisites
    cd here; \
    do that; \
    ...
或:


配方中的每一行都由单独的shell调用执行。因此,您的
cd$(DIR)
行是由一个shell执行的,对另一个shell执行的下一行(
md5sum…
)没有任何影响。@RenaudPacalet,谢谢。我习惯于看到
cd
cd-
总是在同一行,但从来没有想过这是一个要求。刚刚添加了“;”在每一条指令的末尾,它将被解释为一行,并且它现在正在工作。你能回答这个问题让我接受吗?问题回答了。请注意,根据命令失败时希望发生的情况,还可以使用
&&
|
链接命令。
target: prerequisites
    cd here && \
    do that && \
    ...