nmake, auto targets в makefile (WDK/DDK)
может-ли nmake (без рекурсии) автоматом обработать все исходники из определённой дирректории... Обработка построена на проверке существования перечисленных целевых файлов, их список как-бы должен быть уже сформирован заранее. Выход нашёлся, в том что nmake позволяет использовать комманды, в условных выражениях предварительной обработки, в итоге вот такое решение получения целей в ходе preprocessing'а //решение пока в комментарии ,) ...На данный момент уже замечал неаккуратности в коде, но суть как-бы главнее ![]() Как-то в прошлом позволил себе немного собрать обрывки из msdn в более-менее читабельные html-файлы, но в таком-же неухоженном состоянии .) Прикрепил |
Всего комментариев 1
Комментарии
-
Файл makefile
Код:# comment this to see commands .SILENT: # PR_TYPE is APPC | APPW | DLL | SO | LIB # APPW or APPC for $(PR_NAME).exe PR_NAME = NAME PR_TYPE = APPW VERSION = 1.0.0.1 SRC_DIR = .\src OBJ_DIR = obj # Settings !IF "$(SEPARATE_OBJECT_ROOT)" != "" ! INCLUDE "wdk.inc.mak" OBJ_DIR = $(OUTDIR)\$(OBJ_DIR) !ELSE ! INCLUDE "ddk.inc.mak" OBJ_DIR = $(OUTDIR)\$(OBJ_DIR) !ENDIF # adding TRGS.TXT !if ![>TRGS.TXT cmd /Q /V:on /C "for %A in \ ($(SRC_DIR)\*.asm;$(SRC_DIR)\*.c;$(SRC_DIR)\*.cpp;$(SRC_DIR)\*.rc) \ do set x=%A& set x=!x:.rc=.res!& set x=!x:.c=.obj!& \ echo !x:$(SRC_DIR)=$(OBJ_DIR)! \"] TRGS = \ !include TRGS.TXT #!MESSAGE TRGS is $(TRGS) #!MESSAGE !endif #_____________ targets ___________________ default: $(OBJ_DIR) $(TRGS) $(OUTFILE) {$(SRC_DIR)\}.rc{$(OBJ_DIR)\}.res: $(RC) $(RFLAGS) /Fo$@ /r $< {$(SRC_DIR)\}.c{$(OBJ_DIR)\}.obj: $(CC) $(CFLAGS) /Fo$@ $< #/Fa$(OUTDIR)\$(*B).asm $(OBJ_DIR): @if not exist "$(OUTDIR)/$(NULL)" mkdir $(OUTDIR) @if not exist "$@/$(NULL)" mkdir $@ # @if not exist "$(OUTDIR)/xxxxx.ini" copy "xxxxx.ini" "$(OUTDIR)/xxxxx.ini" @echo. @echo. Compiling $(TRGS): $(OUTFILE): @echo. linking: $(OUTFILE) $(LD) $(LDFLAGS) $(TRGS) $(WINLIBS) # $(WINLIBS) or $(BASELIBS) only # $(AR) $(ARFLAGS) $(TRGS) $(WINLIBS) clean: @if exist $(OBJ_DIR) @RD $(OBJ_DIR) /S /Q cleanf: @if exist $(OUTDIR) RD $(OUTDIR) /S /Q
и здесь только правила для .c и .rc файлов, .asm и .cpp не так сложно добавить
файлы wdk.inc.mak и ddk.inc.mak пока в таком состоянии
Код:!IF "$(_NMAKE_VER)" == "" ! MESSAGE Sorry, only for nmake.exe from Microsoft, version >= 1.62 ! MESSAGE ! ERROR Unsupported 'make' programm !ENDIF !IF "$(TRG)" == "" ! IF "$(PATH)" != "$(PATH:amd64=)" TRG = amd64 ! ELSE TRG = i386 ! ENDIF ! MESSAGE No target architecture specified. Added TRG=$(TRG). ! MESSAGE !ELSEIF "$(TRG)" != "i386" && "$(TRG)" != "amd64" ! MESSAGE Sorry, in this makefile TRG is only "amd64" or "i386" ! MESSAGE Sample: ! MESSAGE ! MESSAGE NMAKE TRG=$(TRG) ! MESSAGE ! ERROR An invalid configuration is specified. !ENDIF #$(AFLAGS) $*.asm !IF "$(TRG)" == "amd64" AS = ml64 !ELSE AS = ml !ENDIF CC = cl LD = link RC = rc AR = lib CVTRES = CVTRES OUTDIR = Release.wdk_$(TRG) !IFDEF UNICODE UNIDEFS = -D_UNICODE -DUNICODE OUTDIR = $(OUTDIR).U !ENDIF !IF "$(PR_TYPE)" == "APPC" OUTFILE = $(OUTDIR)\$(PR_NAME).exe LDFLAGS = /OUT:$(OUTFILE) /SUBSYSTEM:CONSOLE,5.02 !ELSEIF "$(PR_TYPE)" == "DLL" || "$(PR_TYPE)" == "SO" OUTFILE = $(OUTDIR)\$(PR_NAME).$(PR_TYPE) LDFLAGS = /DLL /OUT:$(OUTFILE) /IMPLIB:$(OUTDIR)\$(PR_NAME).lib /SUBSYSTEM:WINDOWS,5.02 !ELSEIF "$(PR_TYPE)" == "LIB" OUTFILE = $(OUTDIR)\$(PR_NAME).lib ARFLAGS = /OUT:$(OUTFILE) /NOLOGO /SUBSYSTEM:WINDOWS,5.02 !ELSE # default "$(PR_TYPE)" == "APPW" OUTFILE = $(OUTDIR)\$(PR_NAME).exe LDFLAGS = /OUT:$(OUTFILE) /SUBSYSTEM:WINDOWS,5.02 !ENDIF LDFLAGS = $(LDFLAGS) /NOLOGO /INCREMENTAL:NO /OPT:REF # /SUBSYSTEM:CONSOLE,5.02 /WX #/DYNAMICBASE /NXCOMPAT /MERGE:.rdata=.text /LTCG WINSOCKLIBS = ws2_32.lib mswsock.lib BASELIBS = kernel32.lib $(WINSOCKLIBS) advapi32.lib bufferoverflowu.lib WINLIBS = $(BASELIBS) user32.lib shell32.lib gdi32.lib comdlg32.lib winspool.lib # for OLE applications OLELIBS = ole32.lib uuid.lib oleaut32.lib $(WINLIBS) #cflags = $(ccommon) -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 /FIPRE64PRA.H #cflags = $(cflags) -Wp64 -W4 DEFS = -D_WINDOWS -Ox -DNDEBUG -DWIN32 -D_WIN32 -D_WIN32_WINNT=0x0502 \ -DWINVER=0x0502 -D_WIN32_IE=0x0600 -DNULL=0 # /MP /MP -Zp1 = pack(1) /EHsc /Z /Og # -D_X86=1 /Os /GA /Gs0 ASMFLAGS = /c /coff /Zm /nologo /W3 CFLAGS = -c /TC -MD -nologo -W3 CPPFLAGS = -c /TP -MD -nologo -W3 !IF "$(TRG)" == "amd64" DEFS = $(DEFS) -D_WIN64 -D_AMD64_ # _M_AMD64 XFLAGS = /GS- /Zp8 ASMFLAGS = $(ASMFLAGS) /Zp8 LDFLAGS = /MACHINE:AMD64 $(LDFLAGS) ARFLAGS = /MACHINE:AMD64 $(ARFLAGS) RFLAGS = /d "_WIN64" !ELSE DEFS = $(DEFS) -D_X86_ # -D_X86=1 XFLAGS = /Zp4 ASMFLAGS = $(ASMFLAGS) /Zp4 LDFLAGS = /MACHINE:X86 $(LDFLAGS) ARFLAGS = /MACHINE:X86 $(ARFLAGS) RFLAGS = /d "WIN32" !ENDIF #/d "BOOKMARK_EDITION" /l 0x0409 RFLAGS = $(RFLAGS) $(UNIDEFS) CFLAGS = $(CFLAGS) $(XFLAGS) $(DEFS) $(UNIDEFS) CPPFLAGS= $(CPPFLAGS) $(XFLAGS) $(DEFS) $(UNIDEFS)
, но решил не нагромождеть лишних условий, поэтому два файла,
собрать все варианты можно например таким bat-файлом
Код:@echo off setlocal>nul call \etc\ddk nmake /C -nologo cleanf nmake /C -nologo nmake /C -nologo clean nmake /C -nologo UNICODE=1 cleanf nmake /C -nologo UNICODE=1 nmake /C -nologo UNICODE=1 clean endlocal>nul setlocal>nul call \etc\ddk 64 nmake /C -nologo cleanf nmake /C -nologo nmake /C -nologo clean nmake /C -nologo UNICODE=1 cleanf nmake /C -nologo UNICODE=1 nmake /C -nologo UNICODE=1 clean endlocal>nul :: goto NNN setlocal>nul call \etc\wdk nmake /C -nologo cleanf nmake /C -nologo nmake /C -nologo clean nmake /C -nologo UNICODE=1 cleanf nmake /C -nologo UNICODE=1 nmake /C -nologo UNICODE=1 clean endlocal>nul setlocal>nul call \etc\wdk 64 nmake /C -nologo cleanf nmake /C -nologo nmake /C -nologo clean nmake /C -nologo UNICODE=1 cleanf nmake /C -nologo UNICODE=1 nmake /C -nologo UNICODE=1 clean endlocal>nul :NNN echo. pause
Код:@echo off set xWDK=%~d0\C\32_WDK set xPSDK=%~d0\C\32xPSDK_2003r2 set CurPath=%cd% if "%~1" == "64" ( :: call %xPSDK%\setenv.cmd /XP64 /RETAIL call %xWDK%\bin\setenv.bat %xWDK% fre x32-64 wnet no_oacr set TRG=amd64 set xPSDK_LIB=%xPSDK%\Lib\AMD64 cd /d %CurPath% ) else ( :: call %xPSDK%\setenv.cmd /SRV32 /RETAIL call %xWDK%\bin\setenv.bat %xWDK% fre WXP no_oacr set TRG=i386 set xPSDK_LIB=%xPSDK%\Lib cd /d %CurPath% ) set DDK_LIB_PATH=%DDK_LIB_PATH:~0,-1%%TRG% set CRT_LIB_PATH=%CRT_LIB_PATH:~0,-1%%TRG% :: ;%xPSDK%\Lib\AMD64\atlmfc :: ;%xPSDK%\Include\crt;%xPSDK%\Include\mfc;%xPSDK%\Include\atl :: set Path=%path%;%xPSDK%\Bin set Lib=%CRT_LIB_PATH%;%DDK_LIB_PATH%;%xPSDK_LIB% set Include=%CRT_INC_PATH%;%SDK_INC_PATH%;%DDK_INC_PATH%;%xPSDK%\Include;%xPSDK%\Include\crt\sys;%Include% title WDK %TRG% %DDK_TARGET_OS% target echo._____________WDK %TRG% %DDK_TARGET_OS%______________
set xDDK=%~d0\C\32_DDK
и
call %xDDK%\bin\setenv.bat %xDDK% FREE WNet AMD64
call %xDDK%\bin\setenv.bat %xDDK% FREE WNet
и просто
set Include=%CRT_INC_PATH%;%DDK_INC_PATH%;%xPSDK%\Incl ude;%xPSDK%\Include\crt\sys;%Include%Запись от ft4l размещена 09.03.2013 в 22:32
Обновил(-а) ft4l 09.03.2013 в 22:36