2015-02-24 34 views
1

我有一個Makefile以下邏輯:編程選擇子的makefile運行make時包括

ifdef INCLUDE_FILE 
$(shell cp $(INCLUDE_FILE) include.make) 
else 
$(shell cp -n default.make include.make) 
endif 

include include.make 

預期的行爲是:

  • 如果一個人只是運行makeinclude.make存在,包括include.make。否則,將默認文件複製到include.make然後包括在內。
  • 如果其中一個運行make INCLUDE_FILE=myinclude.make,則複製幷包含myinclude.make

這似乎很好地工作,以便生成文件自定義(編譯標誌等)在include.make,這將持續存在,如果一個做類似

$make INCLUDE_FILE=myinclude.make 
$... 
$make 

,但也讓新用戶只需鍵入make和請參閱默認行爲。

我的問題是

  • 這是好/標準(GNU)生成文件的做法?
  • 是否存在嚴重的可移植性問題? [也就是說,依靠cp這樣危險嗎?]
  • 有沒有更好的替代方法來實現類似的行爲?

回答

0

你爲什麼不只是使用:

INCLUDE_FILE := $(firstword $(wildcard include.make default.make)) 

include $(INCLUDE_FILE) 

?這將包括include.make(如果存在)或default.make,或者如果在命令行上定義INCLUDE_FILE,它將覆蓋makefile中的設置。

+1

這非常接近我想要的行爲,除了我相信如果我運行'make INCLUDE_FILE = myinclude.make; ... 工作工作工作 ..; make',第二個'make'將包含'default.make'中的命令,而不是'myinclude.make'中的命令。也就是說,我想'include.make'作爲永久配置存在,它(至少天真地)似乎需要一些與文件系統的交互。 – 2015-02-24 15:25:55

1

如果這個意圖是堅持下去的,那麼我認爲這個想法是合理的,儘管我不會這樣實施它。

我可能會這樣做,而不是。

include include.mk 

include.mk: 
     @cp $(or $(INCLUDE_FILE),default.mk) [email protected] 

假設您希望複製只發生一次(除非include.mk被手動刪除)。還有其他一些方法可以完成再次處理複製(如果default.mk發生變化等,但那些需要更多關於您的目標的信息)。

總是通過include.mk複製的最簡單(雖然破解)的方式很可能會在上面的makefile代碼片段中添加如下內容。

ifdef INCLUDE_FILE 
.PHONY: $(INCLUDE_FILE) 

include.mk: $(INCLUDE_FILE) 
endif 

儘管這樣可以多次複製文件。您也可以在$(MAKE_RESTARTS)上添加一個支票以避免這種情況。包括

包括包括。MK

include.mk: 
     cp $(or $(INCLUDE_FILE),default.mk) [email protected] 

ifdef INCLUDE_FILE 
ifndef MAKE_RESTARTS 
.PHONY: $(INCLUDE_FILE) 

include.mk: $(INCLUDE_FILE) 
endif 
endif 

這是稍微濫用正常目標的行爲,當它指定一個.PHONY目標爲前提,但它似乎工作,是的,我認爲,僅僅依靠記錄的行爲。

+0

如果'include.mk'不存在並且如果明確指定了'INCLUDE_FILE',我想要複製發生。具體來說,我想讓'INCLUDE_FILE = myinclude.mk'總是覆蓋'include.mk'。 – 2015-02-24 15:56:17