天天看點

基于CMake和WiX Toolset建構Windows安裝包基于CMake和WiX Toolset建構Windows安裝包(.msi)

基于CMake和WiX Toolset建構Windows安裝包(.msi)

目錄

  • 基于CMake和WiX Toolset建構Windows安裝包(.msi)
    • 前言
    • Install建構解析
    • CPack打包解析
      • 設定環境變量與Id命名
    • 參考連結

前言

在學校裡我們寫程式根本不關心打包釋出的問題,但作為一個完整的程式開發流程,打包釋出是不可忽略且十分重要的一步。本質上打包和安裝主要是壓縮和解壓的過程,在Linux平台上可以清楚地感受到這一點(很多時候直接打成zip包)。在Windows平台上,常見的安裝包有.msi和.exe格式,除了将檔案解壓到指定位置,還可以設定使用許可(License),環境變量。利用CMake和WiX工具可以在Windows上建構.msi安裝包(.exe安裝包可以基于NSIS工具建構),下面将介紹細節。

CMake:https://cmake.org/download

WiX Toolset:https://wixtoolset.org/releases

示例代碼:https://github.com/chenleiHub/wheels/tree/main/cmake_guide/sample4

示例基于sample3建構,這裡隻讨論打包部分:

# set install path
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
	set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/install")
endif()
message("Install prefix: " ${CMAKE_INSTALL_PREFIX})

# copy and relocate files
install(TARGETS sample4 calculations
	RUNTIME DESTINATION bin # executable file
	LIBRARY DESTINATION bin # dynamic library
	ARCHIVE DESTINATION lib)# static library
install(FILES calculations.h DESTINATION include)
install(FILES config.json DESTINATION config)

# set installer configurations
set(CPACK_GENERATOR "WIX") # set installer
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt") # set license in installer
set(CPACK_WIX_PATCH_FILE "${PROJECT_SOURCE_DIR}/wix-patch.xml") # set environment variables
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}") # set package name

# package files into installer
include(CPack)
           

Install建構解析

首先是install過程,單純的install過程不會打包,隻會将檔案拷貝到指定的目錄下。CMake關于INSTALL也會有很多寫好的宏,比如,檢查CMAKE_INSTALL_PREFIX是否被設定,如果沒有,則設定目錄為./install檔案夾。如果不設定,預設安裝目錄一般為C:/Program Files (x86)/{ProjectName},比如這裡為C:/Program Files (x86)/CMakeWheels。

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
	set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/install")
endif()
           

install可以直接基于TARGETS建構,即CMake會自動拷貝TARGETS中的可執行檔案,動态庫,靜态庫到給出的目标檔案夾bin,lib,include,config。

install(TARGETS sample4 calculations
	RUNTIME DESTINATION bin # executable file
	LIBRARY DESTINATION bin # dynamic library
	ARCHIVE DESTINATION lib)# static library
           

同時install也支援單個檔案的拷貝,用于拷貝配置檔案等。

install(FILES calculations.h DESTINATION include)
install(FILES config.json DESTINATION config)
           

通過以下指令可以在sample4檔案夾下建構./install檔案夾。

cd wheels\cmake_guide\sample4
mkdir build
cd build
cmake ..
cd wheels\cmake_guide\sample4
cmake --build build --config Release
cmake --install build
           
基于CMake和WiX Toolset建構Windows安裝包基于CMake和WiX Toolset建構Windows安裝包(.msi)

CPack打包解析

# set installer configurations
set(CPACK_GENERATOR "WIX") # set installer
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt") # set license in installer
set(CPACK_WIX_PATCH_FILE "${PROJECT_SOURCE_DIR}/wix-patch.xml") # set environment variables
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}") # set package name
           

最後,添加include(CPack)告訴CMake需要調用相關内容。

通過以下指令可以在sample4檔案夾下建構.msi安裝包。

cd wheels\cmake_guide\sample4
mkdir build
cd build
cmake ..
cd wheels\cmake_guide\sample4
cmake --build build --config Release
cd wheels\cmake_guide\sample4\build
cpack --config CPackConfig.cmake
           

設定環境變量與Id命名

目前通過增加patch的方法在installer中添加環境變量設定(參考1,參考2),解析wix-patch.xml:

<CPackWiXPatch>
	<CPackWiXFragment Id="CM_CP_bin.sample4.exe">
		<Environment Id="SAMPLE4_DIR" Action="set" 
			Name="SAMPLE4_DIR" Value="[INSTALL_ROOT]"/>

		<Environment Id="CALCULATIONS_LIB_DIR" Action="set" 
			Name="CALCULATIONS_LIB_DIR" Value="[INSTALL_ROOT]lib"/>

		<Environment Id="CALCULATIONS_BIN_DIR" Action="set" Part="first"
			Name="PATH" Value="[INSTALL_ROOT]bin"
			System="yes"/>
	</CPackWiXFragment>
</CPackWiXPatch>
           

CM_CP_bin.sample4.exe這個Id不是随便設定的,它必須在build_CPack_Packages\win64\WIX\files.wxs中找到對應,否則會報CPack Error: Some XML patch fragments did not have matching IDs: 'CM_CP_bin.samplexx.exe’錯誤。

<Environment Id="SAMPLE4_DIR" Action="set" Name="SAMPLE4_DIR" Value="[INSTALL_ROOT]"/>
<Environment Id="CALCULATIONS_LIB_DIR" Action="set" Name="CALCULATIONS_LIB_DIR" Value="[INSTALL_ROOT]lib"/>
           

是在使用者環境變量中設定,

是在系統環境變量中設定。

.msi安裝包将在build檔案夾下面生成,運作.msi安裝包,可以看到“License”已經被導入,環境變量也已經設定。

基于CMake和WiX Toolset建構Windows安裝包基于CMake和WiX Toolset建構Windows安裝包(.msi)
基于CMake和WiX Toolset建構Windows安裝包基于CMake和WiX Toolset建構Windows安裝包(.msi)

此時,能在任何目錄下運作sample4了。

基于CMake和WiX Toolset建構Windows安裝包基于CMake和WiX Toolset建構Windows安裝包(.msi)

參考連結

CSDN參考

https://blog.csdn.net/qq_38410730/article/details/102837401

CMake,CPack文檔

https://cmake.org/cmake/help/latest/module/CPack.html#variable:CPACK_GENERATOR

其他

http://cmake.3232098.n2.nabble.com/CPack-WIX-examples-td7588561.html