Универсальный bat-файл

Тема в разделе "WASM.ZEN", создана пользователем Mikl_, 30 апр 2008.

  1. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Навеяно топиком .com файлы
    Действительно, приходится писать под DOS и Windows используя TASM, MASM, WASM (Watcom Assembler), FASM, NASM ― исходный файл с расширением asm, а требуется com,exe,dll,lib да еще могут быть console, gui... Можно ли предельно упростить сборку. а не писать каждый раз новый bat?
    Итак первая строка asm-файла ― нам требуется masm, dos, com
    Код (ASM):
    1. ; masm com dos #
    2. .model tiny
    3. .code
    4. org 100h
    5. start:
    6. . . .
    Вариант первый. Если ASM файлы набираются в FAR'е жмем на F9 →командыасоциации файловF4 "Маска файла""*.asm" "Команда, выполняемая по Enter"→"call asm.bat !" а сам asm.bat копируем в %windir%.
    Вариант второй. Если набор ASM файлов в NotePad, или еще где-то тогда в bat'е переделай все %1 на %~n1 щелкаем по "Мой компьютер""Сервис""Свойства папки""Типы файлов" и связываем файлы асм с батником. Пишем asm.bat следующего содержания
    Код (Text):
    1. cls
    2. set filename=%1
    3. rem получаем имя asm файла без расширения и передаем его в процедуру
    4. call :read_settings %filename%
    5. goto %compiler%%os%%kind_of_file%
    6. rem в зависимости от требуемого ассемблера, ос и типа файла идем
    7. rem на соответствующую ветку
    8. ...
    9. :masmdoscom
    10. if exist %filename%.%kind_of_file% del %filename%.%kind_of_file%
    11. ml /AT %filename%.asm
    12. del %filename%.obj
    13. exit
    14. ...
    15. :read_settings
    16. for /f "eol=# tokens=2-5" %%A in (%filename%.asm) do (
    17. set compiler=%%A
    18. set kind_of_file=%%B
    19. set os=%%C
    20. if %%D == # exit /b)
    21. exit /b
    Процедура read_settings читает первую строку asm-файла и работат с первыми пятью лексемами, разделенными пробелами или табуляцией и сопоставлет их с переменными начиная с %%A, первое поле знак ";" экранирует всю строку
    второе поле ― %%A, третье ― %%B, если пятое поле равно # ― выходим из процедуры. Далее по значениям в переменных compiler, kind_of_file, os обрабатываем asm- файл, как из них делать com,exe,dll,lib для TASM и MASM написано здесь От себя добавлю для NASM
    Код (Text):
    1. set nasm_path=c:\Assemblers\_NASM
    2. if exist %1.exe del %1.exe
    3. %nasm_path%\bin\nasmw -f bin %1.asm -o %1.exe -I%nasm_path%\inc\
    для WASM (здесь указаны наиболее часто используемые dll)
    Код (Text):
    1. set wasm_path=c:\Assemblers\WASM
    2. if exist %1.exe del %1.exe
    3. %wasm_path%\bin\wasm -6prs -mf %1.asm || exit
    4. %wasm_path%\bin\wlink file %1.obj form windows nt op c LIBPath ^
    5. %wasm_path%\lib\ Library user32.lib,kernel32.lib,gdi32.lib,^
    6. comctl32.lib,shell32.lib,ole32.lib,comdlg32.lib option Alignment= 512 || exit
    7. if exist %1.rc (
    8. %wasm_path%\bin\wrc -bt=nt -t %1.rc
    9. del %1.res
    10. )
    11. if exist %1.obj del %1.obj
    для GOASM (console)
    Код (Text):
    1. set goasm_path=c:\Assemblers\GoAsm
    2. %goasm_path%\bin\GoAsm %1.asm
    3. %goasm_path%\bin\GoLink /console %1.obj kernel32.dll
    4. del %1.obj
    для GOASM (gui)
    Код (Text):
    1. set goasm_path=c:\Assemblers\GoAsm
    2. cls
    3. if exist %1.exe del %1.exe
    4. %goasm_path%\bin\GoAsm %1 || exit
    5. if exist %1.rc (
    6. %goasm_path%\bin\GoRc /r %1.rc
    7. %goasm_path%\bin\GoLink %1.obj %1.res user32.dll kernel32.dll gdi32.dll ^
    8. comctl32.dll shell32.dll ole32.dll comdlg32.dll || exit
    9. del %1.res
    10. ) else (
    11. %goasm_path%\bin\GoLink %1.obj user32.dll kernel32.dll gdi32.dll comctl32.dll ^
    12. shell32.dll ole32.dll comdlg32.dll || exit
    13. )
    14. if exist %1.obj del %1.obj
    Более подробно о bat-файлах:
    :)
     
  2. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Бат - это конечно интересно, но зачем работать с лексемами? (извращение?)
    Можно просто создавая проект сделать примерно так:

    Создать директорию ASM_INIT/
    а в ней файлы следующего содержания:
    NASM.bat

    Код (Text):
    1. SET COMPILER=nasm
    2. SET ARGS= аргументы
    3. SET output=выходной файл
    и проверочные скрипты для библиотек и инклудов
    Код (Text):
    1. REM ASM_CHECK_LIBRARY
    2.  
    3. echo checking for %1 ...
    4. команда проверки библиотеки %1
    а уже в проекте примерно следующее
    project.bat
    Код (Text):
    1. SET ProjectName=MyAsmProj
    2. ASM_INIT/NASM
    3. @echo off
    4. echo checking for default compiler...    
    5. echo %COMPILER%
    6. echo checking for output file name...
    7. echo %output
    8. ASM_INIT/ASM_CHECK_LIBRARY libвашуdll.dll
    9.  
    10. %COMPILER% %ProjectName% %args% -o %output
    оооочень сжато, но я думаю идея ясна.
    А вот с парсингом... не знаю, кажется накладным очень.
     
  3. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    device
    Смысл -- компиляция происходит по клику на asm-файле, так же как в FASM'е (правда у меня в нем практически нет опыта, поэтому не пинайте) анализируется строка после директивы format (PE GUI 4.0, PE GUI 4.0 DLL, MZ, ELF), наличие "use16" или "use32". Хотелось просто удобства для пользователя, а уж какими средствами...
     
  4. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Mikl__
    Для тебя лучший способ - использовать M4
     
  5. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    для билда прог на асме я уже давно юзаю такой батничек. написан он был под мои собственные нужды, но, думаю, не составит большого труда дописать необходимые возможности:

    Код (Text):
    1. @echo off
    2. rem PROJECTNAME     - name of .asm file needs to compile
    3. rem MASMPATH        - path to MASM32 directory
    4. rem NEEDMERGE       - if defined linker will join .idata, .data and .rdata sections to .text
    5. rem NEEDPROFILE     - if defined linker will generate *.map file for this project
    6. rem ADDITIONALPARAMS    - additional setting for linking (like /SECTION:.bss,S or /STUB:x:\y.z)
    7.  
    8. SET PROJECTNAME=
    9. SET MASMPATH=C:\MASM32
    10. SET NEEDMERGE=
    11. SET NEEDPROFILE=
    12. SET ADDITIONALPARAMS=
    13.  
    14. if exist %PROJECTNAME%.def SET DLL=0
    15. if defined DLL (SET OUTFILE=%PROJECTNAME%.dll) else (SET OUTFILE=%PROJECTNAME%.exe)
    16.  
    17. echo PROJECT: %OUTFILE%
    18. echo.
    19.  
    20. %MASMPATH%\Bin\Ml.exe /nologo /I%MASMPATH%\INCLUDE /c /coff %PROJECTNAME%.asm
    21. if errorlevel 1 goto errasm
    22.  
    23. if exist %PROJECTNAME%.res (goto resex) else if exist %PROJECTNAME%.rc SET WITHRES=0
    24. if defined WITHRES %MASMPATH%\Bin\rc %PROJECTNAME%.rc
    25.  
    26. :resex
    27. if defined NEEDMERGE SET MERGEOPT=/MERGE:.idata=.text /MERGE:.data=.text /MERGE:.rdata=.text /SECTION:.text,EWR /IGNORE:4078
    28. if defined NEEDPROFILE SET PROFILEOPT=/PROFILE
    29. if defined DLL SET LINKDLL=/DLL /DEF:%PROJECTNAME%.def
    30. if exist %PROJECTNAME%.res SET RESOURCES=%PROJECTNAME%.res
    31. if defined DLL echo [DLL project]
    32. if defined ADDITIONALPARAMS echo [LINK with: %ADDITIONALPARAMS%]
    33. if defined NEEDMERGE echo [All sections merged]
    34. if defined RESOURCES echo [Link with resources]
    35. %MASMPATH%\Bin\Link.exe /nologo /LIBPATH:%MASMPATH%\LIB %LINKDLL% %MERGEOPT% %PROFILEOPT% /SUBSYSTEM:WINDOWS %PROJECTNAME%.obj %RESOURCES% %ADDITIONALPARAMS% /OUT:%OUTFILE%
    36. if errorlevel 1 goto errlink
    37.  
    38. del *.obj
    39. if defined DLL del *.lib
    40. if defined DLL del *.exp
    41. if defined WITHRES del *.res
    42. goto TheEnd
    43.  
    44. :errlink
    45. echo.
    46. echo _____LINK ERROR_____
    47. goto TheEnd
    48.  
    49. :errasm
    50. echo.
    51. echo _____ASSEMBLY ERROR_____
    52. goto TheEnd
    53.  
    54. :TheEnd
    55. pause
     
  6. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Мне интересно, знаком ли ТС c утилитой make?
     
  7. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    r90
    Я ему M4 предлагаю, а там уж Make сам по себе вклинится

    Вообще по-доброму делается так: Пишутся макросы на M4, сохраняются в ACLOCAL.M4
    Потом запускается autoscan
    Редактируется файл configure.scan в соответствии с макросами и проектами
    Файл переименовывается в configure.in
    Создается Makefile.in в соотв. с проектом
    Запускается autoconf
    Запускается ./configure
    ВСЕ!

    Надо откомпилить - make и работайте!!!
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    онанизм какой-то...
    хотите из батника иде сделать? Хотите универсального - юзайте радасм.
    А батнику оставьте батниково: конкретную задачу для конкретного проекта.
     
  9. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    device
    Мне для простых C-шных проектов хватает чего-нибудь в стиле:
    Код (Text):
    1. CFLAGS=-ggdb3 -Wall
    2. CFLAGS+=$(shell pkg-config -cflags <список-зависимостей>)
    3. LDLIBS+=$(shell pkg-config -libs <список-зависимостей>)
    4.  
    5. prog: obj1.o obj2.o obj3.o
    Для более сложных, когда начинают доставать непрописанные зависимости от заголовков, у меня шаблон написан, который все депендансы самостоятельно выясняет.

    Собственно, automake и autoconf я использовал два раза, для финального оформления. Для того, чтобы под разные платформу конфигурировалось.
     
  10. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    странные у вас какието батники... мне вот такого - за глаза (лежит в папке с масмом):

    do.bat
    Код (Text):
    1. @c:\progra~1\masm32\bin\ml /c /coff %1.asm > compile.log
    2. @c:\progra~1\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\progra~1\masm32\lib %1.obj %2.res > linkRes.log
    3. @del %1.obj > nul
    если мне нужно компилить одним кликом, я просто делаю в папке проекта батник с единственной строчкой, напр do project1 prj1data и живу спокойно...
     
  11. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    r90
    А ты под винду попробуй automake и autoconf поюзать - вставляет лучше водки:)
     
  12. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    device
    Нет уж спасибо. Я уже два месяца в себя не могу придти, после того, как не смог нормально пайп в венде организовать (вечно вылезает чёрное окошко консоли). Мне хватило, меня трясти начинает уже при виде флажка ms на клавиатуре.
     
  13. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Интересно, а в винде сокеты создавать можно?

    По теме:
    1.
    2. Утиль Make рулит.
    3. Если проект совсем большой и жуткоживозадозакрученный, то юзаем M4
    Больше ниче не требуется.
    M4 и остальные утили (autoconf, automake, autoscan) под винду есть у меня на компе, откуда скачал не помню.
     
  14. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    DEEP
    Это пока нужен asm под gui с ресурсами подойдет ваш do.bat, который "лежит в папке с масмом", а если нужна console или dll -- по-любому придется создавать do_console.bat или do_dll или do_gui_without_res, а понадобится еще что нибудь кроме masm... и когда батников будет, как тараканов, начинаешь чесать переносицу
     
  15. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Mikl__
    Юзай маке!!!

    configure.in, который проверяет зависимости

    Код (Text):
    1. AC_INIT(configure.in)
    2. AM_INIT_AUTOMAKE(ТВОЙ ПРОЕКТ, 0.1)
    3.  
    4. echo Проверяем что НАСМ есть....
    5. AC_CHECK_TOOLS(NASM,nasm,-1)
    6.  
    7. if  test $NASM = -1;
    8. then
    9. AC_ERROR([NASM в системе не найден.])
    10. fi
    11.  
    12. echo Проверяем что GAS есть....
    13. AC_CHECK_TOOLS(GAS,as,-1)
    14.  
    15. if  test $GAS = -1;
    16. then
    17. AC_ERROR([GNU ASsembler в системе не найден.])
    18. fi
    19.  
    20. echo Проверяем что MASM есть....
    21. AC_CHECK_TOOLS(MASM,nasm,-1)
    22.  
    23. if  test $MASM = -1;
    24. then
    25. AC_ERROR([MASM в системе не найден.])
    26. fi
    27. //---------------------
    28.  
    29. echo Проверяем что линкер ld есть....
    30. AC_CHECK_TOOLS(LD,ld,-1)
    31.  
    32. if  test $LD = -1;
    33. then
    34. AC_ERROR([LD в системе не найден.])
    35. fi
    36.  
    37. echo Проверяем что линкер link.exe есть....
    38. AC_CHECK_TOOLS(LINK,link,-1)
    39.  
    40. if  test $LINK = -1;
    41. then
    42. AC_ERROR([link.exe в системе не найден.])
    43. fi
    44.  
    45. //--------------- ПРИМЕР БИБЛИОТЕКИ ------------
    46.  
    47. echo Проверяем что в библиотеке libвашуdll.dll есть функция hello....
    48.  
    49. AC_CHECK_LIB(вашуdll,hello, , AC_ERROR([Нету такой функции]),)
    50.  
    51. ****
    Дальше сообразишь?

    Makefile.in - тут @VARIABLE@ - это переменная в Configure.in

    Например, @MASM@ выведет masm.exe
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    и вероятно TASM.bat, MASM.bat и на каждый проект свой bat и в случае необходимости каждый project.bat размножается делением, а я предлагал
    причем минимум телодвижений - клик по asm-файлу и, в зависимости от первой закоментированной строки в самом asm-файле, получаем com, dll, exe, drv, sys и т.д и т.п. в NASM, TASM, FASM и т.д. и т.п. насколько позволяет извращенная фантазия
     
  17. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Вот такой универсальный бат получился (см. в аттаче). Может быть у кого-нибудь есть A386 для коллекции?