[英]Can a makefile have a directory as a target?
我想說“只有當目錄 yank/ 存在時,git 存儲庫的下載才有效。如果目錄 yank/ 不存在,則制作它”
yank/gist.el/gist.el : yank
cd yank ; git clone http://github.com/defunkt/gist.el.git
yank:
mkdir yank
我正在使用 makepp - http://makepp.sf.net並且出現錯誤:
[metaperl@andLinux ~/edan/pkg/gist.el] makepp
makepp: Loading makefile `/home/metaperl/edan/pkg/gist.el/Makeppfile'
makepp: Entering directory `/home/metaperl/edan/pkg/gist.el'
mkdir yank
mkdir: cannot create directory `yank': File exists
makepp: error: Failed to build target `/home/metaperl/edan/pkg/gist.el/yank' [1]
makepp: 0 files updated, 0 phony targets built and 1 target failed
[metaperl@andLinux ~/edan/pkg/gist.el]
但是為什么它會嘗試創建 yank 目錄(如果存在)? “源”已經創建...
是的, Makefile
可以有一個目錄作為目標。
你的問題可能是在cd
你想要什么沒有做:它cd
和git clone
在原目錄(一個你進行cd
的編輯,你不是一個cd
教育署)。 這是因為對於Makefile
的每個命令,都會創建一個額外的 shell。 一種解決方法是使用 shell 的&&
將cd
和 clone 作為一個命令運行。
這應該有效:
bla/f: dir
cd dir && touch f
dir:
mkdir dir
您的 makefile 應該符合您的預期。 由於 yank 沒有依賴關系,如果它存在就不會被重新制作。 所以這看起來像是makepp中的一個錯誤。 您可以通過使用傳統的 make 實現嘗試您的 makefile 來確認這一點。
是的,Makefile 可以有一個目錄作為目標。
但是,你不應該。 在目錄中添加或刪除文件時,它的 mtime 會更新。 這會導致依賴於單個目錄的多個目標相互隱式重建,從而導致奇怪的行為。 因此,根據經驗,您應該避免使用目錄作為目標和/或依賴項。
all: d/a d/b
d/a d/b: d
rm -f $@
touch $@
d:
mkdir $@
多次運行的輸出看起來像......
$ make
mkdir d
rm -f d/a
touch d/a
rm -f d/b
touch d/b
$ make
rm -f d/a
touch d/a
$ make
rm -f d/b
touch d/b
$ make
rm -f d/a
touch d/a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.