bat-файл vs makefile

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 19 май 2023.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Всё время для компиляции и линковки использую универсальный bat-файл в первой строке asm-файла находится строка ; GUI # или ; CONSOLE # или ; DLL # или ; NATIVE # которую компилятор считает комментарием и пропускает, зато bat-файл понимает ЧТО от него требуют EXE (GUI/ CONSOLE) или DLL или SYS и отправляет на нужный фрагмент компиляции и линковки
    Хорошо! Воспользуюсь советом r90 и Rockphorr ― создаю makefile следующего содержания
    Код (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 нравится это.
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Переход с батников на makefile это не просто расширение поменять. :)

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

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    rmn,
    gui, console, clean это метки внутри makefile?
    судя по всему для разбора asm-файла можно использовать NMAKE-функции findstring и findstringi?
     
  4. rmn

    rmn Well-Known Member

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

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Это не мое изобретение, 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 Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    138
    При таком подходе надо будет make файлы в каждый проект таскать (обычно проекты на ассемблере небольшие и не требуют такого?). А с батником и назначением в винде приложения по умолчанию удобнее получается, по моему.
     
    Mikl___ нравится это.
  7. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    66
    Но в fasm директива format может быть не на первой строке исходника. Например, он может начинаться так
    Код (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

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Ну так то фасм, у него эта фича в компиль заложена.

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

    MaKsIm Member

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

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

    mantissa Мембер Команда форума

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

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Как сделать
    nmake.exe makefile 123.asm
    чтобы передать в makefile имя asm-файла?
    Код (Text):
    1. SOURCES=123.asm
     

    Вложения:

    • 000.mp4
      Размер файла:
      141,4 КБ
      Просмотров:
      297
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Код (Text):
    1.  
    2. make target SOURCES=main.asm
    3.  
     
    Mikl___ нравится это.
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    nmake /f makefile SOURCES=123.asm
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

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

    Rockphorr Well-Known Member

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

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

    Mikl___ Супермодератор Команда форума

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

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    66
    А если под Windows использовать for ... (%1) do set ... && exit /b
    Для Linux тоже самое будет через команду head --lines=1
     
    Mikl___ нравится это.
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    MaKsIm,
    я знаю о for. Можете вы привести фрагмент makefile-файла с чтением и выводом на экран первой строки?
     
  19. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    66
    • 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___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    MaKsIm,
    увы, вместо первой строки файла temp.asm я вижу на экране "%b" :no2: