Форум » GUI » HwBuilder » Ответить

HwBuilder

alkresin: Сделал утилиту для сборки программ типа hbmk: http://www.kresin.ru/hwbuilder.html. Поначалу - для HwGUI, а потом увидел, что можно и для других GUI использовать, в том числе для Minigui (проверил - работает), и для консольных программ. Hbmk не устраивал, потому что надо много дополнительных вещей указывать каждый раз для GUI и потому что он не всегда корректно определяет пути к компиляторам (в HwBuider они однозначно прописываются в ini). Собственно, я им и не пользовался, а bat'ники и sh-скрипты надоело писать каждый раз. На сайте - бинарники. Исходники - в комплекте HwGUI (пока на SVN).

Ответов - 28, стр: 1 2 All

SergKis: alkresin пишет Обновил бинарники на сайте, теперь это версия 1.5 Что то не оч. понимаю, как реализовать на hwBuilder схему работы cmd файла из ini проекта, указанного выше CmdComp=_hb_.cmd Его содержимое [pre2] @echo off if %1.==O. goto Obj if not %1.==. goto e rem ------------------- Start compile, link :Start SET BK=\BK19 SET HB=%BK%\HB32 SET VC=%BK%\MSVC SET BIN=%HB%\bin set HB_BK=%BK% set HB_HB=%HB_BK%\hb32 set HB_VC=%HB_BK%\MSVC Call %HB_VC%\vcvar.cmd Call %HB_HB%\hbvar.cmd SET BIN=%BIN%;%VCE% rem -------------------------- Keys for Harbour.exe, cl.exe SET HL=-n -m -es0 -w0 -ql SET CL=/nologo /EHsc /W3 /O2 /DWIN32 /DNDEBUG /D_WINDOWS /D_MBCS rem -------------------------- No modification variable !!! SET O=.\C SET C=.\C SET R=.\RES SET W=.\WRK SET OU=%C% SET ERR=N if NOT exist %W%\_hbSets.cmd ( Echo **************************************** Echo *** File not found %W%\_hbSets.cmd ! Echo **************************************** pause exit ) rem ---------------------- Set variable Enveroment ------------------ Call %W%\_hbSets.cmd if NOT exist %P%.prg ( Echo *************************************** Echo *** File not found %P%.prg ! Echo *************************************** pause exit ) for %%i in ( %P% ) Do ( SET PT=%%~pi SET PP=%%~ni SET EX=%%~xi ) if exist %W%\%PP%.EXE Del %W%\%PP%.EXE > nul if exist %C%\%PP%.obj Del %C%\%PP%.obj > nul rem ------------------ FileName out protokol SET OCMD=_hb_.txt echo %P% > %OCMD% echo %P% echo -------------------------- SET OBJ=%BK%\OBJ SET LIB=%BK%\lib\;%LIB% SET INCLUDE=.\Include;%BK%\MiniGui\Include;%INCLUDE% SET PATH=%BIN%;%PATH% if not exist %C%\*.tmp goto Compile rem --------------------------- Create obj for selected project :ObjCreate for %%d in ( %C%\*.tmp ) Do Call %0 O %%d if %ERR%==Y goto err rem --------------------------- Create Lib for selected project :LibCreate if not exist %C%\*.obj goto Compile if not exist %W%\o_%PP%.txt goto Compile if exist %C%\%PP%.lib Del %C%\%PP%.lib > nul lib.exe /OUT:%C%\%PP%.lib @%W%\o_%PP%.txt > nul rem --------------------------- Create Lib for all project if %LNM%.==. goto Compile if not exist %W%\o_*.txt goto Compile for %%i in ( %LNM% ) Do ( SET LCT=%%~pi SET LNM=%%~ni SET LEX=%%~xi ) if %LCT%.==. goto LibName if not exist %LCT% md %LCT% :LibName if %LCT%.==. SET LCT=%C% if exist %LCT%\%LNM%.lib Del %LCT%\%LNM%.lib > nul for %%d in ( %W%\o_*.txt ) Do lib.exe /OUT:%LCT%\%LNM%.lib @%%d > nul rem --------------------------- Compile Harbour :Compile HARBOUR.EXE %HL% -i%INCLUDE% -o%C%\ %C%\%PP%.prg 2>> %OCMD% if errorlevel 1 SET ERR=Y if %ERR%==Y goto err cl.exe /TC %C%\%PP%.c %CL% /Fp%O%\%PP%.pch /Fo%O%\ /Fd /c >> %OCMD% rem --------------------------- Resource and linker if exist %R%\%PP%.RC ( echo %R%\%PP%.rc >> %OCMD% pushd %R% rem RC.EXE %PP%.RC >> ..\%OCMD% %BK%\BIN\RC\RC.EXE %PP%.RC >> ..\%OCMD% if errorlevel 1 SET ERR=Y popd LINK.EXE /RELEASE @%W%\L_%PP%.TXT %R%\%PP%.RES >> %OCMD% if errorlevel 1 SET ERR=Y ) else ( LINK.EXE /RELEASE @%W%\L_%PP%.TXT >> %OCMD% if errorlevel 1 SET ERR=Y ) :err if %ERR%==Y goto Notepad rem --------------------------- Copy EXE to project if not exist %OU% md %OU% > nul if exist %W%\%PP%.EXE copy %W%\%PP%.EXE %OU%\%NEXE%.exe > nul if exist %W%\%PP%.EXE del %W%\%PP%.EXE > nul goto e rem ---------------------- Start Notepad for error view :Notepad %BK%\BIN\prj.exe /r .\%OCMD% %NINI% %NSEC% * rem Start %NPAD% .\%OCMD% goto e rem ---------------------- Compile obj for lib selected project :Obj if %2.==. goto ObjEnd SET ERO=N for %%i in ( %2 ) Do SET PO=%%~ni for %%i in ( %2 ) Do SET EO=%%~xi if not %EO%==.tmp goto ObjEnd if exist %C%\%PO%.obj del %C%\%PO%.obj > nul HARBOUR.EXE %HL% -i%INCLUDE% -o%C%\ @%C%\%PO%.tmp 2>> %OCMD% if errorlevel 1 SET ERO=Y if %ERO%==Y goto ObjEnd if exist %C%\%PO%.tmp del %C%\%PO%.tmp > nul cl.exe /TC %C%\%PO%.c %CL% /Fp%C%\%PO%.pch /Fo%C%\ /Fd /c >> %OCMD% if errorlevel 1 SET ERO=Y if %ERO%==Y goto ObjEnd :ObjEnd if %ERO%==Y SET ERR=Y goto e :e [/pre2] т.е. моя прогр. ведения проектов (пояснение к содержимому cmd) 0. создает переменные среды _hbSets.cmd для тек. проекта [pre2]SET ERR=N SET NPAD=\BK19\BIN\Notepad2.exe SET NEXE=_ealarm SET NINI=_bk32.ini SET NSEC=01 SET OU=.\INF SET P=.\PRG\_ealarm SET W=.\WRK SET O=.\C SET C=.\C SET R=.\RES [/pre2] 1. создает список prg для сборки, сравнивая дату, время prg и obj (после сборки дату, время от prg ставим obj), компиляция идет по одному prg -> obj, при ошибке процесс прерывается. Список создается созданием файла %C%\%PO%.tmp, где %PO% имя prg\obj для команды for %%d in ( %C%\*.tmp ) Do Call %0 O %%d 2. создает файл со списком всех obj исключая prg\obj, содержащий Main 3. по этому списку создается lib тек. проекта 4. из ini создается файл списка используемых либ + полученная lib тек. проекта 5. в итоге собираем из obj, содержащий Main + lib + res модуль 6. при ошибке -> запуск модуля просмотра протокола с возможностью правки prg

