Был у меня батничек, примерно такого содержания
- Код: Выделить всё
dcc32 project1.dpr
copy project1.exe bin
Использовался он тестером при сборке нового дистрибутива из только что загруженных исходников. И вот решил я его немного облогородить, добавить пару фич...
Преследовал я две цели:
1) Автоинкрементация номера сборки, просто очень хотелось.
2) Чтобы было поуниверсальней ( проектов у нас много ).
Ну и в качестве фич еще сборка справки и документации...
В итоге я пришел к такой схеме: в папку с проектом кидается файл примерно следующего содержания:
- Код: Выделить всё
#[version]
vmajor=1
vminor=0
vrelease=0
vbuild=55
#[project]
name=FSC: Shop Complectation
copyright=2005-2006 asu.gdm
dpr=fsc.dpr
help=help\fsc.hhp
#[options]
gen_doc=no
bin_dir=bin
other_files=fsc.conf
Здесь строки, начинающиеся на # - просто комментарии. Назначение параметров в разделах version и project должно быть понятно, а о разделе options поподробнее:
gen_doc - генерация документации( используется pasdoc )
bindir - папка, в которую поместится готовый дистрибутив
other_files - файлы, необходимые для работы программы, кроме экзешника и справки.
Если какой-то параметр не указан или не имеет смысла, операция, в которой он используется не выполняется.
А далее из командной строки запускается make.bat, который на основе параметров из этого файла делает все что нужно.
Исходники состоят из двух файлов. Их текст:
gdoc.bat
- Код: Выделить всё
@ECHO OFF
REM константы:
SET ADD_DIR="%~dp0\gdoc_files"
SET STYLE_FILE="%ADD_DIR%\pasdoc.css"
SET SOURCES_FILE="underdoc.tmp"
SET DEFINES_FILE="defines.tmp"
SET FOOTER_FILE="footer.html"
SET DOC_DIR="doc"
REM создание списка исходников
DIR *.pas /B > %SOURCES_FILE%
REM создание списка definов
ECHO MSWINDOWS>>%DEFINES_FILE%
ECHO WIN32>>%DEFINES_FILE%
REM создание footer'a
ECHO ^<hr noshade="noshade" size="1"^> >> %FOOTER_FILE%
ECHO copyright(c) 2005-2006 ^<a href="http://kid" target="main"^>asu.gdm^</a^> ^| generated %DATE% >> %FOOTER_FILE%
REM создание папки с будущей документацией
IF EXIST %DOC_DIR% (
REM Если папка уже есть, из нее все удаляется!
DEL %DOC_DIR%\* /Q /S
) ELSE (
MD %DOC_DIR% )
REM Определяем имя проекта
IF {%1}=={} (
SET PROJECT_TITLE=""
) ELSE (
SET PROJECT_TITLE="--title="%1""
)
REM Cоздаем доки
pasdoc --source=%SOURCES_FILE% --output=%DOC_DIR% --staronly ^
--visible-members=private,protected,public,published --use-tipue-search ^
--auto-abstract --language=ru.1251 %PROJECT_TITLE% ^
--conditionals=%DEFINES_FILE% --exclude-generator --auto-link ^
--footer=%FOOTER_FILE% --css=%STYLE_FILE%
REM Чистим мусор
DEL %SOURCES_FILE% %DEFINES_FILE% %FOOTER_FILE% /Q /S
make.bat
- Код: Выделить всё
@ECHO off
REM константы
SET RC_FILE=version.rc
SET HHC_COMP="c:\Program Files\HTML Help Workshop\hhc.exe"
REM имя makefile'лa
IF {%1}=={} (
SET MAKEFILE=makefile.gdm
) ELSE (
SET MAKEFILE=%1
)
REM Если макфайла нет, создаем новый и выходим
IF NOT EXIST %MAKEFILE% (
CALL :CONF_WRITE >%MAKEFILE%
GOTO :EOF
)
REM Процесс компиляции
CALL :CONF_READ && ^
CALL :RC_BUILD > %RC_FILE% && ^
CALL :RES_COMP && ^
CALL :EXE_COMP && ^
CALL :HELP_COMP && ^
CALL :GEN_DOC && ^
CALL :TMP_CLEAN && ^
CALL :BIN_COPY && ^
CALL :CONF_WRITE > %MAKEFILE% && CALL :OK
GOTO :END
REM :::::::::::::::::::::::::::::::::::::::::::::: Functions ::::::::::::::
REM Чтение макфайла
:CONF_READ
FOR /f "eol=# delims== TOKENS=1,2" %%i IN (%MAKEFILE%) DO (
SET %%i=%%j
)
EXIT /b 0
REM Сборка ресурсов
:RC_BUILD
REM Выходим, если не надо
IF "%DPR%"=="" (
EXIT /b 0
)
REM Выводим файл ресурсов
ECHO VS_VERSION_INFO VERSIONINFO
ECHO FILEVERSION %VMAJOR%,%VMINOR%,%VRELEASE%,%VBUILD%
ECHO PRODUCTVERSION %VMAJOR%,%VMINOR%,%VRELEASE%,%VBUILD%
ECHO FILEOS VOS__WINDOWS32
ECHO FILETYPE VFT_APP
ECHO BEGIN
ECHO BLOCK "StringFileInfo"
ECHO BEGIN
ECHO BLOCK "041904b0"
ECHO BEGIN
ECHO VALUE "FileVersion", "%VMAJOR%.%VMINOR%.%VRELEASE%\0"
ECHO VALUE "LegalCopyright", "%COPYRIGHT%\0"
ECHO VALUE "FileDescription", "%NAME%\0"
ECHO VALUE "ProductVersion", "%VMAJOR%.%VMINOR%\0"
ECHO END
ECHO END
ECHO BLOCK "VarFileInfo"
ECHO BEGIN
ECHO VALUE "Translation", 0x419, 1200
ECHO END
ECHO END
EXIT /b 0
REM Компилим ресурс
:RES_COMP
REM Выходим, если не надо
IF "%DPR%"=="" (
DEL %RC_FILE%
EXIT /b 0
) ELSE (
brcc32 %RC_FILE% && DEL %RC_FILE%
EXIT /b 0
)
REM Сборка екзешника
:EXE_COMP
REM Выходим, если не надо
IF "%DPR%"=="" (
EXIT /b 0
)
REM компилим
DCC32 %DPR%
EXIT /b 0
REM Компилирование справки
:HELP_COMP
IF NOT "%HELP%"=="" (
%HHC_COMP% %HELP%
)
EXIT /b 0
REM Создание документации
:GEN_DOC
IF /i "%GEN_DOC%"=="yes" (
gdoc "%NAME% build:%VBUILD%"
IF NOT "%DOC_FILES%"=="" (
FOR %%i in (%DOC_FILES%) DO COPY %%i doc
)
)
EXIT /b 0
REM Очистка
:TMP_CLEAN
REM Удаляем мусор
IF EXIST *.~* DEL /S *.~*
IF EXIST *.ddp DEL /S *.ddp
EXIT /b 0
REM Сборка дистрибутива
:BIN_COPY
IF "%BIN_DIR%"=="" EXIT /b 0
REM создаем папку
IF NOT EXIST %BIN_DIR% MD %BIN_DIR%
REM Копируем откомпиленный файл
IF EXIST *.exe COPY *.exe %BIN_DIR%
REM Копирование справки
IF EXIST *.chm COPY *.chm %BIN_DIR%
IF NOT "%OTHER_FILES%"=="" (
FOR %%i in (%OTHER_FILES%) DO COPY %%i %BIN_DIR%
)
EXIT /b 0
REM Запись настроек
:CONF_WRITE
REM Увеличиваем номер сборки :)
SET /A VBUILD=%VBUILD%+1
REM Пишем
ECHO #[version]
ECHO vmajor=%VMAJOR%
ECHO vminor=%VMINOR%
ECHO vrelease=%VRELEASE%
ECHO vbuild=%VBUILD%
ECHO #[project]
ECHO name=%NAME%
ECHO copyright=%COPYRIGHT%
ECHO dpr=%DPR%
ECHO help=%HELP%
ECHO #[options]
ECHO gen_doc=%GEN_DOC%
ECHO bin_dir=%BIN_DIR%
ECHO other_files=%OTHER_FILES%
ECHO doc_files=%DOC_FILES%
EXIT /b 0
REM Установка в случае если нет ошибок
:OK
SET ISOK=yes
EXIT /b 0
REM Выход, вызывать тока чере goto
:END
IF "%ISOK%"=="yes" (
ECHO Make complete.
) ELSE (
ECHO Make failed.
)
GOTO :EOF
Как видно здесь используется компилятор Delphi, но при желании его можно переделать под fpc, али еще какой.
PS: Оказывается и на bat можно писать более-менее сложные программы. Хотя на чем нибудь более привычном я бы писал побыстрее, но... Большое спасибо статье http://www.rsdn.ru/article/winshell/batanyca.xml. Она меня поддержала в самый трудный момент, когда казалось все было потеряно.
Всем спасибо.