본문 바로가기

3.구현/VC++

VC에서 자동으로 빌드번호 증가시키기 ( Incresing the build number automatically)

VC에서 버전 번호 관리는 상당히 귀찮은 작업이다. 항상 리소스 관리자에서 버전 리소스를 선택해서 파일버전와 프로덕트 버전을 변경하는 것은 여간 귀찮은 작업이다.

이에 간단히 자동으로 빌드번호를 증가시켜주는 툴이 있어서 소개하고자 한다. 빌드 번호를 만들어주는 툴은 구현 방법도 다양하면 종류도 여러 개 된다.

Writer: http://ospace.tistory.com/(ospace114@empal.com) 2008.08.13

종류

자동 빌드 번호 증가는 크게 두가지 방법으로 구분 된다. 매크로를 이용한 것과 유틸리티 프로그램을 이용한 방법이다. 둘다 귀찮은 수작업이 필요하다. 한번 해두면 나중에는 더이상 수정이 필요없기에 더 귀찮은 수동 버전번호 관리보다 편하다.

그리고 좀더 편안하게 할 수 있는게 Jordan Walters의 Add-in형태로 제공되는 프로그램이 있다.[3] 이는 옵션에서 선택적으로 자동증가 항목을 선택할 수 있고, 다양한 기능이 제공되어 익숙만 해진다면 좋을 듯하다. 그러나 여기서는 다루지 않으므로 관심있으신 분은 아래 참조[3]를 보면된다.

여기서 유틸리티를 선택한 이유는 매크로 방식을 사용하는 경우 Visual studio 버전에 따라서 호환이 안되는 경우도 있다. 이것을 수정하는건 짜증이 난다. 매크로를 자유자재로 사용할줄 안다면 문제가 안되지만 나처럼 매크로에 "매"도 잘 모르는 사람들은 삽질을 여러 번 해야하는 아주 큰 문제점이 있다. 그렇기에 유틸리티를 이용한 방법을 택하였다.

그리고 M$에서도 유틸리티 형태와 관련된 문서를 제공하고 있다. 아래 참조[2]를 보면된다. 다음에 사용할 프로그램도 이를 기반으로한 유틸리티이다.

M$의 문서는 자동으로 버전을 증가시키는 것이 아닌 파일 관리와 버전 번호 추출하는게 주요한 기능이다. 빌드 전에 리소스의 버전 항목에서 버전 정보를 헤더파일로 추출해서 저장한다. 이 정보를 코드에서 참조하면 굳이 프로그램 내에 버전 번호를 두지 않아서 된다.

그리고 빌드 후에는 결과 프로그램의 이름을 원하는 버전명을 추가하여 이름을 변경하여 저장하게 한다.

버전표기에 대해

버전 정보를 보면 쉼표로 총 4자지로 표현 되었다. 각각의 정보는 다음과 같다.

Major ver, Minor ver, Build number, Revision.

  • Major ver와 Minor ver: 앞에 두자리가 주요 버전에 해당된다.
  • Build number: 빌드 번호로 몇번 빌드되었는지 알 수 있다.
  • Revision: 리비전은 파일이 수정되어서 저장된 횟수를 의미한다. VC에서는 거의 의미가 없다. 이 귀찮은 작업을 어떻게 하라고... 기본값은 1로서 처음 생성과 저장이 되었기 때문이다.

makeversion 유틸리티

여기서는 gugulea의 유틸리티를 사용한 방법을 보겠다.

유틸리티를 사용한 방법은 프로젝트에서 Post-build와 Pre-build 항목에 명령어를 입력하는 방법이다. 보통 Pre-build에 넣어서 버전을 증가시키고, 증가된 버전으로 빌드하여 현재 프로그램에 적용하는 형태이다.

step1) 다운로드

아래 참조[1]에가면 소스 파일과 실행파일을 얻을 수 있다. 어떻게 구현되는지 궁금하다면 소스파일을 보면 될것이고 여기서는 실행파일만 받으면 된다.

step2) 버전정보 구분

리소스 파일에서 버전정보를 구분해 낸다. 일반적인 리소스 파일은 확장자가 rc이며, 파일명은 프로젝트 이름과 동일하다. 만약 현재 프로젝트 버전 리소스가 없다면 리소스 관리자에서 버전 리소스를 추가하면 된다.

일반적인 버전 리소스 내용은 다음과 같은 형식이다.

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x17L
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0"
        BEGIN
            VALUE "Comments", ""
            VALUE "CompanyName", "unknown"
            VALUE "FileDescription", ""
            VALUE "FileVersion", "1, 0, 0, 1"
            VALUE "InternalName", ""
            VALUE "LegalCopyright", "(C) Copyright 2008"
            VALUE "OriginalFilename", "test.exe"
            VALUE "ProductName", "Application"
            VALUE "ProductVersion", "1, 0, 0, 1"
        END
END

이를 아래와 같이 두가지 파일로 구분하게 된다. 예를 들어 IncreaseVersion이라는 프로젝트가 있다면 리소스 파일은 IncreaseVersion.rc가 된다. 이를 IncreaseVersion.rc와 version.ver 파일로 구분한다.

IncreaseVersion.rc 파일

/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#include "version.ver"

VS_VERSION_INFO VERSIONINFO
 FILEVERSION VERSION_NUMBER
 PRODUCTVERSION VERSION_NUMBER
 FILEFLAGSMASK 0x17L
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0"
        BEGIN
            VALUE "Build Date", VERSION_BUILD_DATE_TIME "\0"
            VALUE "Comments", ""
            VALUE "CompanyName", VERSION_COMPANY "\0"
            VALUE "FileDescription", "Application"
            VALUE "FileVersion", VERSION_STRING "\0"
            VALUE "InternalName", ""
            VALUE "LegalCopyright", VERSION_COPYRIGHT "\0"
            VALUE "OriginalFilename", "test.exe"
            VALUE "ProductName", " Application"
            VALUE "ProductVersion", VERSION_STRING "\0"
        END
END

version.ver 파일

#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define VERSION_BUILD 0
#define VERSION_QFE 1
#define VERSION_BUILD_DATE "13/08/2008"
#define VERSION_BUILD_TIME "19:41:42KOR"

#define _STR(x) #x
#define STR(x) _STR(x)
#define VERSION_NUMBER VERSION_MAJOR,VERSION_MINOR,VERSION_BUILD,VERSION_QFE
#define VERSION_STRING STR(VERSION_MAJOR) "." STR(VERSION_MINOR) "." \
                               STR(VERSION_BUILD) "." STR(VERSION_QFE)

#define VERSION_COMPANY ""
#define VERSION_COPYRIGHT "(C) Copyright 2008"
#define VERSION_TRADEMARK ""
#define VERSION_BUILD_DATE_TIME VERSION_BUILD_DATE " - " VERSION_BUILD_TIME

version.ver파일은 두부분으로 구분된다. 앞에 버전정보가 정의되어 있고, 뒤에는 이 정보를 이용해서 버전을 조합하는 매크로로 구분된다.

앞에 버전정보를 아래와 같이 makeversion.exe를 실행하면 간단히 생성된다.

makeverion -g

그리고 첨부되었던 version.h을 열면 앞에 version.ver의 아래 매크로 항목이 보인다. 이부분을 전부 복사해서 붙여 넣으면 간단하다.

Note

여기서 새로 만든 리소스 파일에서 보면, 처음 보는 버전 정보 항목이 보인다. 바로 Build Date이다. 이것 때문에 makeversion 유틸리티를 선택하게된 가장 큰 이유이다. ^^;

물론 모든 작업은 리소스 파일이 있던 폴더에서 한다. 그리고 makeversion는 절대경로나 상대경로를 통해서 지정하면된다.

step3) 프로젝트 환경설정

프로젝트 등록정보에서 Build Events항목에 Pre-Build Event와 Post-Build Event가 있다. 이중에서 Pre-Build Event가 관심 대상이다.

Release와 Debug 버전을 따로 구분해서 관리할 수 있다. 앞에 개발자는 debug에서는 빌드번호를 증가하지 않고 release에만 증가하게 하였다. 즉 다음과 같이 release에서 Pre-Build Event에 입력하였다.

..\version\makeversion /inc $(ProjectDir)\version.ver

makeversion이 다른 폴더에 있다면 version.ver가 있는 폴더 위치를 찾을 수 없게 된다. makeversion유틸리티 실행폴더가 기본 폴더가 되기 때문이다. 이때 $(ProjectDir) 매크로를 사용하면 손쉽게 version.ver파일을 사용할 수 있다.

만약 버전 번호를 증가 시키지 않고 싶다면 아래와 같이 /inc 옵션을 제거하고 사용하면된다.

..\version\makeversion $(ProjectDir)\version.ver

이는 사용자가 운영의 묘를 살리면 된다.

결론

이상으로 makeversion 유틸리티를 설정하는 방법을 살펴보안다. 여기서 makeversion에 의해서 version.ver에 있는 VERSION_BUILD, VERSION_BUILD_DATE, VERSION_BUILD_TIME 의 선언값을 변경하고, 리소스 파일에서 이 정보를 근간으로 생성된 버전정보를 사용하게 된다.

주의 할 것은 이렇게 해서 리소스에 있는 버전 정보 항목 내용이 변경되었는데, 이를 VC 리소스 관리자에서 불러와서 저장하면 앞에 설정된 매크로 부분이 전부 제거된다. 그렇기에 가급 적이면 리소스 관리자에서 버전 부분은 열지 않으며, 열어다고 해서 수정하지 않고 저장하지 않은다. 그렇지 않으면 귀찮은 분할 작업을 또 해주어야 한다.

Visual Studio에서 리소스 관리자로 "Version"열면 안된다.

추가로 리소스가 변경되지 않으면 리소스가 컴파일되지 않은 경우가 있다. 이를 위해 앞에 codeproct에서는 리소스 컴파일도 포함되어 있다. 참조[1]에 가서 확인해보길 바란다.

참조

[1] http://www.codeproject.com/kb/cpp/makeversion.aspx
[2] http://support.microsoft.com/kb/q237870 (Article ID: 237870)
[3] http://www.codeproject.com/KB/macros/IncVersionVC8.aspx

Hisotry

2009.01.08. ospace 오탈자 수정. 문단 재 정렬. 결론 부연설명 추가.
2009.04.07. ospace 오탈자 수정. 도입 부분의 매크로와 유틸리티 방식의 부분 설명을 매끄럽게 수정

반응형