我公司目前正在努力編寫建立正確包含一個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.a
和libgnufoo.a
,並讓主Makefile決定是否需要重建main
。沒有空食譜它不起作用。當修改foo/foo.c
時,libfoo.a
被重建,但make
不重建main
。
我有一種感覺,空方的力量使檢查目標文件的日期。但是我找不到有關此行爲的文檔。
這是正確的路嗎?我應該意識到的任何陷阱?任何不太模糊的方式來做到這一點?或有關此行爲的任何文檔?
在此先感謝。
非常感謝。所以,你的意思是說這種行爲不是很冒險,應該從長遠來看? – Celelibi
@Celelibi不知道你指的是哪一種行爲,但是引入一個目標來表示一個子項目並不是件怪事。沒有任何操作目標也不算黑客。 – mockinterface
我指的是'$(FOO_LIBSFILES)'的規則不會觸及這些文件。相反,這是它的規則'libfoo'。我強制通過給出一個空食譜來檢查文件日期。 – Celelibi