Есть такие строчки в файле source. Написаны они для того чтобы с помощью значения FOO_MACROS управлять составом компилируемых файлов. Если FOO_MACROS==YES, то компилим foo2.c, если FOO_MACROS=NO, то - foo1.c. !IF "$(FOO_MACROS)" != "YES" !MESSAGE compiling foo1.c SOURCES=foo3.c foo4.c foo5.c foo1.c !ELSE !MESSAGE compiling foo2.c SOURCES=foo3.c foo4.c foo5.c foo2.c !ENDIF В файле source присутсвуют еще настройки, но они на source не влияют (IMHO) Собираю. Смотрю в лог и вижу: BUILD: Examining ыщьу c:\some_directory\src directory tree for files to compile. Compiling c:\some_directory\src\foo directory ******************** 'nmake.exe /c BUILDMSG=Stop. -i NTTEST= UMTEST= NOLINK=1 386=1' compiling foo1.c cl -nologo -Ii386\ -I. -IC:\WINDDK\3790\inc\mfc42 -I.\..\..\build\include -I.\..\..\build\temp -Iobjfre_w2K_x86\i386 -IC:\WINDDK\3790\inc\w2K -IC:\WINDDK\3790\inc\w2K -IC:\WINDDK\3790\inc\ddk\w2K -IC:\WINDDK\3790\inc\ddk\wdm\w2K -IC:\WINDDK\3790\inc\crt -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0500 /DWINVER=0x0500 -D_WIN32_IE=0x0501 -DWIN32_LEAN_AND_MEAN=1 -DDEVL=1 -D__BUILDMACHINE__=WinDDK -DFPO=1 -DNDEBUG -D_DLL=1 /c /Zel /Zp8 /Gy /Gi- /Gm- -cbstring /W3 /WX /Gz /QIfdiv- /G6 /GX- /GR- /GF -Z7 /Oxs /Oy /Fa -FIC:\WINDDK\3790\inc\w2K\warning.h .\foo3.c .\foo4.c .\foo5.c .\foo2.c foo3.c foo4.c foo5.c foo2.c Generating Code... Stop. Почему так произошло? Помогите справится с загадкой build. Макрос SOURCES безусловно является особенным, но о подобной особенности нигде информации я не нашел. даже здесь http://msdn2.microsoft.com/en-us/library/ms792413.aspx
Код (Text): TARGETNAME=drv TARGETTYPE=DRIVER TARGETPATH=bin FOO_MACROS=NO !IF "$(FOO_MACROS)" != "YES" !MESSAGE ___COMPILING foo1.c SRC_ADD=test1.c !ELSE !MESSAGE ___COMPILING foo2.c SRC_ADD=test2.c !ENDIF !MESSAGE $(SRC_ADD) SOURCES=driver.c $(SRC_ADD) !MESSAGE $(SOURCES) везде выводится test1, однако Код (Text): 1>BUILDMSG: Processing f:\projects\test\src\driver 1>___COMPILING foo1.c 1>test1.c 1>drvdump.c test1.c 1>cl -nologo -Ii386\ -I. -IF:\DDK\WinXPSP1\inc\mfc42 -Iobjfre_wxp_x86\i386 -IF:\DDK\WinXPSP1\inc\wxp -IF:\DDK\WinXPSP1\inc\wxp -IF:\DDK\WinXPSP1\inc\ddk\wxp -IF:\DDK\WinXPSP1\inc\ddk\wdm\wxp -IF:\DDK\WinXPSP1\inc\crt -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0501 /DWINVER=0x0501 -D_WIN32_IE=0x0600 -DWIN32_LEAN_AND_MEAN=1 -DDEVL=1 -D__BUILDMACHINE__=WinDDK -DFPO=1 -DNDEBUG -D_DLL=1 /c /Zel /Zp8 /Gy -cbstring /W3 /WX /Gz /QIfdiv- /QIf /G6 /Gi- /Gm- /GX- /GR- /GF -Z7 /Oxs /Oy -FIF:\DDK\WinXPSP1\inc\wxp\warning.h .\drvdump.c .\test2.c 1>drvdump.c 1>test2.c какой-то бред.
С помощью одного файла source решить проблему так и не удалось, но решение есть. Можно сделать две директории, в которые нужно поместить только файлы source и makefile. Эти файлы должны ссылаться на исходники родительской директории. В родительской же директории в зависимости от FOO_MACROS нужно генерировать dirs, указывающий на нужную диреткорию. Через задницу, но работает Спасибо, noName за то что подтвердил существование проблемы, с которой я столкнулся.