본문 바로가기

운동하는 개발자/Windows

cmake로 windows 파일 속성(버전) 입력하기

728x90

시작 전에..
CMAKE는 주로 크로스 컴파일 환경이기에 윈도우에 파일속성에서 보이는 파일버전을 신경 쓰지 않았다가 필요에 의해 찾아보니 은근 정보 찾기가 힘들었다

1. cmake로 빌드할 프로젝트가 있는 경로에 version.rc.in파일을 생성한다

2. 파일에 아래 내용을 붙여 넣는다

#include "Windows.h"

/* CMakeLists.txt 에서 선언할 변수 MY_PRODUCT_NUMBER, MY_PRODUCT_VERSION, MY_BUILD_NUMBER */
#define VER_FILEVERSION             @MY_PRODUCT_NUMBER@,@MY_PRODUCT_VERSION@,@MY_BUILD_NUMBER@,0
#define VER_FILEVERSION_STR         "@MY_PRODUCT_NUMBER@.@MY_PRODUCT_VERSION@.@MY_BUILD_NUMBER@.0\0"

#define VER_PRODUCTVERSION          @MY_PRODUCT_NUMBER@,@MY_PRODUCT_VERSION@,@MY_BUILD_NUMBER@,0
#define VER_PRODUCTVERSION_STR      "@MY_PRODUCT_NUMBER@.@MY_PRODUCT_VERSION@.@MY_BUILD_NUMBER@\0"

#ifndef DEBUG
#define VER_DEBUG                   0
#else
#define VER_DEBUG                   VS_FF_DEBUG
#endif


VS_VERSION_INFO VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION
FILEFLAGSMASK   VS_FFI_FILEFLAGSMASK
FILEFLAGS       (VS_FF_PRIVATEBUILD|VS_FF_PRERELEASE|VER_DEBUG)
FILEOS          VOS__WINDOWS32
FILETYPE        VFT_DLL
FILESUBTYPE     VFT2_UNKNOWN
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN                
            VALUE "FileVersion",      VER_FILEVERSION_STR                        
            VALUE "ProductVersion",   VER_PRODUCTVERSION_STR
			/* 버전 외의 아래 정보들도 입력 가능
            VALUE "CompanyName",      VER_COMPANYNAME_STR
            VALUE "FileDescription",  VER_FILEDESCRIPTION_STR
            VALUE "FileVersion",      VER_FILEVERSION_STR
            VALUE "InternalName",     VER_INTERNALNAME_STR
            VALUE "LegalCopyright",   VER_LEGALCOPYRIGHT_STR
            VALUE "LegalTrademarks1", VER_LEGALTRADEMARKS1_STR
            VALUE "LegalTrademarks2", VER_LEGALTRADEMARKS2_STR
            VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
            VALUE "ProductName",      VER_PRODUCTNAME_STR
            VALUE "ProductVersion",   VER_PRODUCTVERSION_STR */            
        END
    END

    BLOCK "VarFileInfo"
    BEGIN
        /* The following line should only be modified for localized versions.     */
        /* It consists of any number of WORD,WORD pairs, with each pair           */
        /* describing a language,codepage combination supported by the file.      */
        /*                                                                        */
        /* For example, a file might have values "0x409,1252" indicating that it  */
        /* supports English language (0x409) in the Windows ANSI codepage (1252). */

        VALUE "Translation", 0x409, 1252

    END
END

*위에 주석되어 있는 내용 참조

 

3. CMakeLists.txt에서 해당 파일을 로드한다

configure_file(
	${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in
	${CMAKE_CURRENT_BINARY_DIR}/version.rc
	@ONLY
    # version.rc.in파일이 동일한 경로에 없다면 해당경로로 수정
)

 

4. CMakeLists.txt에서 버전 변수값을 세팅한다

set(MY_PRODUCT_NUMBER 0)
set(MY_PRODUCT_VERSION 00)
set(MY_BUILD_NUMBER 01)

 

+ 추가로 Cmake에서 관리하는 버전 세팅하기(윈도우 파일속성과 관련 없음)

project(projectname
	VERSION ${MY_PRODUCT_NUMBER}.${MY_PRODUCT_VERSION}.${MY_BUILD_NUMBER}
)

 

CMake 참 어렵고 힘들다.. IDE만세 VisualStudio는 신이다!!!

 

참고페이지

https://learn.microsoft.com/ko-kr/windows/win32/menurc/versioninfo-resource?redirectedfrom=MSDN 

 

VERSIONINFO 리소스 - Win32 apps

버전 정보 리소스를 정의합니다. 리소스에는 해당 버전 번호, 의도한 운영 체제 및 원래 파일 이름과 같은 파일에 대한 정보가 포함됩니다. 이 리소스는 버전 정보 함수와 함께 사용됩니다.

learn.microsoft.com


 

728x90