Событие Delphi перед сборкой, не выполняющееся ПЕРЕД компиляцией

Я занят, автоматизируя наши сборки для включения svn числа пересмотра. Мы используем Delphi 2010. Я добавил событие перед сборкой, назвав пакетный файл, который вводит svn число пересмотра (чтение из файла записей в .svn каталоге) и указанный номер версии в aVersionInfo.rc, который компилируется с моим проектом. Событие перед сборкой похоже на это:

call SetVersionInfo.bat 6 5 4

... и пакетный файл (надеются, что кто-то находит это полезным)...

@ECHO OFF
SETLOCAL
setLocal EnableDelayedExpansion

SET _myVar=0
FOR /F %%G in (.svn\entries.) DO (
IF !_myVar! LSS 3 SET /A _myVar+=1 & SET _svn_dir_rev=%%G
)

ECHO 1 VERSIONINFO > aVersionInfo.rc
ECHO. FILEVERSION %1,%2,%3,%_svn_dir_rev%   >> aVersionInfo.rc
ECHO. PRODUCTVERSION 1   >> aVersionInfo.rc
ECHO. FILEOS VOS__WINDOWS32   >> aVersionInfo.rc
ECHO. FILETYPE VFT_APP   >> aVersionInfo.rc
ECHO. BEGIN   >> aVersionInfo.rc
ECHO.   BLOCK "StringFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     BLOCK "080904b0"   >> aVersionInfo.rc
ECHO.     BEGIN   >> aVersionInfo.rc
ECHO.       VALUE "CompanyName","COMPANY\000"   >> aVersionInfo.rc
ECHO.       VALUE "FileDescription","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "FileVersion","%1.%2.%3.%_svn_dir_rev%\000"   >> aVersionInfo.rc
ECHO.       VALUE "InternalName","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "LegalCopyright","Copyright APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "LegalTrademarks","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "OriginalFilename","APP.exe\000"   >> aVersionInfo.rc
ECHO.       VALUE "ProductName","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "ProductVersion,"1\000"   >> aVersionInfo.rc
ECHO.       VALUE "Comments","Compiled on %date% by %username%\000"   >> aVersionInfo.rc
ECHO.     END   >> aVersionInfo.rc
ECHO.   END   >> aVersionInfo.rc
ECHO.   BLOCK "VarFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     VALUE "Translation", 0x0809 1200   >> aVersionInfo.rc
ECHO.   END   >> aVersionInfo.rc
ECHO. END   >> aVersionInfo.rc
ENDLOCAL

Пакетный файл действительно выполняется, поскольку часть компиляции, aVersionInfo.rc обновляется, aVersionInfo.res перекомпилирован, но по некоторым причинам новый res файл не используется для компиляции exe. Это, однако, обновляется во время чистой сборки или если я компилирую во второй раз. Кажется, что проверка на изменения в емкостно-резистивных файлах происходит, перед "пред" - события сборки называют. Который на самом деле делает это серединой события сборки. Или я пропускаю что-то?

Я действительно пытался удалить aVersionInfo.res файл как другое событие перед сборкой, но тогда компилятор жалуется, что этот файл отсутствует. Могло случиться так что

{$R 'aVersionInfo.res' 'aVersionInfo.rc'}

строка находится в неправильном месте?

12
задан Jaco Briers 18 January 2010 в 16:12
поделиться

4 ответа

  1. При использовании epoll требуется изменить общий размер потока до количества физических ядер CPU (или гипертрезовых блоков диспетчеризации), которые необходимо использовать для обработки. Использование только одного потока для работы означает, что одновременно будет активно не более одного ядра.

  2. Это зависит от режима дескриптора файла epoll. События могут быть «edge triggered», что означает, что они происходят только один раз атомарно, или «level triggered» означает, что любой вызывающий абонент получает событие, если в буфере есть место.

  3. Недостаточно информации, чтобы сказать. Я бы предложил вообще не иметь специальных потоков, для простоты, и просто обрабатывать «команду» каждого события в потоке, в котором оно получено. Но очевидно, что это зависит от характера вашей заявки.

-121--3367069-

Вы можете использовать gcov для построчного подсчета выполнения. Это должно, по крайней мере, указывать, какие встроенные функции являются узким местом.

-121--1687209-

Попробуйте использовать

{$R aVersionInfo.res}

и вызвать brcc32 aVersionInfo.rc вручную из пакетного файла (после завершения создания файла .rc). Таким образом, файл .res должен быть исключен из обычной сборки IDE.

9
ответ дан 2 December 2019 в 22:22
поделиться

Возможно, отсутствует ["]
ECHO. VALUE" ProductName "," APP \ 000 ">> aVersionInfo.rc
ECHO. VALUE" ProductVersion, "1 \ 000" >> aVersionInfo.rc
------- ЗДЕСЬ ------- ---------------- ^
ЭХО. VALUE "Комментарии", "Скомпилировано% date%% username% \ 000" >> aVersionInfo.rc Пока

1
ответ дан 2 December 2019 в 22:22
поделиться

Добавьте строку в свой пакетный файл, который изменяет исходный файл Delphi, который включает в себя ресурс:

touch VersionInfo.pas

, то исходный файл должен быть перекомпилирован. Если исходный файл не изменен, то для компилятора нет причин для перезарядки этой части программы, и поэтому обновленный файл ресурсов не будет замечен.

0
ответ дан 2 December 2019 в 22:22
поделиться

Вы можете позвонить BRCC32 внутри пакетного файла, чтобы он всегда будет обновлять файл .res. Я делаю что-то подобное, и это работает в компиляции, а также в сборке.

0
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: