Форум программистов, компьютерный форум, киберфорум
ft4l
Войти
Регистрация
Восстановить пароль
Оценить эту запись

nmake, auto targets в makefile (WDK/DDK)

Запись от ft4l размещена 09.03.2013 в 22:31
Обновил(-а) ft4l 01.10.2014 в 07:02 (просто так)

может-ли nmake (без рекурсии) автоматом обработать все исходники из определённой дирректории...
Обработка построена на проверке существования перечисленных целевых файлов,
их список как-бы должен быть уже сформирован заранее.
Выход нашёлся, в том что nmake позволяет использовать комманды, в условных выражениях предварительной обработки, в итоге вот такое решение получения целей в ходе preprocessing'а
//решение пока в комментарии ,) ...На данный момент уже замечал неаккуратности в коде, но суть как-бы главнее

Как-то в прошлом позволил себе немного собрать обрывки из msdn в более-менее читабельные html-файлы, но в таком-же неухоженном состоянии .)
Прикрепил
Вложения
Тип файла: 7z nmake.7z (32.4 Кб, 92 просмотров)
Размещено в Без категории
Показов 5304 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для ft4l
    Файл 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
    // не знаю всегда-ли действенно отличать WDK от DDK по $(SEPARATE_OBJECT_ROOT)
    и здесь только правила для .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)
    с небольшой разницей , разное OUTDIR и cl в WDK ругается на /Wp64
    , но решил не нагромождеть лишних условий, поэтому два файла,

    собрать все варианты можно например таким 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
    Ну и ещё для полной картины файл \etc\wdk.bat
    Код:
    @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%______________
    в \etc\ddk.bat почти то-же, но
    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 вне форума
    Обновил(-а) ft4l 09.03.2013 в 22:36
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru