GNU-Make:如何将文件从源复制到目标

时间:2017-03-08 01:13:19

标签: gnu-make

我知道这是一个基本问题,但我遗漏了一些关于makefile的基本问题。

采取这个简单的规则/行动:

doc:  ${SRC_DIR}/doc/dir1/file1.pdf  ${SRC_DIR}/doc/dir1/file2.pdf
    cp $? ${DEST_DIR}/doc/ 

我第一次运行它时,会将file1.pdf和file2.pdf复制到destination / doc目录。完善。我希望下次运行它时,它什么都不做。源文件没有改变,它们不是依赖项吗?但是当我跑步时,我得到:

cp:无法创建常规文件.....:权限被拒绝。

所以,2个问题: 1)为什么要再次尝试?当我运行make -d时,我看到它最终说:不需要重新制作目标... / file1.pdf和... / file2.pdf但是然后 它说:必须重新制作目标' doc'
如果它不需要制作pdf文件,为什么需要制作doc?

2)说源文件中的pdf文件已经更改,但它们只是读取,因此它会获得权限被拒绝错误。你怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

制定规则:

target: preqreq0 prereq1...
    command
    ...

表示target如果不存在或者年龄大于需要(重新) 任何先决条件preqreq0 prereq1...target应该是。command ... (重新)通过运行配方doc: ${SRC_DIR}/doc/dir1/file1.pdf ${SRC_DIR}/doc/dir1/file2.pdf cp $? ${DEST_DIR}/doc/

你的规则:

doc

永远不会创建文件或目录doc,因此doc永远不会存在 评估规则(除非您通过其他方式创建doc),因此配方 将永远运行。

我认为您希望SRC_DIR := . DEST_DIR := . PDFS := file1.pdf file2.pdf PDF_TARGS := $(patsubst %,$(DEST_DIR)/doc/%,$(PDFS)) .PHONY: doc clean doc: $(PDF_TARGS) $(DEST_DIR)/doc/%.pdf: $(SRC_DIR)/doc/dir1/%.pdf cp $< $@ clean: rm -f $(PDF_TARGS) 成为的目标是http://jsfiddle.net/a7c20eon/, 但你错了。一个合理的makefile就可以了 是:

make

我建议phony target

关于你的第二个问题,如何覆盖&#34; readonly&#34;文件,与 Collection<User> latestVersions = users.stream() .collect(Collectors.groupingBy(User::getUserId, Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(User::getVersionNumber)), Optional::get))) .values(); 无关。 无论如何,您都无法覆盖您没有写入权限的文件 您尝试这样做的方法。您必须获得任何文件的写入权限 你需要写信给。这是一个系统管理问题。如果你不 了解您可以在姐妹网站The GNU Make documentation找到帮助的文件权限 或Unix & Linux