2015-09-04 214 views
0

我想在Windows上使用makefile和nmake構建我的c項目。Makefile循環依賴樹

我收到以下錯誤: NMAKE : fatal error U1071: cycle in dependency tree for target 'src\source.c' Stop.

完整的makefile是這樣

CC = cl 
LINK = link 
CFLAGS = /Ox \ 
/I ext\MulticoreBSP-for-C\ \ 
/I ext\unistd\include \ 
/I ext\pthreads-win32\sources\pthreads-w32-2-9-1-release \ 
/D HAVE_STRUCT_TIMESPEC 

SOURCE_DIR = src 
OBJECT_DIR = build 

LIBS = ext\pthreads-win32\sources\pthreads-w32-2-9-1-release\pthreadVC2.lib 

DLLS = bin\pthreadVC2.dll 
DLLS_SRC = ext\pthreads-win32\sources\pthreads-w32-2-9-1-release\pthreadVC2.dll 

BSP_SOURCES = ext\MulticoreBSP-for-C\mcbsp.c ext\MulticoreBSP-for-C\mcinternal.c ext\MulticoreBSP-for-C\mcutil.c 
USER_SOURCES = source.c 

SOURCES = src\$(USER_SOURCES) $(BSP_SOURCES) 
OBJECTS = $(SOURCES:*.c=build\*.obj) 
# OBJECTS = build\source.obj build\mcbsp.obj build\mcinternal.obj build\mcutil.obj 
EXECUTABLE = bin\BSP.exe 

all: $(EXECUTABLE) $(DLLS) $(OBJECTS) 

$(EXECUTABLE): $(OBJECTS) 
    $(LINK) $(OBJECTS) $(LIBS) /OUT:$(EXECUTABLE) 

$(DLLS): $(DLLS_SRC) 
    copy $** [email protected] 

$(OBJECTS): $(SOURCES) 
    $(CC) $(LDFLAGS) /c /Fo.\$(OBJECT_DIR)\ [email protected] $** $(CFLAGS) 

clean: 
    del $(OBJECT_DIR)\*.obj bin\*.dll bin\*.exe 

我可以看到,這個問題是來自於線21界定OBJECTSOBJECTS = $(SOURCES:*.c=build\*.obj),然後有規則$(OBJECTS): $(SOURCES) 。這是循環的事實是相當清楚的,並且使用第22行中的註釋定義OBJECTS可以正常工作。

如何在沒有第33行規則的情況下自動定義OBJECTS導致麻煩?我需要一個不同的規則,還是其他的?我有單獨的文件夾的源文件和對象,我認爲這阻止了我使用一個簡單的規則,如.c.obj:。至少,我沒有得到它的工作使用這種形式的東西)。

謝謝。

+0

您是否嘗試過打印'SOURCES'和'OBJECTS',以確保它們正確? –

+0

此外,現在*所有*目標文件取決於*所有*源文件。因此,修改單個源文件將導致重新編譯所有源文件。 –

+0

謝謝Joachim。在回顯「OBJECTS」變量後,似乎strsub不起作用,而「OBJECTS」變量與「SOURCES」相同。除非你知道爲什麼它不起作用,否則我必須研究這一點。 – Sam

回答

0

儘管nmake支持模式匹配語法$(macroname:string1=string2),但通配符以這種方式的使用卻不是。如果我在nmake的字符串替換版本中找到使用通配符的方法,我將編輯此答案。

編輯:

及其有點躲閃,但下面解決問題

BSP_SOURCES = mcbsp.c mcinternal.c mcutil.c 
USER_SOURCES = source.c 

SOURCES = src\$(USER_SOURCES) ext\MulticoreBSP-for-C\$(BSP_SOURCES: = ext\MulticoreBSP-for-C\) 
_OBJECTS = build\$(USER_SOURCES) build\$(BSP_SOURCES: = build\) 
OBJECTS = $(_OBJECTS:.c=.obj) 

基本上,模式匹配其間的元素的空間中的源的列表,而不是使用一個通配符。請注意,第一個前綴是在模式匹配之外添加的,因爲列表的開頭沒有空格。還要注意,替代必須分兩步完成。

不雅但有效。