Всё время для компиляции и линковки использую универсальный bat-файл в первой строке asm-файла находится строка ; GUI # или ; CONSOLE # или ; DLL # или ; NATIVE # которую компилятор считает комментарием и пропускает, зато bat-файл понимает ЧТО от него требуют EXE (GUI/ CONSOLE) или DLL или SYS и отправляет на нужный фрагмент компиляции и линковки Хорошо! Воспользуюсь советом r90 и Rockphorr ― создаю makefile следующего содержания Код (Text): MASMPATH=\masm64 ML=$(MASMPATH)\bin\ml64 LINK=$(MASMPATH)\bin\link MASM_INC=$(MASMPATH)\Include MASM_LIB=$(MASMPATH)\lib SOURCES=123.asm OBJECTS=$(SOURCES:.asm=.obj) PROJ=$(SOURCES:.asm=.exe) MLFLAGS=/nologo /c /Cp /I $(MASM_INC) LINKFLAGS=/NOLOGO /LIBPATH:$(MASM_LIB) /SUBSYSTEM:WINDOWS /LARGEADDRESSAWARE:NO \ /BASE:0x400000 /STUB:$(MASMPATH)\bin\stubby.exe /entry:WinMain /fixed /nocoffgrpinfo $(PROJ): $(OBJECTS) $(LINK) $(LINKFLAGS) $(OBJECTS) $(OBJECTS): $(SOURCES) $(ML) $(MLFLAGS) $(SOURCES) Вопрос ― как научить nmake и makefile разбирать первую строку в asm-файле? Как передавать в makefile имя asm-файла если не указывать asm-файл в makefile?
Переход с батников на makefile это не просто расширение поменять. В sources указываешь *.asm, так что компилиться будут все asm-файлы в том же каталоге, что и makefile. И в makefile создаешь все возможные таргеты с соответствующими флагами компилира/линкера, а потом просто делаешь make gui или make console или make clean и т.п.
rmn, gui, console, clean это метки внутри makefile? судя по всему для разбора asm-файла можно использовать NMAKE-функции findstring и findstringi?
Да, это цели сборки. Если файла с таким именем нет в каталоге с makefile, то выполняется переход на метку с таким именем и выполнение команд, там перечисленных. Если у таргета указаны зависимости, то сначала выполняются они. Сорцы никто не парсит, чтобы узнать, как их собрать. Это батниковое рукожопство
Это не мое изобретение, FASM поступает именно так format MZИсполняемый файл DOS EXEformat PE consoleИсполняемый файл Win32 EXEformat PE GUIformat PE NATIVEДрайвер режима ядра для Win32format PE GUI 4.0 DLLformat ELFstandard file format for executable files, object code, shared libraries and core dumps. Linux and many UNIX-likeformat ELF64format PE64 GUIИсполняемый файл Win64 EXEformat PE64 consoleformat PE64 NATIVEДрайвер режима ядра для Win64format binaryformat COFF или format MS COFFCommon Object File Format
При таком подходе надо будет make файлы в каждый проект таскать (обычно проекты на ассемблере небольшие и не требуют такого?). А с батником и назначением в винде приложения по умолчанию удобнее получается, по моему.
Но в fasm директива format может быть не на первой строке исходника. Например, он может начинаться так Код (Text): ZERO fix 0 macro pe_format args& { format PE args include 'WIN32AX.INC' section '.idata' import data readable writeable library kernel32, 'kernel32.dll' include 'API\KERNEL32.INC' } pe_format GUI 5.0 AT 0x10000 ON '/dev/null' section '.text' code readable executable entry $ invoke ExitProcess, ZERO
Ну так то фасм, у него эта фича в компиль заложена. Ну да, так и делается. Создаешь один шаблонный файл и копипастишь его в каталог каждого создаваемого проекта. Или ты хотел одним файлом все собирать?
Можно просто сделать специальную структуру проекта. А make файле как уже говорилось выше может собраться любой asm файла по маске *.asm В корневом каталоге проекта создаётся единственный asm файл начала проекта, а все остальное (*.asm) убирается например в папку source Тогда make файлом можно будет собирать любой проект без изменений, но его так и так придётся копировать в директорию проекта. И вот тут можно совместить. Создать bat файл, который проверяет наличие make файла, если его нету копирует make файл в текущую директорию Код (Text): @echo off if not exist Makefile copy C:\путь до make файла\Makefile .\Makefile make
Ну вообще да, иметь какой-нибудь костяк, который в большинстве случаев менять не надо. Идея объединения .bat и make - хорошая идея. 1. Создать батник, который будет вставлять в проект make-файл по-умолчанию 2. В make будет цель, применяющая ко всем .asm файлам уже другой .bat (ну или ml64.exe), для компиляции, тогда и ;CONSOLE ;GUI ;DLL в начале сурсов можно оставить Преимущество над обычным батником, в том, что сразу все .asm .rc скомпилятся и слинкуются
Как сделать nmake.exe makefile 123.asm чтобы передать в makefile имя asm-файла? Код (Text): SOURCES=123.asm
На второй вопрос, благодаря rmn, ответ получил. Можно ли через nmake работать с файлами? Писать в файлы? Читать из файлов? Как научить nmake через makefile копировать содержимое исходного файла в буфер? Как научить nmake и makefile разбирать первую строку в asm-файле?
Парсинг/разбор исходников в задачи nmake не входит все что вы делаете с помощью опций которые зачем-то помещаете в исходники можно сделать поместив все необходимые опции в переменные внутри makefile Идеология nmake проста - есть папка с проектом, в ней находится файл makefile и ваши исходники. По умолчанию все что требуется это сделать папку с проектом где есть makefile текущей и дать команду make - дальше начинается сборка - makefile по сути представляет собой последовательность команд для сборки объединенные иерархически, ничто не мешает вам перенести все ваши костыли которыми вы парсите и собираете исходники в makefile. Профит в том что вы можете в makefile описать несколько сценариев - сборки проекта, удаления всего того что вы собрали, пересборку по изменениям - то есть то что не менялось и не зависит от того что изменилось пересобираться не будет. сделали вы проект и makefile и можете давать команды make - сборка make clear - очистка make run - запуск того что собрали make debug - запуск отладки того что собрали имя файла вы можете также передать таким образом, но это оковы ваших устаревших взглядов --- Сообщение объединено, 27 май 2023 --- напишу на досуге пример makefile
Здравствуйте, Rockphorr! Пожалуйста объясните КАК я могу это сделать? Как научить nmake и makefile разбирать первую строку в asm-файле? Спасибо
А если под Windows использовать for ... (%1) do set ... && exit /b Для Linux тоже самое будет через команду head --lines=1
MaKsIm, я знаю о for. Можете вы привести фрагмент makefile-файла с чтением и выводом на экран первой строки?
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