bat-файл vs makefile

Discussion in 'WASM.BEGINNERS' started by Mikl___, May 19, 2023.

  1. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    Всё время для компиляции и линковки использую универсальный bat-файл в первой строке asm-файла находится строка ; GUI # или ; CONSOLE # или ; DLL # или ; NATIVE # которую компилятор считает комментарием и пропускает, зато bat-файл понимает ЧТО от него требуют EXE (GUI/ CONSOLE) или DLL или SYS и отправляет на нужный фрагмент компиляции и линковки
    Хорошо! Воспользуюсь советом r90 и Rockphorr ― создаю makefile следующего содержания
    Code (Text):
    1. MASMPATH=\masm64
    2. ML=$(MASMPATH)\bin\ml64
    3. LINK=$(MASMPATH)\bin\link
    4. MASM_INC=$(MASMPATH)\Include
    5. MASM_LIB=$(MASMPATH)\lib
    6. SOURCES=123.asm
    7. OBJECTS=$(SOURCES:.asm=.obj)
    8. PROJ=$(SOURCES:.asm=.exe)
    9. MLFLAGS=/nologo /c /Cp /I $(MASM_INC)
    10. LINKFLAGS=/NOLOGO /LIBPATH:$(MASM_LIB) /SUBSYSTEM:WINDOWS /LARGEADDRESSAWARE:NO \
    11. /BASE:0x400000 /STUB:$(MASMPATH)\bin\stubby.exe /entry:WinMain /fixed /nocoffgrpinfo
    12. $(PROJ): $(OBJECTS)
    13. $(LINK) $(LINKFLAGS) $(OBJECTS)
    14.  
    15. $(OBJECTS): $(SOURCES)
    16. $(ML) $(MLFLAGS) $(SOURCES)
    1. Вопрос ― как научить nmake и makefile разбирать первую строку в asm-файле?
    2. Как передавать в makefile имя asm-файла если не указывать asm-файл в makefile?
     
    mantissa likes this.
  2. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Переход с батников на makefile это не просто расширение поменять. :)

    В sources указываешь *.asm, так что компилиться будут все asm-файлы в том же каталоге, что и makefile. И в makefile создаешь все возможные таргеты с соответствующими флагами компилира/линкера, а потом просто делаешь make gui или make console или make clean и т.п.
     
    Mikl___ likes this.
  3. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    rmn,
    gui, console, clean это метки внутри makefile?
    судя по всему для разбора asm-файла можно использовать NMAKE-функции findstring и findstringi?
     
  4. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Да, это цели сборки. Если файла с таким именем нет в каталоге с makefile, то выполняется переход на метку с таким именем и выполнение команд, там перечисленных. Если у таргета указаны зависимости, то сначала выполняются они.
    Сорцы никто не парсит, чтобы узнать, как их собрать. Это батниковое рукожопство :)
     
    Mikl___ likes this.
  5. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    Это не мое изобретение, FASM поступает именно так
    format MZИсполняемый файл DOS EXE
    format PE consoleИсполняемый файл Win32 EXE
    format PE GUI
    format PE NATIVEДрайвер режима ядра для Win32
    format PE GUI 4.0 DLL
    format ELFstandard file format for executable files, object code, shared libraries and core dumps. Linux and many UNIX-like
    format ELF64
    format PE64 GUIИсполняемый файл Win64 EXE
    format PE64 console
    format PE64 NATIVEДрайвер режима ядра для Win64
    format binary
    format COFF или format MS COFFCommon Object File Format
     
  6. mantissa

    mantissa Мембер Staff Member

    Blog Posts:
    0
    При таком подходе надо будет make файлы в каждый проект таскать (обычно проекты на ассемблере небольшие и не требуют такого?). А с батником и назначением в винде приложения по умолчанию удобнее получается, по моему.
     
    Mikl___ likes this.
  7. MaKsIm

    MaKsIm Active Member

    Blog Posts:
    0
    Но в fasm директива format может быть не на первой строке исходника. Например, он может начинаться так
    Code (Text):
    1. ZERO fix 0
    2. macro pe_format args& { format PE args
    3. include 'WIN32AX.INC'
    4. section '.idata' import data readable writeable
    5. library kernel32, 'kernel32.dll'
    6. include 'API\KERNEL32.INC' }
    7. pe_format GUI 5.0 AT 0x10000 ON '/dev/null'
    8. section '.text' code readable executable
    9. entry $
    10.   invoke ExitProcess, ZERO
     
  8. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Ну так то фасм, у него эта фича в компиль заложена.

    Ну да, так и делается. Создаешь один шаблонный файл и копипастишь его в каталог каждого создаваемого проекта. Или ты хотел одним файлом все собирать? :)
     
  9. MaKsIm

    MaKsIm Active Member

    Blog Posts:
    0
    Можно просто сделать специальную структуру проекта. А make файле как уже говорилось выше может собраться любой asm файла по маске *.asm
    В корневом каталоге проекта создаётся единственный asm файл начала проекта, а все остальное (*.asm) убирается например в папку source
    Тогда make файлом можно будет собирать любой проект без изменений, но его так и так придётся копировать в директорию проекта.

    И вот тут можно совместить. Создать bat файл, который проверяет наличие make файла, если его нету копирует make файл в текущую директорию
    Code (Text):
    1. @echo off
    2. if not exist Makefile copy C:\путь до make файла\Makefile .\Makefile
    3. make
     
    Mikl___ likes this.
  10. mantissa

    mantissa Мембер Staff Member

    Blog Posts:
    0
    Ну вообще да, иметь какой-нибудь костяк, который в большинстве случаев менять не надо. Идея объединения .bat и make - хорошая идея.
    1. Создать батник, который будет вставлять в проект make-файл по-умолчанию
    2. В make будет цель, применяющая ко всем .asm файлам уже другой .bat (ну или ml64.exe), для компиляции, тогда и ;CONSOLE ;GUI ;DLL в начале сурсов можно оставить
    Преимущество над обычным батником, в том, что сразу все .asm .rc скомпилятся и слинкуются
     
    Mikl___ likes this.
  11. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    Как сделать
    nmake.exe makefile 123.asm
    чтобы передать в makefile имя asm-файла?
    Code (Text):
    1. SOURCES=123.asm
     

    Attached Files:

    • 000.mp4
      File size:
      141.4 KB
      Views:
      401
  12. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Code (Text):
    1.  
    2. make target SOURCES=main.asm
    3.  
     
    Mikl___ likes this.
  13. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    nmake /f makefile SOURCES=123.asm
     
  14. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    На второй вопрос, благодаря rmn, ответ получил. :thank_you:
    1. Можно ли через nmake работать с файлами? Писать в файлы? Читать из файлов?
    2. Как научить nmake через makefile копировать содержимое исходного файла в буфер?
    3. Как научить nmake и makefile разбирать первую строку в asm-файле?
     
  15. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Парсинг/разбор исходников в задачи nmake не входит
    все что вы делаете с помощью опций которые зачем-то помещаете в исходники можно сделать поместив все необходимые опции в переменные внутри makefile
    Идеология nmake проста - есть папка с проектом, в ней находится файл makefile и ваши исходники.
    По умолчанию все что требуется это сделать папку с проектом где есть makefile текущей и дать команду make - дальше начинается сборка - makefile по сути представляет собой последовательность команд для сборки объединенные иерархически, ничто не мешает вам перенести все ваши костыли которыми вы парсите и собираете исходники в makefile.
    Профит в том что вы можете в makefile описать несколько сценариев - сборки проекта, удаления всего того что вы собрали, пересборку по изменениям - то есть то что не менялось и не зависит от того что изменилось пересобираться не будет.
    сделали вы проект и makefile и можете давать команды
    make - сборка
    make clear - очистка
    make run - запуск того что собрали
    make debug - запуск отладки того что собрали

    имя файла вы можете также передать таким образом, но это оковы ваших устаревших взглядов
    --- Сообщение объединено, May 27, 2023 ---
    напишу на досуге пример makefile
     
    Last edited: May 27, 2023
  16. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    Здравствуйте, Rockphorr!
    Пожалуйста объясните КАК я могу это сделать? Как научить nmake и makefile разбирать первую строку в asm-файле?
    Спасибо :thank_you:
     
  17. MaKsIm

    MaKsIm Active Member

    Blog Posts:
    0
    А если под Windows использовать for ... (%1) do set ... && exit /b
    Для Linux тоже самое будет через команду head --lines=1
     
    Mikl___ likes this.
  18. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    MaKsIm,
    я знаю о for. Можете вы привести фрагмент makefile-файла с чтением и выводом на экран первой строки?
     
  19. MaKsIm

    MaKsIm Active Member

    Blog Posts:
    0
    • for /l %l in (1,1,1) do @for /f "tokens=* delims=!" %a in ('findstr /n /r "^" temp.asm ^| findstr /r "^%l:"') do @echo %b
    А это не работает. Выводит первую строку файла. Но в cmd не проверял через make
     
  20. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    MaKsIm,
    увы, вместо первой строки файла temp.asm я вижу на экране "%b" :no2: