Кто как ведет версионность билдов?

Тема в разделе "LANGS.C", создана пользователем _DEN_, 2 фев 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Хочется чтобы...

    1. Был макрос с версией билда, доступный внутри исходников. Например:
    Код (Text):
    1. #define VERSION_MAJOR 1
    2. #define VERSION_MINOR 10
    3. #define VERSION_RELEASE 23
    4. #define VERSION_BUILDNUMBER 4342
    5. #define VERSION_DOTTED ##VERSION_MAJOR "." ##VERSION_MINOR "." ##VERSION_RELEASE "." ##VERSION_BUILDNUMBER
    2. В ресурсах .exe и .dll была прописана версия. Та самая версия, которая в проводнике по правой кнопке в свойствах файла будет.

    3. Хочется чтобы версия билда контролировалась из одного места и чтобы при Главной Сборке она автоматом инкрементировалась.


    Как это у меня сейчас:

    1. Версия хранится в .ini файле.
    2. Во время билда специальная тула генерит C++-ный хеадер по этому инишнику, в котором прописывает макросы.
    3. Этот генереный хеадер инклюят те, кому он нужен: например код, показывающий about box. И его же инклюдит файл ресурсов, чтобы проштамповать версию.
    4. После сборки ini-шник инкрементируется.

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

    Может быть существует более человеческий способ автоматического ведения версий?
     
  2. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    __http://support.microsoft.com/kb/q237870/
    __http://www.codeproject.com/KB/cpp/makeversion.aspx
     
  3. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    _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, и т.д.
     
  4. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    _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
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    s0larian

    В твоем примере остается непонятным как сделать так чтобы и бинарники имели версии, и ресурсы можно было редактировать.
     
  6. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    В 3ем шаге версия втыкается в header. Ну а в ресурсах есть #include. В 4м всё это компилится и в ехе-шнике остаётся версия. Эти же макросы используются в "--version" или "About..."
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _DEN_

    Как избавиться от этого?
     
  8. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Эээ, то есть ты про version resource в который Studio подставляет значение макроса?... Хм, тут не знаю. Наверно надо разделить ресурсы так что бы ты не открывал тот где живёт версия из Студии. Попробуй в главном .rc сделать #include или компилить два отдельных .rc файла...
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Да, это хорошая мысль. Можно просто версию поместить в отдельный файл.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Нет, не получится :dntknw: Этот гад затирает все левые инклюды в .rc файле. Походу .rc файл генерится при каждой записи. Следовательно никакую левую инфу туда не воткнуть. Вопрос остается открытым.
     
  11. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    А два .rc файла компилить пробовал?
     
  12. sprog

    sprog New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2009
    Сообщения:
    1
    Какие-то у вас проблемы не серьёзные.
    Кто мешает написать примитивную программу, которая будет прямо в .rc файле номер билда прибавлять и засунуть её в Prebuild event (пример: IncVer.exe $(ProjectDir)FileName.rc)
    Код (Text):
    1. // IncVer.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5.  
    6. int _tmain(int argc, _TCHAR* argv[])
    7. {
    8.   __int64 s64;
    9.   int s;
    10.   FILE *f;
    11.   char *str;
    12.   char *s1, *s2, *s3;
    13.   int build;
    14.   if (argc != 2)
    15.   {
    16.     printf("Usage: IncVer.exe FileName.rc");
    17.     return 0;
    18.   }
    19.   f = fopen(argv[1], "rb");
    20.   if (!f)
    21.     return -1;
    22.   fseek(f, 0, SEEK_END);
    23.   fgetpos(f, &s64);
    24.   s = (int)s64;
    25.   rewind(f);
    26.   str = (char*)malloc(s+1);
    27.   fread(str, 1, s, f);
    28.   fclose(f);
    29.   str[s] = 0;
    30.   f = fopen(argv[1], "wb");
    31.   if (!f)
    32.     return -1;
    33.   s1 = str;
    34.   do
    35.   {
    36.     s2 = strchr(s1, '\r');
    37.     if (!s2)
    38.       break;
    39.     while(s2[0] && (unsigned)s2[0] < ' ')
    40.     {
    41.       s2[0] = 0;
    42.       s2++;
    43.     }
    44.     s3 = strstr(s1, "FILEVERSION");
    45.     if (!s3)
    46.       s3 = strstr(s1, "PRODUCTVERSION");
    47.     if (!s3)
    48.     {
    49.       fwrite(s1, 1, strlen(s1), f);
    50.       fwrite("\r\n", 1, 2, f);
    51.     }
    52.     else
    53.     {
    54.       char newver[64];
    55.       s3 = strrchr(s1, ',');
    56.       if (s3)
    57.       {
    58.         s3++;
    59.         build = atoi(s3);
    60.         build++;
    61.         strncpy(newver, s1, s3-s1);
    62.         sprintf(newver + (s3-s1), "%d\r\n", build);
    63.         fwrite(newver, 1, strlen(newver), f);
    64.       }
    65.     }
    66.     s -= s2 - s1;
    67.     s1 = s2;
    68.   }while (s > 0);
    69.   free(str);
    70.   fclose(f);
    71.     return 0;
    72. }
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Этой версией еще много всего может штамповаться - ее надо в .ini хранить.