在Makefile指令中更改dir后,md5sum无法找到文件

时间:2018-03-26 14:25:44

标签: 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)/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工具在用作cd dir指令时,在调用Makefile之后无法在同一目录中找到该文件?或者,我错过了什么?

1 个答案:

答案 0 :(得分:2)

配方中的每一行都由单独的shell调用执行。所以你的rows = sum(dat==10)+(dat(end)~=10); reshape(result,[],rows)' 行是由shell执行的,并且对另一个shell执行的下一行(cd $(DIR))没有影响。在您的情况下,一个简单的解决方案包括链接所有命令,使得它们被make视为一行,并由同一个shell执行:

md5sum...

或:

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