alkresin: > 0. создает переменные среды _hbSets.cmd для тек. проекта Поскольку эти переменные используются дальше в вашей системе сборки, то при использовании hwbuilder в таком виде они не понадобятся. Некоторые из них заменяются аналогами в файле проекта: srcpath - путь к исходникам (его можно указывать несколько раз и после каждого - соответствующую группу файлов), outpath - где поместить результат, outname - имя собранного файла, objpath - путь к obj (там же будут лежать и .c, получившиеся в результате компиляции prg). > 1. создает список prg для сборки, сравнивая дату, время prg и obj (после сборки дату, время от prg ставим obj), компиляция идет по одному prg -> obj, при ошибке процесс прерывается. Список создается созданием файла %C%\%PO%.tmp, где %PO% имя prg\obj для команды for %%d in ( %C%\*.tmp ) Do Call %0 O %%d > 2. создает файл со списком всех obj исключая prg\obj, содержащий Main Все это делает сам hwbuilder, если задан makemode=on, сверяет даты создания prg, c, obj, компилирует только те, что надо. > 3. по этому списку создается lib тек. проекта > 4. из ini создается файл списка используемых либ + полученная lib тек. проекта Не понял, зачем создавать промежуточную lib, почему не собрать exe прямо из obj. Но, если надо, это можно сделать, указав в файле проекта 2 подпроекта (:project). В первом создать lib, во втором - указать эту lib в строке libs=... > 5. в итоге собираем из obj, содержащий Main + lib + res модуль Это то, чем и занимается hwbuilder > 6. при ошибке -> запуск модуля просмотра протокола с возможностью правки prg hwbc, как я писал, просто выводит результат в консоль ( или в файл, если в командной строке указать >result.txt. hwb запускает свой модуль просмотра.

SergKis: alkresin пишет Не понял, зачем создавать промежуточную lib, почему не собрать exe прямо из obj 1. это упрощает сборку проектов под любым компилятором, т.е. все сводится к схеме main.obj+lib+res 2. в большом, связанном проекте (к примеру, допустим, что в представленном выше ini проекты связаны) lib 1-го используется во 2-м, а в 3-м используются обе lib из 1,2 проектов + своя и + имеем 3-и рабочих модуля. Любая из этих lib может использоваться в других проектах (др. ini) hwb запускает свой модуль просмотра. как запустить свой ? В cmd файле выше это строки [pre2]rem ---------------------- Start Notepad for error view :Notepad %BK%\BIN\prj.exe /r .\%OCMD% %NINI% %NSEC% * rem Start %NPAD% .\%OCMD% goto e[/pre2] Но, если надо, это можно сделать, указав в файле проекта 2 подпроекта (:project). В первом создать lib, во втором - указать эту lib в строке libs=... т.е. делаем два запуска последовательно hwb.exe <1.hwprj> <options> if errorlevel 1 goto err hwb.exe <2.hwprj> <options> if errorlevel 1 goto err или как то иначе ?


alkresin: > как запустить свой ? Будет в следующей версии сегодня-завтра. > т.е. делаем два запуска последовательно ... Нет, только один. Эти подпроекты находятся в одном hwprj и выполняются последовательно при одном запуске. Выше объявления подпроекта указываются опции, общие для всех подпроектов. makemode=on objpath=obj :project mylib outpath=... outname=... srcpath=... ... :project myexe libs=... outname=... srcpath=... ...

SergKis: alkresin пишет Нет, только один. Эти подпроекты находятся в одном hwprj и выполняются последовательно при одном запуске. Вот оно как, Михалыч !(с) Из описания на сайте этого не понял. Спасибо за пояснения. А как с обработкой ошибок во время выполнения последовательного процесса ? т.е. ошибки файла проекта hwprj + сборки Как с синтаксисом ? libs= ... ... или libs=... libs=... libs=... или libs=@<file.txt> или libs= @<file.txt> так можно задавать ? Не понял как задать список конкретных obj для сборки lib ? Сейчас есть файл такой [pre2] .\C\letofunc.obj .\C\listfunc.obj .\C\setsdata.obj .\C\tsb_xml2xls.obj [/pre2] т.е. выполнить команду lib.exe /OUT:%C%\%PP%.lib @%W%\o_%PP%.txt > nul libs дополнительные библиотеки, указываются через пробел и без расширений Без расширений это не есть хорошо. Сейчас для сборки в bat файлах идут с расширениями, а это надо править у себя ..., т.к. @<file> для применения все с расширениями obj и lib. Надо бы и так и так задавть\обрабатывать. Сейчас файл такой по содержанию \BK19\OBJ\ErrSysHMG_.obj .\C\_ealarm.obj \BK19\OBJ\MapFile.obj kernel32.lib user32.lib ... legacy_stdio_definitions.lib xhb.lib hbpcre.lib .\C\_ealarm.lib

alkresin: > А как с обработкой ошибок При обнаружении ошибки в файле проекта или в командной строке вызова hwb выдается соответствующее сообщение и сборка прекращается. При ошибке компиляции/сборки процесс не останавливается, все ошибки будут в тексте, который по итогам сборки выдается в окно или на консоль. > Как с синтаксисом ? libs=lib1 lib2 ... или @mylibs.txt а в mylibs.txt - "libs=lib1 lib2 ..." > как задать список конкретных obj для сборки lib target=lib ... .\C\letofunc.obj .\C\listfunc.obj .\C\setsdata.obj .\C\tsb_xml2xls.obj "target=lib" является признаком, по которому hwbuilder будет собирать именно библиотеку, а не exe. Он сам выполнит нужную команду, в зависимости от С компилятора. > Без расширений это не есть хорошо Дело в том, что у разных компиляторов - разные расширения, а один файл проекта может использоваться с разными компиляторами. Юольше того, у mingw, например, ставится lib перед именем библиотеки. > ... kernel32.lib user32.lib Вот эти можно не указывать, системные библиотеки подключаются автоматически, в зависимости от компилятора. В той версии, которая будет сегодня/завтра, появится еще строка в ini def_syslibs=, где можно будет корректировать этот список.

alkresin: Выложил новую версию, 1.6 Появились строчки в ini, секции [VIEW]: ; Прогресс-бар включен progressbar=On ; внешняя программа для просмотра результатов сборки extview= В секции для компилятора добавил строчку def_syslibs=... Там программа автоматом проставит системные библиотеки, подключаемые при сборке - этот список можно отредактировать. Обновлен прогрессбар - вместо стандартного сделал свой, из DRAWN.

SergKis: alkresin пишет libs=lib1 lib2 ... или @mylibs.txt а в mylibs.txt - "libs=lib1 lib2 ..." т.е. libs=@mylibs.txt нельзя и libs=@my.txt где my.txt = "\BK19\OBJ\ErrSysHMG_.obj .\C\_ealarm.obj \BK19\OBJ\MapFile.obj .\C\_ealarm.lib" тоже, ok! Дело в том, что у разных компиляторов - разные расширения, а один файл проекта может использоваться с разными компиляторами Думал обойдусь заменой вызова в cmd файле, т.е. _hb_.cmd такой (хотел подменить вызов не трогая программу) @if exist \BK19\BIN\hb19.cmd Call \BK19\BIN\hb19.cmd %1 %2 %3 %4 %5 %6 %7 %8 но не получится.Остаюсь на своих bat, cmd файлах, править разные версии своих программ ведения проектов (работают программы), от hb 2.0 с bcc55, vc2008,9,2017,2019 и заменить на новое - не реально, да и смысла нет, т.к. сейчас все везде одинаково. Для тек. hmg, мне достаточно, то что есть в поставке. Спасибо за объяснения



полная версия страницы