簡體   English   中英

makefile 可以有一個目錄作為目標嗎?

[英]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你想要什么沒有做:它cdgit clone在原目錄(一個你進行cd的編輯,你不是一個cd教育署)。 這是因為對於Makefile的每個命令,都會創建一個額外的 shell。 一種解決方法是使用 shell 的&&cd和 clone 作為一個命令運行。

這應該有效:

bla/f: dir
    cd dir && touch f

dir:
    mkdir dir

在 makefile 中,目錄名稱是虛假目標還是“真實”目標?

您需要的是 僅限訂單的先決條件

快速搜索沒有找到任何關於 makepp 和 order-only 先決條件的參考,但它可能仍然有效。

您的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM