2017-02-20 25 views
0

我的Makefile看起來像這樣幾個目標:給具有明顯的依賴,使用相同的規則

MODULES = core models pages admin 
CMXSFILES = $(patsubst %,%.cmxs,$(MODULES)) 

all : $(CMXSFILES) 

core.cmxs : core 
    make -C $< ../[email protected] 

models.cmxs : models core.cmxs 
    make -C $< ../[email protected] 

pages.cmxs : pages core.cmxs models.cmxs 
    make -C $< ../[email protected] 

admin.cmxs : admin core.cmxs models.cmxs 
    make -C $< ../[email protected] 

是否有表達更簡潔的方式最後四個規則的方式,即構建命令是完全相同?

事情是這樣的:

core.cmxs: core 
models.cmxs: models core.cmxs 
pages.cmxs: pages core.cmxs models.cmxs 
admin.cmxs: admin core.cmxs models.cmxs 
    make -C $< ../[email protected] 

回答

1

注意遞歸調用時實現,你不應該使用make。始終使用$(MAKE)(或${MAKE}如果您願意,同樣的事情)。

你可以這樣做:

all: $(CMXFILES) 

$(CMXFILES): 
     $(MAKE) -C $< ../[email protected] 

core.cmxs: core 
models.cmxs: models core.cmxs 
pages.cmxs: pages core.cmxs models.cmxs 
admin.cmxs: admin core.cmxs models.cmxs 

但這裏也有問題。首先,您需要將所有這些目錄聲明爲.PHONY,否則它們可能無法在您期望的情況下生成。此外,如果你正在使用GNU使(你可能在這裏,因爲很多做的版本不設置明確的規則$<),那麼你可以使用模式規則,使事情變得更簡單:

all: $(CMXFILES) 
.PHONY: $(CMXFILES:%.cmxs=%) 

%.cmxs: % 
     $(MAKE) -C $< ../[email protected] 

models.cmxs: core.cmxs 
pages.cmxs: core.cmxs models.cmxs 
admin.cmxs: core.cmxs models.cmxs 
+0

哦不錯,我沒有」我們可以分別指定依賴和規則。除了我不確定將目錄設置爲PHONY,我還是把目錄作爲依賴關係,以便重新編譯模塊,從而使其中的至少一個文件發生更改。無論如何,我會給它一個鏡頭。並感謝$(MAKE)技巧! :-) –

+1

目錄時間戳在文件變化時不會改變:這是一個常見的誤解。當_directory的內容發生變化時,目錄時間戳會發生變化:每當在該目錄中添加,刪除或重命名文件時;但在更新現有文件時不會。可能無論您用什麼過程來更新該目錄中的文件,都會導致目錄更改爲副作用:編輯器會創建臨時文件或其他內容。但是,如果您只是使用'echo hi >> foo'到現有文件'foo',那麼目錄的修改時間不會改變。 – MadScientist

+0

感謝您的澄清。正如你現在已經猜到的那樣,我不習慣Makefile:D強制make使用'$(MAKE)-B -C $ <../[email protected]'遞歸地遍歷目錄是否是好習慣?子目錄的數量相對較少,我不在乎如此小的時間損失,如果它可以讓我每次更換某個文件時都讓我乾淨&& make all' ... –

相關問題