2014-02-16 33 views
2

我公司目前正在努力編寫建立正確包含一個git子模塊的一個項目一個Makefile。該子模塊具有自己的一組makefile,並且一次生成多個目標,包括一些庫。正確地構建一個git子模塊使用GNU使

這個Makefile應該具有以下屬性。

  • 即使使用並行構建,也不要重建兩次子模塊。
  • 更新子模塊目標時(因爲我通過主版本庫的導航也許 )的子模塊代碼已經改變。
  • 當子模塊庫已更改時,重新鏈接主項目。
  • 請勿將子模塊的Makefiles複製粘貼到頂層項目中(即保持Makefile的遞歸)。

剛剛設置的想法,這裏的東西,似乎工作。

FOO_SUBDIR := $(CURDIR)/foo 
LDFLAGS := -L$(FOO_SUBDIR) 

FOO_LIBSFILES := $(FOO_SUBDIR)/libfoo.a $(FOO_SUBDIR)/libgnufoo.a 
FOO_LDLIBS := -lfoo -lgnufoo 


.PHONY: all 
all: main 

# There are theoretically 3 main binaries 
main: main.c $(FOO_LIBSFILES) 
    gcc -o [email protected] $< $(LDFLAGS) $(FOO_LDLIBS) 

$(FOO_LIBSFILES): libfoo 
    @# Do nothing 

.PHONY: libfoo 
libfoo: 
    $(MAKE) -C $(FOO_SUBDIR) 

它似乎工作sice我添加了空配方,但我不明白爲什麼。

這個想法是總是依靠子模塊的Makefile來重建(或不)libfoo.alibgnufoo.a,並讓主Makefile決定是否需要重建main。沒有空食譜它不起作用。當修改foo/foo.c時,libfoo.a被重建,但make不重建main

我有一種感覺,空方的力量使檢查目標文件的日期。但是我找不到有關此行爲的文檔。

這是正確的路嗎?我應該意識到的任何陷阱?任何不太模糊的方式來做到這一點?或有關此行爲的任何文檔?

在此先感謝。

回答

1

你的解決方案是在一般正確的 - 在你的頂層makefile文件已添加,工程子項目的目標。這是通過自己的makefile與獨立(子)項目合作的唯一正確方法。

你問的具體問題與不終止libfoo的依賴規則做,和GNU make需要一個規則,有命令,哪怕是一個空操作。代之以:

$(FOO_LIBSFILES): libfoo ; 

這實際上是相同的無操作,但更習慣。

+0

非常感謝。所以,你的意思是說這種行爲不是很冒險,應該從長遠來看? – Celelibi

+0

@Celelibi不知道你指的是哪一種行爲,但是引入一個目標來表示一個子項目並不是件怪事。沒有任何操作目標也不算黑客。 – mockinterface

+0

我指的是'$(FOO_LIBSFILES)'的規則不會觸及這些文件。相反,這是它的規則'libfoo'。我強制通過給出一個空食譜來檢查文件日期。 – Celelibi