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

nmake, auto targets в makefile (WDK/DDK)

Запись от ft4l размещена 09.03.2013 в 22:31
Показов 6084 Комментарии 1

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

Как-то в прошлом позволил себе немного собрать обрывки из msdn в более-менее читабельные html-файлы, но в таком-же неухоженном состоянии .)
Прикрепил
Вложения
Тип файла: 7z nmake.7z (32.4 Кб, 297 просмотров)
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для ft4l
    Файл makefile
    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    # 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 пока в таком состоянии
    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    
    !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-файлом
    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    @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
    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    @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%;%x PSDK%\Include;%xPSDK%\Include\crt\sys;%I nclude%
    Запись от ft4l размещена 09.03.2013 в 22:32 ft4l вне форума
 
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru