2017-03-08 114 views
0

我知道这是一个基本问题,但我错过了有关makefile的基本知识。GNU-Make:如何将文件从源文件复制到目标

把这个简单的规则/动作:

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

我第一次运行它,它复制file1.pdf和file2.pdf到目的地/ doc目录。完善。我期待下一次运行它,因为它什么都不做。源文件没有改变,不是它们的依赖吗?但是当我运行时,我得到:

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

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

2)说pdf文件已经在源代码中发生了变化,它们只能读取,所以它会得到权限被拒绝的错误。你如何解决这个问题?

回答

0

一个规则来实现:

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的目标种类是phony target, ,但是你错误地解决了这个问题。为宗旨,合理的makefile将 是:

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 $< [email protected] 


clean: 
    rm -f $(PDF_TARGS) 

我建议The GNU Make documentation

至于你的第二个问题,如何覆盖“只读”的文件,它是无关make。 您无法覆盖您没有写入权限的文件,无论您尝试执行此操作的方式如何,无论是 。您必须获得需要写入的任何文件 的写入权限。这是一个系统管理问题。如果你不明白 文件权限,你会发现在妹妹上门帮助Unix & Linuxserverfault

+0

则可能是您没有权限来写,但你有权更改权限......在这种情况下,你可以在复制之前,使用命令'chmod u + w '为文件写入权限。如果这不起作用,那么正如Mike所说,这是一个系统管理员问题。 – MadScientist

+0

非常感谢你们! –

+0

@ M.E.A欢迎来到Stackoverflow!请参阅[当某人回答我的问题时该怎么办?](http://stackoverflow.com/help/someone-answers) –

相关问题