CMake構建學習筆記21-通用的CMake構建腳本
在之前使用CMake構建程序的腳本(CMake構建學習筆記-目錄)中,大部分內容都有比較強的相似性,那么是不是可以這些相似的內容提取出來作為一個單獨的腳本,在構建具體的程序的時候再去調用這個腳本呢?這樣做的好處是如果構建的配置有什么變動,就不用每個程序的構建腳本都修改了,只用修改這個通用的腳本就可以了。
具體的腳本cmake-build.ps1如下,適用于PowerShell終端:
param(
[string]$SourceLocalPath,
[string]$BuildDir,
[string]$Generator,
[string]$InstallDir,
[string]$SymbolDir,
[string[]]$PdbFiles,
[hashtable]$CMakeCacheVariables,
[bool]$MultiConfig = $false # 控制是否使用多配置類型
)
# 清除舊的構建目錄
if (Test-Path $BuildDir) {
Remove-Item -Path $BuildDir -Recurse -Force
}
New-Item -ItemType Directory -Path $BuildDir
# 構建CMake命令行參數
$CMakeArgs = @(
"-B", "`"$BuildDir`"",
"-G", "`"$Generator`"",
"-A", "x64"
)
if ($MultiConfig) {
$CMakeArgs += "-DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo"
}
else {
$CMakeArgs += "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
}
$CMakeArgs += (
"-DCMAKE_PREFIX_PATH=`"$InstallDir`"",
"-DCMAKE_INSTALL_PREFIX=`"$InstallDir`""
)
# 添加額外的CMake緩存變量
foreach ($key in $CMakeCacheVariables.Keys) {
$CMakeArgs += "-D$key=$($CMakeCacheVariables[$key])"
}
# 配置CMake
cmake $SourceLocalPath $CMakeArgs
# 構建階段,指定構建類型
cmake --build $BuildDir --config RelWithDebInfo --parallel
# 安裝階段,指定構建類型和安裝目標
cmake --build $BuildDir --config RelWithDebInfo --target install
# 復制符號庫
foreach ($file in $PdbFiles) {
Write-Output $file
if (Test-Path $file) {
Copy-Item -Path $file -Destination $SymbolDir
}
else {
Write-Output "Warning: PDB file not found: $file"
}
}
# 清理構建目錄
#Remove-Item -Path $BuildDir -Recurse -Force
這段腳本的關鍵在于以下幾點:
- CMake配置參數
$CMakeArgs。首先是通用配置,-B表示生成的目錄;-G表示生成器,比如"Ninja"或者"Visual Studio 17 2022";-A表示目標平臺的架構。然后是構建目標的類型,有的庫使用CMAKE_CONFIGURATION_TYPES,有的庫使用CMAKE_BUILD_TYPE,值設置成RelWithDebInfo表示Release版本,但是帶調試信息。接下來是設置依賴庫查找路徑CMAKE_PREFIX_PATH和安裝路徑CMAKE_INSTALL_PREFIX。最后是添加額外的CMake緩存變量,這些緩存變量通常與要構建的庫有關。 - 使用生成的配置參數
$CMakeArgs進行項目配置:cmake $SourceLocalPath $CMakeArgs。這一步會把設置的參數固定成具體的項目參數,如果使用Visual Studio進行構建,就是生成sln項目。 - 編譯、鏈接,生成構建目標:
cmake --build $BuildDir --config RelWithDebInfo --parallel。這里的--parallel的意思是并行構建,會采用多線程的方式構建項目,自動決定線程數。 - 安裝構建目標
cmake --build $BuildDir --config RelWithDebInfo --target install。 - 最后一步復制符號庫的作用是將生成的符號庫文件復制到特定的目錄中進行管理,這樣在程序崩潰之后,可以通過符號庫找到相應的代碼,便于進行錯誤排查。
那么有沒有具體使用這個cmake-build.ps1腳本的例子呢?后續文章中的程序構建會使用這個腳本,敬請期待。

浙公網安備 33010602011771號