Навеяно топиком .com файлы Действительно, приходится писать под DOS и Windows используя TASM, MASM, WASM (Watcom Assembler), FASM, NASM ― исходный файл с расширением asm, а требуется com,exe,dll,lib да еще могут быть console, gui... Можно ли предельно упростить сборку. а не писать каждый раз новый bat? Итак первая строка asm-файла ― нам требуется masm, dos, com Код (ASM): ; masm com dos # .model tiny .code org 100h start: . . . Вариант первый. Если ASM файлы набираются в FAR'е жмем на F9 →команды→асоциации файлов→F4 "Маска файла"→"*.asm" "Команда, выполняемая по Enter"→"call asm.bat !" а сам asm.bat копируем в %windir%. Вариант второй. Если набор ASM файлов в NotePad, или еще где-то тогда в bat'е переделай все %1 на %~n1 щелкаем по "Мой компьютер"→"Сервис"→"Свойства папки"→"Типы файлов" и связываем файлы асм с батником. Пишем asm.bat следующего содержания Код (Text): cls set filename=%1 rem получаем имя asm файла без расширения и передаем его в процедуру call :read_settings %filename% goto %compiler%%os%%kind_of_file% rem в зависимости от требуемого ассемблера, ос и типа файла идем rem на соответствующую ветку ... :masmdoscom if exist %filename%.%kind_of_file% del %filename%.%kind_of_file% ml /AT %filename%.asm del %filename%.obj exit ... :read_settings for /f "eol=# tokens=2-5" %%A in (%filename%.asm) do ( set compiler=%%A set kind_of_file=%%B set os=%%C if %%D == # exit /b) exit /b Процедура read_settings читает первую строку asm-файла и работат с первыми пятью лексемами, разделенными пробелами или табуляцией и сопоставлет их с переменными начиная с %%A, первое поле знак ";" экранирует всю строку второе поле ― %%A, третье ― %%B, если пятое поле равно # ― выходим из процедуры. Далее по значениям в переменных compiler, kind_of_file, os обрабатываем asm- файл, как из них делать com,exe,dll,lib для TASM и MASM написано здесь От себя добавлю для NASM Код (Text): set nasm_path=c:\Assemblers\_NASM if exist %1.exe del %1.exe %nasm_path%\bin\nasmw -f bin %1.asm -o %1.exe -I%nasm_path%\inc\ для WASM (здесь указаны наиболее часто используемые dll) Код (Text): set wasm_path=c:\Assemblers\WASM if exist %1.exe del %1.exe %wasm_path%\bin\wasm -6prs -mf %1.asm || exit %wasm_path%\bin\wlink file %1.obj form windows nt op c LIBPath ^ %wasm_path%\lib\ Library user32.lib,kernel32.lib,gdi32.lib,^ comctl32.lib,shell32.lib,ole32.lib,comdlg32.lib option Alignment= 512 || exit if exist %1.rc ( %wasm_path%\bin\wrc -bt=nt -t %1.rc del %1.res ) if exist %1.obj del %1.obj для GOASM (console) Код (Text): set goasm_path=c:\Assemblers\GoAsm %goasm_path%\bin\GoAsm %1.asm %goasm_path%\bin\GoLink /console %1.obj kernel32.dll del %1.obj для GOASM (gui) Код (Text): set goasm_path=c:\Assemblers\GoAsm cls if exist %1.exe del %1.exe %goasm_path%\bin\GoAsm %1 || exit if exist %1.rc ( %goasm_path%\bin\GoRc /r %1.rc %goasm_path%\bin\GoLink %1.obj %1.res user32.dll kernel32.dll gdi32.dll ^ comctl32.dll shell32.dll ole32.dll comdlg32.dll || exit del %1.res ) else ( %goasm_path%\bin\GoLink %1.obj user32.dll kernel32.dll gdi32.dll comctl32.dll ^ shell32.dll ole32.dll comdlg32.dll || exit ) if exist %1.obj del %1.obj Более подробно о bat-файлах: Урок bat-аники, Windows Batch Files – Commands Reference., Windows 2000. Команды: Карманный справочник. Э. Фриш. – М.: Мир, 2003, Уильям Р. Станек Командная строка Windows, 2004 %windir%\help\ntcmds.chm
Бат - это конечно интересно, но зачем работать с лексемами? (извращение?) Можно просто создавая проект сделать примерно так: Создать директорию ASM_INIT/ а в ней файлы следующего содержания: NASM.bat Код (Text): SET COMPILER=nasm SET ARGS= аргументы SET output=выходной файл и проверочные скрипты для библиотек и инклудов Код (Text): REM ASM_CHECK_LIBRARY echo checking for %1 ... команда проверки библиотеки %1 а уже в проекте примерно следующее project.bat Код (Text): SET ProjectName=MyAsmProj ASM_INIT/NASM @echo off echo checking for default compiler... echo %COMPILER% echo checking for output file name... echo %output ASM_INIT/ASM_CHECK_LIBRARY libвашуdll.dll %COMPILER% %ProjectName% %args% -o %output оооочень сжато, но я думаю идея ясна. А вот с парсингом... не знаю, кажется накладным очень.
device Смысл -- компиляция происходит по клику на asm-файле, так же как в FASM'е (правда у меня в нем практически нет опыта, поэтому не пинайте) анализируется строка после директивы format (PE GUI 4.0, PE GUI 4.0 DLL, MZ, ELF), наличие "use16" или "use32". Хотелось просто удобства для пользователя, а уж какими средствами...
для билда прог на асме я уже давно юзаю такой батничек. написан он был под мои собственные нужды, но, думаю, не составит большого труда дописать необходимые возможности: Код (Text): @echo off rem PROJECTNAME - name of .asm file needs to compile rem MASMPATH - path to MASM32 directory rem NEEDMERGE - if defined linker will join .idata, .data and .rdata sections to .text rem NEEDPROFILE - if defined linker will generate *.map file for this project rem ADDITIONALPARAMS - additional setting for linking (like /SECTION:.bss,S or /STUB:x:\y.z) SET PROJECTNAME= SET MASMPATH=C:\MASM32 SET NEEDMERGE= SET NEEDPROFILE= SET ADDITIONALPARAMS= if exist %PROJECTNAME%.def SET DLL=0 if defined DLL (SET OUTFILE=%PROJECTNAME%.dll) else (SET OUTFILE=%PROJECTNAME%.exe) echo PROJECT: %OUTFILE% echo. %MASMPATH%\Bin\Ml.exe /nologo /I%MASMPATH%\INCLUDE /c /coff %PROJECTNAME%.asm if errorlevel 1 goto errasm if exist %PROJECTNAME%.res (goto resex) else if exist %PROJECTNAME%.rc SET WITHRES=0 if defined WITHRES %MASMPATH%\Bin\rc %PROJECTNAME%.rc :resex if defined NEEDMERGE SET MERGEOPT=/MERGE:.idata=.text /MERGE:.data=.text /MERGE:.rdata=.text /SECTION:.text,EWR /IGNORE:4078 if defined NEEDPROFILE SET PROFILEOPT=/PROFILE if defined DLL SET LINKDLL=/DLL /DEF:%PROJECTNAME%.def if exist %PROJECTNAME%.res SET RESOURCES=%PROJECTNAME%.res if defined DLL echo [DLL project] if defined ADDITIONALPARAMS echo [LINK with: %ADDITIONALPARAMS%] if defined NEEDMERGE echo [All sections merged] if defined RESOURCES echo [Link with resources] %MASMPATH%\Bin\Link.exe /nologo /LIBPATH:%MASMPATH%\LIB %LINKDLL% %MERGEOPT% %PROFILEOPT% /SUBSYSTEM:WINDOWS %PROJECTNAME%.obj %RESOURCES% %ADDITIONALPARAMS% /OUT:%OUTFILE% if errorlevel 1 goto errlink del *.obj if defined DLL del *.lib if defined DLL del *.exp if defined WITHRES del *.res goto TheEnd :errlink echo. echo _____LINK ERROR_____ goto TheEnd :errasm echo. echo _____ASSEMBLY ERROR_____ goto TheEnd :TheEnd pause
r90 Я ему M4 предлагаю, а там уж Make сам по себе вклинится Вообще по-доброму делается так: Пишутся макросы на M4, сохраняются в ACLOCAL.M4 Потом запускается autoscan Редактируется файл configure.scan в соответствии с макросами и проектами Файл переименовывается в configure.in Создается Makefile.in в соотв. с проектом Запускается autoconf Запускается ./configure ВСЕ! Надо откомпилить - make и работайте!!!
онанизм какой-то... хотите из батника иде сделать? Хотите универсального - юзайте радасм. А батнику оставьте батниково: конкретную задачу для конкретного проекта.
device Мне для простых C-шных проектов хватает чего-нибудь в стиле: Код (Text): CFLAGS=-ggdb3 -Wall CFLAGS+=$(shell pkg-config -cflags <список-зависимостей>) LDLIBS+=$(shell pkg-config -libs <список-зависимостей>) prog: obj1.o obj2.o obj3.o Для более сложных, когда начинают доставать непрописанные зависимости от заголовков, у меня шаблон написан, который все депендансы самостоятельно выясняет. Собственно, automake и autoconf я использовал два раза, для финального оформления. Для того, чтобы под разные платформу конфигурировалось.
странные у вас какието батники... мне вот такого - за глаза (лежит в папке с масмом): do.bat Код (Text): @c:\progra~1\masm32\bin\ml /c /coff %1.asm > compile.log @c:\progra~1\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\progra~1\masm32\lib %1.obj %2.res > linkRes.log @del %1.obj > nul если мне нужно компилить одним кликом, я просто делаю в папке проекта батник с единственной строчкой, напр do project1 prj1data и живу спокойно...
device Нет уж спасибо. Я уже два месяца в себя не могу придти, после того, как не смог нормально пайп в венде организовать (вечно вылезает чёрное окошко консоли). Мне хватило, меня трясти начинает уже при виде флажка ms на клавиатуре.
Интересно, а в винде сокеты создавать можно? По теме: 1. 2. Утиль Make рулит. 3. Если проект совсем большой и жуткоживозадозакрученный, то юзаем M4 Больше ниче не требуется. M4 и остальные утили (autoconf, automake, autoscan) под винду есть у меня на компе, откуда скачал не помню.
DEEP Это пока нужен asm под gui с ресурсами подойдет ваш do.bat, который "лежит в папке с масмом", а если нужна console или dll -- по-любому придется создавать do_console.bat или do_dll или do_gui_without_res, а понадобится еще что нибудь кроме masm... и когда батников будет, как тараканов, начинаешь чесать переносицу
Mikl__ Юзай маке!!! configure.in, который проверяет зависимости Код (Text): AC_INIT(configure.in) AM_INIT_AUTOMAKE(ТВОЙ ПРОЕКТ, 0.1) echo Проверяем что НАСМ есть.... AC_CHECK_TOOLS(NASM,nasm,-1) if test $NASM = -1; then AC_ERROR([NASM в системе не найден.]) fi echo Проверяем что GAS есть.... AC_CHECK_TOOLS(GAS,as,-1) if test $GAS = -1; then AC_ERROR([GNU ASsembler в системе не найден.]) fi echo Проверяем что MASM есть.... AC_CHECK_TOOLS(MASM,nasm,-1) if test $MASM = -1; then AC_ERROR([MASM в системе не найден.]) fi //--------------------- echo Проверяем что линкер ld есть.... AC_CHECK_TOOLS(LD,ld,-1) if test $LD = -1; then AC_ERROR([LD в системе не найден.]) fi echo Проверяем что линкер link.exe есть.... AC_CHECK_TOOLS(LINK,link,-1) if test $LINK = -1; then AC_ERROR([link.exe в системе не найден.]) fi //--------------- ПРИМЕР БИБЛИОТЕКИ ------------ echo Проверяем что в библиотеке libвашуdll.dll есть функция hello.... AC_CHECK_LIB(вашуdll,hello, , AC_ERROR([Нету такой функции]),) **** Дальше сообразишь? Makefile.in - тут @VARIABLE@ - это переменная в Configure.in Например, @MASM@ выведет masm.exe
и вероятно TASM.bat, MASM.bat и на каждый проект свой bat и в случае необходимости каждый project.bat размножается делением, а я предлагал причем минимум телодвижений - клик по asm-файлу и, в зависимости от первой закоментированной строки в самом asm-файле, получаем com, dll, exe, drv, sys и т.д и т.п. в NASM, TASM, FASM и т.д. и т.п. насколько позволяет извращенная фантазия
Вот такой универсальный бат получился (см. в аттаче). Может быть у кого-нибудь есть A386 для коллекции?