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

nmake, auto targets в makefile (WDK/DDK)

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

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

Как-то в прошлом позволил себе немного собрать обрывки из msdn в более-менее читабельные html-файлы, но в таком-же неухоженном состоянии .)
Прикрепил
Вложения
Тип файла: 7z nmake.7z (32.4 Кб, 318 просмотров)
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 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 на форуме
 
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru