2015-09-04 3 views
0

Я пытаюсь построить мой проект c на окнах с помощью makefile и nmake.Цикл 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 

Я вижу, что вопрос идет от определения OBJECTS в строке 21, как OBJECTS = $(SOURCES:*.c=build\*.obj) и затем с правилом $(OBJECTS): $(SOURCES) , Тот факт, что это циклический, достаточно ясен, и использование прокомментированного определения OBJECTS в строке 22 отлично работает.

Как я могу получить автоматическое определение OBJECTS без правила в строке 33, вызывающего проблемы? Нужно ли мне другое правило или что-то еще?

(У меня есть отдельные папки для исходных файлов и объектов, и я думаю, что это мешает мне использовать простое правило вроде .c.obj:. По крайней мере, у меня нет работы, чтобы использовать что-то из этой формы).

Спасибо.

+0

Вы пробовали распечатать 'SOURCES' и' OBJECTS', чтобы убедиться, что они верны? –

+0

Кроме того, прямо сейчас * все * объектные файлы зависят от * all * исходных файлов. Поэтому изменение одного исходного файла приведет к перекомпиляции всех исходных файлов. –

+0

Спасибо, Иоахим. После повторения переменной 'OBJECTS' кажется, что strsub не работает, а переменная' OBJECTS' идентична 'SOURCES'. Мне придется задуматься над этим, если у вас нет идеи, почему он не работает. – Sam

ответ

0

Хотя синтаксис соответствия шаблону $(macroname:string1=string2) поддерживается nmake, использование подстановочных знаков таким образом - нет. Я отредактирую этот ответ, если найду способ использовать подстановочные знаки в версии замены строки nmake.

Edit:

Его немного хитроумный, но следующий решает проблему

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) 

В принципе, шаблон согласования пространства Inbetween элементов в списке источников, а не использовать подстановочные. Обратите внимание, что первый префикс добавляется за пределы соответствия шаблону, потому что в начале списка нет места. Также обратите внимание, что замена должна была быть выполнена в два этапа.

Неэлегантно, но эффективно.

Смежные вопросы