我知道这是一个基本问题,但我遗漏了一些关于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文件已经更改,但它们只是读取,因此它会获得权限被拒绝错误。你怎么解决这个问题?
答案 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