添加ccache 加速编译
This commit is contained in:
@@ -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
@@ -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
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -0,0 +1 @@
|
||||
https://ccache.dev/download.html
|
||||
+79
-79
@@ -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()
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user