2017-03-08 134 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) –

相關問題