2017-10-04 106 views
0

每當其他c文件發生更改時,我想重新編譯version.c。所以,我試圖在其他c文件發生變化時觸摸c文件。問題在於,當它正在進行c編譯時,make不能識別這個變化。我認爲原因是它已經更新了所有的依賴關係。有沒有辦法打破連鎖店?makefile - 在重新編譯其他c文件時總是重新編譯version.c

例如:

$(TARGET): $(OBJECTFILES) $(TARGET).a 

$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR) 
    $(if $(filter $(VERSION_BUILD),0),$(shell touch $(PROJECT_ROOT_PFAD)/$(VERSION_FILE))) 

    #When VERSION_FILE then VERSION_BUILD is set to 1 
    $(CC)..... 

所以我想做出立即識別更新的文件。

+0

*爲什麼*你想這樣做? 'version.c'包含什麼? – Beta

+0

關於版本信息 – Chris

回答

1

我希望每當另一個C文件已更改爲version.c重新編譯。

因此,您必須聲明編譯version.c的結果取決於其他C源文件。下面計算C源代碼文件列表並將其分配給一個make變量:

OTHER_C_SOURCES := $(filter-out version.c,$(wildcard *.c)) 

version.c編譯的結果是version.o。你需要的規則是:

version.o: version.c $(OTHER_C_SOURCES) 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

就是這樣。它說:如果version.c或任何其它源文件改變,通過執行重建version.o

$(CC) -c $(CFLAGS) version.c -o version.o 

$<擴展作爲第一先決條件 - version.c - 和[email protected]作爲目標 - version.o)。

注意:您使用的解決方案與正常製作策略相差甚遠。您應該重新考慮所有這些,並將您的Makefile放在經典的target: pre-requisites依賴關係圖上。

+0

是的,我不喜歡我的解決方案。你得到了正確的解決方案。謝謝 – Chris

0

該設備最後添加version.cOBJECTFILES,因爲它取決於訂單。

fileA.c 
version.c 
fileB.c 

如果碰到version.c當它編譯fileA.c然後version.c是重新編譯,但不是在version.c被觸摸時fileB.c編譯因爲version.c是allready檢查。因此,解決辦法是:

fileA.c 
fileB.c 
... 
version.c