Хочется чтобы... 1. Был макрос с версией билда, доступный внутри исходников. Например: Код (Text): #define VERSION_MAJOR 1 #define VERSION_MINOR 10 #define VERSION_RELEASE 23 #define VERSION_BUILDNUMBER 4342 #define VERSION_DOTTED ##VERSION_MAJOR "." ##VERSION_MINOR "." ##VERSION_RELEASE "." ##VERSION_BUILDNUMBER 2. В ресурсах .exe и .dll была прописана версия. Та самая версия, которая в проводнике по правой кнопке в свойствах файла будет. 3. Хочется чтобы версия билда контролировалась из одного места и чтобы при Главной Сборке она автоматом инкрементировалась. Как это у меня сейчас: 1. Версия хранится в .ini файле. 2. Во время билда специальная тула генерит C++-ный хеадер по этому инишнику, в котором прописывает макросы. 3. Этот генереный хеадер инклюят те, кому он нужен: например код, показывающий about box. И его же инклюдит файл ресурсов, чтобы проштамповать версию. 4. После сборки ini-шник инкрементируется. Основная проблема состоит в том, что версию в ресурсе приходится руками исправлять на макросы. Это работает до тех пор, пока я не поредактирую ресурсы из студийного редактора ресурсов - после этого студия вместо макросов вписывает их значения, и, таким образом, после каждого редактирования приходится возвращать руками макросы на место. Может быть существует более человеческий способ автоматического ведения версий?
_DEN_, по-хорошему, делается это через SVN и её keywords. Пишешь скрипт который делает вот что: 0) $(build) = arg 1) svn tag: "svn copy ..../trunk ..../tags/$(build)" 2) svn co ..../tags/$(build) 3) компилишь в version.h есть поля типа $Date и $Revision которые subversion заполняет во время chechout. Усё. $Revision и есть твой build. Ну или можешь взять весь (или кусок) пути из SVN. http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.keywords.html Такие же поля есть в cvs, pvcs, perforce, и т.д.
_DEN_, только что сделал то что сам советовал - оказалось что чуть приврал. Для builds из, скажем, trunk работает вот такая схема: 1) svn co ...../trunk trunk 2) выдёргиваешь текущую версию cd ..../trunk; svn info | grep "Rev: " 3) втыкаешь её в curr_version.h так что б версия была x.y.rev 4) компилишь Потом для получения исходника для v. x.y.rev: svn update -r rev
s0larian В твоем примере остается непонятным как сделать так чтобы и бинарники имели версии, и ресурсы можно было редактировать.
В 3ем шаге версия втыкается в header. Ну а в ресурсах есть #include. В 4м всё это компилится и в ехе-шнике остаётся версия. Эти же макросы используются в "--version" или "About..."
Эээ, то есть ты про version resource в который Studio подставляет значение макроса?... Хм, тут не знаю. Наверно надо разделить ресурсы так что бы ты не открывал тот где живёт версия из Студии. Попробуй в главном .rc сделать #include или компилить два отдельных .rc файла...
Нет, не получится Этот гад затирает все левые инклюды в .rc файле. Походу .rc файл генерится при каждой записи. Следовательно никакую левую инфу туда не воткнуть. Вопрос остается открытым.
Какие-то у вас проблемы не серьёзные. Кто мешает написать примитивную программу, которая будет прямо в .rc файле номер билда прибавлять и засунуть её в Prebuild event (пример: IncVer.exe $(ProjectDir)FileName.rc) Код (Text): // IncVer.cpp : Defines the entry point for the console application. // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { __int64 s64; int s; FILE *f; char *str; char *s1, *s2, *s3; int build; if (argc != 2) { printf("Usage: IncVer.exe FileName.rc"); return 0; } f = fopen(argv[1], "rb"); if (!f) return -1; fseek(f, 0, SEEK_END); fgetpos(f, &s64); s = (int)s64; rewind(f); str = (char*)malloc(s+1); fread(str, 1, s, f); fclose(f); str[s] = 0; f = fopen(argv[1], "wb"); if (!f) return -1; s1 = str; do { s2 = strchr(s1, '\r'); if (!s2) break; while(s2[0] && (unsigned)s2[0] < ' ') { s2[0] = 0; s2++; } s3 = strstr(s1, "FILEVERSION"); if (!s3) s3 = strstr(s1, "PRODUCTVERSION"); if (!s3) { fwrite(s1, 1, strlen(s1), f); fwrite("\r\n", 1, 2, f); } else { char newver[64]; s3 = strrchr(s1, ','); if (s3) { s3++; build = atoi(s3); build++; strncpy(newver, s1, s3-s1); sprintf(newver + (s3-s1), "%d\r\n", build); fwrite(newver, 1, strlen(newver), f); } } s -= s2 - s1; s1 = s2; }while (s > 0); free(str); fclose(f); return 0; }