添加ccache 加速编译

This commit is contained in:
2026-06-24 17:10:15 +08:00
parent 4baf9f9040
commit 8ee9f88252
16 changed files with 203 additions and 128 deletions
+8
View File
@@ -176,6 +176,8 @@ function(_attach_target _target _build_type)
if("${_build_type}" IN_LIST _attached_build_types)
message(STATUS "skip already attached target: ${_target}, build_type=${_build_type}")
return()
else()
message(STATUS "attached target: ${_target}, build_type=${_build_type}")
endif()
set(target_type)
@@ -245,6 +247,12 @@ function(_attach_target _target _build_type)
TARGET "${_target}"
PROPERTY PSC_ATTACHED_BUILD_TYPES "${_attached_build_types}"
)
# if(G_Enable_CCache AND MSVC)
# set_target_properties("${_target}" PROPERTIES
# MSVC_DEBUG_INFORMATION_FORMAT "Embedded"
# )
# endif()
endfunction()
+28 -27
View File
@@ -7,6 +7,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/skill.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/register_libaray/export.cmake)
macro(w_install files dir)
install(FILES ${files} DESTINATION "${dir}")
endmacro()
@@ -44,17 +45,27 @@ set(_system_build_tool_build_dir)
include(${CMAKE_CURRENT_LIST_DIR}/clear.cmake)
macro(_load_cmake_library)
if(MSVC)
set(launcher_utf8 "${CMAKE_SOURCE_DIR}/0_cmake_library/cl_launcher.bat")
# set(CMAKE_C_COMPILER_LAUNCHER "${launcher_utf8}")
# set(CMAKE_CXX_COMPILER_LAUNCHER "${launcher_utf8}")
# set(CMAKE_C_LINKER_LAUNCHER "${launcher_utf8}")
# set(CMAKE_CXX_LINKER_LAUNCHER "${launcher_utf8}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${launcher_utf8}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${launcher_utf8}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_CUSTOM "${launcher_utf8}")
set(CCACHE "D:/ae/tools/ccache/ccache.exe")
set(G_Enable_CCache_Default OFF)
if(CMAKE_HOST_WIN32 AND EXISTS "${CCACHE}")
set(G_Enable_CCache_Default ON)
endif()
option(G_Enable_CCache "Enable ccache compiler launcher" ${G_Enable_CCache_Default})
set(launcher)
if(MSVC)
list(APPEND launcher "D:/ae/proj/ae/0_cmake_library/set_utf8.bat")
endif()
if(G_Enable_CCache AND CMAKE_HOST_WIN32)
list(APPEND launcher "${CCACHE}")
if(MSVC)
list(APPEND launcher "compiler_type=msvc")
endif()
endif()
set(CMAKE_C_COMPILER_LAUNCHER "${launcher}")
set(CMAKE_CXX_COMPILER_LAUNCHER "${launcher}")
set(CMAKE_C_LINKER_LAUNCHER "${launcher}")
set(CMAKE_CXX_LINKER_LAUNCHER "${launcher}")
# 清除默认环境
_clear_env()
@@ -63,7 +74,6 @@ macro(_load_cmake_library)
set(CMAKE_GRAPHVIZ_OUTPUT_DIR "${CMAKE_BINARY_DIR}/graphviz")
enable_testing()
# 让 find_package 产生的 targets 在全局可见
@@ -80,25 +90,16 @@ macro(_load_cmake_library)
if(DEFINED CMAKE_TOOLCHAIN_FILE AND NOT CMAKE_TOOLCHAIN_FILE STREQUAL "")
get_filename_component(name "${CMAKE_TOOLCHAIN_FILE}" NAME)
string(REGEX REPLACE "\\.cmake$" "" name "${name}")
set(_system_build_tool_install_dir_name "${name}")
set(G_Architecture_Name "${name}_${CMAKE_BUILD_TYPE}")
#set(G_Architecture_Name "${name}_${CMAKE_CXX_COMPILER_ID}_${CMAKE_CXX_COMPILER_VERSION}_${CMAKE_SYSTEM_PROCESSOR}_${CMAKE_BUILD_TYPE}")
message(STATUS "当前使用 toolchain 文件: [${CMAKE_TOOLCHAIN_FILE}]")
else()
get_filename_component(compilerName "${CMAKE_CXX_COMPILER}" NAME)
string(REPLACE ".exe" "" compilerName "${compilerName}")
string(REPLACE "." "_" compilerName "${compilerName}")
string(REPLACE "+" "x" compilerName "${compilerName}")
set(G_Architecture_Name "${compilerName}_${CMAKE_SYSTEM_NAME}_${CMAKE_BUILD_TYPE}")
set(_system_build_tool_install_dir_name "${compilerName}_${CMAKE_SYSTEM_NAME}")
# 这个地方反复触发是 工具链编译器 和 toolchain写的不一样导致的
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE OR CMAKE_TOOLCHAIN_FILE STREQUAL "")
message(FATAL_ERROR "没有使用 toolchain 文件")
endif()
get_filename_component(name "${CMAKE_TOOLCHAIN_FILE}" NAME)
string(REGEX REPLACE "\\.cmake$" "" name "${name}")
set(_system_build_tool_install_dir_name "${name}")
set(G_Architecture_Name "${name}_${CMAKE_BUILD_TYPE}")
message(STATUS "当前使用 toolchain 文件: [${CMAKE_TOOLCHAIN_FILE}]")
message(STATUS "当前 toolchain 名称: [${name}]")
+4 -22
View File
@@ -1,4 +1,6 @@
cmake_minimum_required(VERSION 3.16)
cmake_policy(SET CMP0141 NEW)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$<CONFIG:Debug,RelWithDebInfo>:Embedded>")
project(plantSunCat)
set(PLANT_SUN_CAT_VERSION 1.0.0)
set(CMAKE_CXX_STANDARD 20)
@@ -8,32 +10,12 @@ set(ENABLE_BUILD_TIMER ON CACHE BOOL "" FORCE)
## 驱动不能加 empty.cpp 影响sdv
#if (
# # _type_ MATCHES "sys" OR
# _type_ MATCHES "object"
#)
#
# message("222222222222 ${_name_}")
#
# # message("create [${_type_}] [${name}] [${_rely_domain_}] [${empty_file}] ")
# target_sources(${_name_} ${_rely_domain_} ${empty_file})
#
# return()
#endif ()
if(0 AND MSVC)
# TODO:临时设置 为什么 vs2019 不用预设也能编译
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/toolchain/vs2019.cmake)
include(${CMAKE_TOOLCHAIN_FILE})
endif()
include(0_cmake_library/main.cmake)
_add_binary_to_clion()
_load_cmake_library()
rcl_init()
+52
View File
@@ -0,0 +1,52 @@
$ErrorActionPreference = "Stop"
$toolsDir = "D:\ae\tools"
$installDir = "D:\ae\tools\ccache"
$cacheDir = "D:\ae\tools\ccache-cache"
$tmpDir = Join-Path $env:TEMP "ccache_install"
$apiUrl = "https://api.github.com/repos/ccache/ccache/releases/latest"
New-Item -ItemType Directory -Force -Path $toolsDir | Out-Null
New-Item -ItemType Directory -Force -Path $cacheDir | Out-Null
if(Test-Path $tmpDir) {
Remove-Item -Recurse -Force $tmpDir
}
New-Item -ItemType Directory -Force -Path $tmpDir | Out-Null
Write-Host "获取 ccache 最新版本信息..."
$release = Invoke-RestMethod -Uri $apiUrl -Headers @{ "User-Agent" = "PowerShell" }
$asset = $release.assets | Where-Object { $_.name -match "windows-x86_64\.zip$" } | Select-Object -First 1
if($null -eq $asset) {
throw "没有找到 Windows x86_64 版本的 ccache zip 包"
}
$zipFile = Join-Path $tmpDir $asset.name
Write-Host "下载 $($asset.name)..."
Invoke-WebRequest -Uri $asset.browser_download_url -OutFile $zipFile
Write-Host "解压..."
Expand-Archive -Path $zipFile -DestinationPath $tmpDir -Force
$ccacheExe = Get-ChildItem -Path $tmpDir -Filter "ccache.exe" -Recurse | Select-Object -First 1
if($null -eq $ccacheExe) {
throw "解压后没有找到 ccache.exe"
}
if(Test-Path $installDir) {
Remove-Item -Recurse -Force $installDir
}
New-Item -ItemType Directory -Force -Path $installDir | Out-Null
Copy-Item -Path (Join-Path $ccacheExe.DirectoryName "*") -Destination $installDir -Recurse -Force
[Environment]::SetEnvironmentVariable("CCACHE_DIR", $cacheDir, "User")
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
$paths = $userPath -split ";"
if($paths -notcontains $installDir) {
if([string]::IsNullOrWhiteSpace($userPath)) {
$newPath = $installDir
} else {
$newPath = "$userPath;$installDir"
}
[Environment]::SetEnvironmentVariable("Path", $newPath, "User")
}
$env:Path = "$installDir;$env:Path"
$env:CCACHE_DIR = $cacheDir
& "$installDir\ccache.exe" --version
& "$installDir\ccache.exe" -M 20G
& "$installDir\ccache.exe" -s
Remove-Item -Recurse -Force $tmpDir
Write-Host "ccache 已安装到: $installDir"
Write-Host "ccache 缓存目录: $cacheDir"
Write-Host "已经写入用户 PATH,新开的 PowerShell 窗口可直接使用 ccache"
+31
View File
@@ -0,0 +1,31 @@
$ErrorActionPreference = "Stop"
$installDir = "D:\ae\tools\ccache"
$cacheDir = "D:\ae\tools\ccache-cache"
$tmpDir = "D:\ae\tools\ccache-tmp"
New-Item -ItemType Directory -Force -Path $installDir | Out-Null
New-Item -ItemType Directory -Force -Path $cacheDir | Out-Null
New-Item -ItemType Directory -Force -Path $tmpDir | Out-Null
[Environment]::SetEnvironmentVariable("CCACHE_DIR", $cacheDir, "User")
[Environment]::SetEnvironmentVariable("CCACHE_MAXSIZE", "20G", "User")
[Environment]::SetEnvironmentVariable("CCACHE_TEMPDIR", $tmpDir, "User")
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
$paths = $userPath -split ";"
if($paths -notcontains $installDir) {
if([string]::IsNullOrWhiteSpace($userPath)) {
$newPath = $installDir
} else {
$newPath = "$userPath;$installDir"
}
[Environment]::SetEnvironmentVariable("Path", $newPath, "User")
}
$env:Path = "$installDir;$env:Path"
$env:CCACHE_DIR = $cacheDir
$env:CCACHE_MAXSIZE = "20G"
$env:CCACHE_TEMPDIR = $tmpDir
& "$installDir\ccache.exe" --show-config
& "$installDir\ccache.exe" --show-stats
Write-Host "ccache 环境变量已设置"
Write-Host "ccache 安装目录: $installDir"
Write-Host "ccache 缓存目录: $cacheDir"
Write-Host "ccache 临时目录: $tmpDir"
Write-Host "已经写入用户 PATH,新开的 PowerShell 窗口可直接使用 ccache"
+1
View File
@@ -0,0 +1 @@
https://ccache.dev/download.html
+79 -79
View File
@@ -1,85 +1,85 @@
set(dir "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64")
set(CMAKE_CXX_COMPILER "${dir}/cl.exe")
set(CMAKE_C_COMPILER "${dir}/cl.exe")
set(CMAKE_LINKER "${dir}/link.exe")
#set(dir "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64")
#
#set(CMAKE_CXX_COMPILER "${dir}/cl.exe")
#set(CMAKE_C_COMPILER "${dir}/cl.exe")
#set(CMAKE_LINKER "${dir}/link.exe")
if(CMAKE_HOST_WIN32 AND CMAKE_GENERATOR MATCHES "Ninja")
message(STATUS "CMAKE_GENERATOR = ${CMAKE_GENERATOR}")
message(STATUS "CMAKE_GENERATOR_INSTANCE = ${CMAKE_GENERATOR_INSTANCE}")
message(STATUS "CMAKE_GENERATOR_TOOLSET = ${CMAKE_GENERATOR_TOOLSET}")
message(STATUS "CMAKE_GENERATOR_PLATFORM = ${CMAKE_GENERATOR_PLATFORM}")
message(STATUS "CMAKE_MAKE_PROGRAM before = ${CMAKE_MAKE_PROGRAM}")
file(GLOB CLION_NINJA_CANDIDATES
"C:/Program Files/JetBrains/CLion */bin/ninja/win/x64/ninja.exe"
)
list(SORT CLION_NINJA_CANDIDATES ORDER DESCENDING)
if(CLION_NINJA_CANDIDATES)
list(GET CLION_NINJA_CANDIDATES 0 CLION_NINJA_EXE)
message(STATUS "CLION_NINJA_EXE = ${CLION_NINJA_EXE}")
set(CMAKE_MAKE_PROGRAM "${CLION_NINJA_EXE}" CACHE FILEPATH "Ninja executable" FORCE)
else()
message(WARNING "CLion ninja.exe not found")
endif()
message(STATUS "CMAKE_MAKE_PROGRAM after = ${CMAKE_MAKE_PROGRAM}")
# 输出 Ninja 版本
execute_process(
COMMAND "${CMAKE_MAKE_PROGRAM}" --version
OUTPUT_VARIABLE _ninja_version
ERROR_VARIABLE _ninja_version_err
RESULT_VARIABLE _ninja_version_ret
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
message(STATUS "Ninja version ret = ${_ninja_version_ret}")
message(STATUS "Ninja version = ${_ninja_version}")
if(_ninja_version_err)
message(STATUS "Ninja version err = ${_ninja_version_err}")
endif()
# 输出 Ninja Windows 编码模式
execute_process(
COMMAND "${CMAKE_MAKE_PROGRAM}" -t wincodepage
OUTPUT_VARIABLE _ninja_wincodepage
ERROR_VARIABLE _ninja_wincodepage_err
RESULT_VARIABLE _ninja_wincodepage_ret
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
message(STATUS "Ninja wincodepage ret = ${_ninja_wincodepage_ret}")
message(STATUS "Ninja wincodepage = ${_ninja_wincodepage}")
if(_ninja_wincodepage_err)
message(STATUS "Ninja wincodepage err = ${_ninja_wincodepage_err}")
endif()
# 输出当前 cmd 代码页
execute_process(
COMMAND cmd /c chcp
OUTPUT_VARIABLE _cmd_chcp
ERROR_VARIABLE _cmd_chcp_err
RESULT_VARIABLE _cmd_chcp_ret
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
message(STATUS "cmd chcp ret = ${_cmd_chcp_ret}")
message(STATUS "cmd chcp = ${_cmd_chcp}")
if(_cmd_chcp_err)
message(STATUS "cmd chcp err = ${_cmd_chcp_err}")
endif()
endif()
#if(CMAKE_HOST_WIN32 AND CMAKE_GENERATOR MATCHES "Ninja")
#
#
# message(STATUS "CMAKE_GENERATOR = ${CMAKE_GENERATOR}")
# message(STATUS "CMAKE_GENERATOR_INSTANCE = ${CMAKE_GENERATOR_INSTANCE}")
# message(STATUS "CMAKE_GENERATOR_TOOLSET = ${CMAKE_GENERATOR_TOOLSET}")
# message(STATUS "CMAKE_GENERATOR_PLATFORM = ${CMAKE_GENERATOR_PLATFORM}")
# message(STATUS "CMAKE_MAKE_PROGRAM before = ${CMAKE_MAKE_PROGRAM}")
#
# file(GLOB CLION_NINJA_CANDIDATES
# "C:/Program Files/JetBrains/CLion */bin/ninja/win/x64/ninja.exe"
# )
#
# list(SORT CLION_NINJA_CANDIDATES ORDER DESCENDING)
#
# if(CLION_NINJA_CANDIDATES)
# list(GET CLION_NINJA_CANDIDATES 0 CLION_NINJA_EXE)
# message(STATUS "CLION_NINJA_EXE = ${CLION_NINJA_EXE}")
#
# set(CMAKE_MAKE_PROGRAM "${CLION_NINJA_EXE}" CACHE FILEPATH "Ninja executable" FORCE)
# else()
# message(WARNING "CLion ninja.exe not found")
# endif()
#
# message(STATUS "CMAKE_MAKE_PROGRAM after = ${CMAKE_MAKE_PROGRAM}")
#
# # 输出 Ninja 版本
# execute_process(
# COMMAND "${CMAKE_MAKE_PROGRAM}" --version
# OUTPUT_VARIABLE _ninja_version
# ERROR_VARIABLE _ninja_version_err
# RESULT_VARIABLE _ninja_version_ret
# OUTPUT_STRIP_TRAILING_WHITESPACE
# ERROR_STRIP_TRAILING_WHITESPACE
# )
#
# message(STATUS "Ninja version ret = ${_ninja_version_ret}")
# message(STATUS "Ninja version = ${_ninja_version}")
# if(_ninja_version_err)
# message(STATUS "Ninja version err = ${_ninja_version_err}")
# endif()
#
# # 输出 Ninja Windows 编码模式
# execute_process(
# COMMAND "${CMAKE_MAKE_PROGRAM}" -t wincodepage
# OUTPUT_VARIABLE _ninja_wincodepage
# ERROR_VARIABLE _ninja_wincodepage_err
# RESULT_VARIABLE _ninja_wincodepage_ret
# OUTPUT_STRIP_TRAILING_WHITESPACE
# ERROR_STRIP_TRAILING_WHITESPACE
# )
#
# message(STATUS "Ninja wincodepage ret = ${_ninja_wincodepage_ret}")
# message(STATUS "Ninja wincodepage = ${_ninja_wincodepage}")
# if(_ninja_wincodepage_err)
# message(STATUS "Ninja wincodepage err = ${_ninja_wincodepage_err}")
# endif()
#
# # 输出当前 cmd 代码页
# execute_process(
# COMMAND cmd /c chcp
# OUTPUT_VARIABLE _cmd_chcp
# ERROR_VARIABLE _cmd_chcp_err
# RESULT_VARIABLE _cmd_chcp_ret
# OUTPUT_STRIP_TRAILING_WHITESPACE
# ERROR_STRIP_TRAILING_WHITESPACE
# )
#
# message(STATUS "cmd chcp ret = ${_cmd_chcp_ret}")
# message(STATUS "cmd chcp = ${_cmd_chcp}")
# if(_cmd_chcp_err)
# message(STATUS "cmd chcp err = ${_cmd_chcp_err}")
# endif()
#endif()