Skip to content

Commit aa44d24

Browse files
16bit-ykikoclaude
andcommitted
refactor(cmake): clean up toolchain and CMakeLists separation
- toolchain.cmake: only clang/lld specific setup (compiler paths, LLVM tools, -fuse-ld=lld) - Promote -ffunction-sections/-fdata-sections and platform linker flags (gc-sections, dead_strip, static-libstdc++) to global scope so FetchContent deps also benefit from dead code elimination - Promote _LIBCPP_DISABLE_AVAILABILITY to global scope - Simplify clice_options to only project-specific settings: -fno-rtti, -fno-exceptions, warnings, compile definitions, Win32 system libs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent bc04845 commit aa44d24

File tree

2 files changed

+61
-70
lines changed

2 files changed

+61
-70
lines changed

CMakeLists.txt

Lines changed: 39 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,27 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
1414

1515
option(CLICE_ENABLE_LTO "Enable ThinLTO for all targets" OFF)
1616

17-
# Make sure all third libraries are affected by ABI related options
17+
# Global flags that apply to all targets (including FetchContent dependencies).
18+
if(NOT MSVC)
19+
add_compile_options(-ffunction-sections -fdata-sections)
20+
endif()
21+
22+
if(APPLE)
23+
# https://conda-forge.org/docs/maintainer/knowledge_base/#newer-c-features-with-old-sdk
24+
add_compile_definitions(_LIBCPP_DISABLE_AVAILABILITY=1)
25+
endif()
26+
27+
if(WIN32)
28+
string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,/OPT:REF")
29+
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,/OPT:REF")
30+
elseif(APPLE)
31+
string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,-dead_strip")
32+
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,-dead_strip")
33+
else()
34+
string(APPEND CMAKE_EXE_LINKER_FLAGS " -static-libstdc++ -static-libgcc -Wl,--gc-sections")
35+
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,--gc-sections")
36+
endif()
37+
1838
if(CLICE_USE_LIBCXX)
1939
string(APPEND CMAKE_CXX_FLAGS " -stdlib=libc++")
2040
string(APPEND CMAKE_EXE_LINKER_FLAGS " -stdlib=libc++")
@@ -33,7 +53,6 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
3353
add_compile_options(-fsanitize=address)
3454

3555
if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
36-
# clang-cl (MSVC frontend): manually link ASan runtime.
3756
execute_process(
3857
COMMAND ${CMAKE_CXX_COMPILER} --print-resource-dir
3958
OUTPUT_VARIABLE CLANG_RESOURCE_DIR
@@ -47,81 +66,50 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
4766
list(APPEND ASAN_LINK_FLAGS "/wholearchive:clang_rt.asan_dynamic_runtime_thunk-x86_64.lib")
4867

4968
foreach(flag ${ASAN_LINK_FLAGS})
50-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}")
51-
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${flag}")
52-
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${flag}")
69+
string(APPEND CMAKE_EXE_LINKER_FLAGS " ${flag}")
70+
string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${flag}")
71+
string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${flag}")
5372
endforeach()
5473
else()
55-
# GNU frontend (clang++/gcc): -fsanitize=address handles linking automatically.
5674
string(APPEND CMAKE_EXE_LINKER_FLAGS " -fsanitize=address")
5775
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -fsanitize=address")
5876
endif()
5977

6078
if(WIN32)
61-
# Disable Identical COMDAT Folding in Debug to avoid ASan ODR false positives.
6279
string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,/OPT:NOICF")
6380
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,/OPT:NOICF")
6481
endif()
6582
endif()
6683

67-
if(APPLE)
68-
# https://conda-forge.org/docs/maintainer/knowledge_base/#newer-c-features-with-old-sdk
69-
string(APPEND CMAKE_CXX_FLAGS " -D_LIBCPP_DISABLE_AVAILABILITY=1")
70-
endif()
71-
7284
include("${PROJECT_SOURCE_DIR}/cmake/package.cmake")
7385

86+
# Project-specific options (not applied to third-party deps).
7487
add_library(clice_options INTERFACE)
7588

76-
if(CLICE_ENABLE_TEST)
77-
target_compile_definitions(clice_options INTERFACE CLICE_ENABLE_TEST=1)
78-
endif()
79-
80-
if(CLICE_CI_ENVIRONMENT)
81-
target_compile_definitions(clice_options INTERFACE CLICE_CI_ENVIRONMENT=1)
82-
endif()
83-
84-
if(WIN32)
85-
target_link_libraries(clice_options INTERFACE version ntdll)
86-
endif()
87-
88-
if(WIN32)
89-
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
90-
target_link_options(clice_options INTERFACE
91-
-fuse-ld=lld-link
92-
-Wl,/OPT:REF
93-
#,/OPT:NOICF
94-
)
95-
elseif(APPLE)
96-
target_link_options(clice_options INTERFACE
97-
-fuse-ld=lld
98-
-Wl,-dead_strip
99-
)
100-
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
101-
target_link_options(clice_options INTERFACE
102-
-fuse-ld=lld
103-
-static-libstdc++ -static-libgcc
104-
-Wl,--gc-sections
105-
)
106-
endif()
107-
10889
if(MSVC OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND
10990
CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC"))
110-
target_compile_options(clice_options INTERFACE
111-
/GR-
112-
/EHsc-
113-
/Zc:preprocessor
114-
)
91+
target_compile_options(clice_options INTERFACE /GR- /EHsc- /Zc:preprocessor)
11592
else()
11693
target_compile_options(clice_options INTERFACE
11794
-fno-rtti
95+
-fno-exceptions
11896
-Wno-deprecated-declarations
119-
-ffunction-sections
120-
-fdata-sections
12197
$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wno-undefined-inline>
12298
)
12399
endif()
124100

101+
if(WIN32)
102+
target_link_libraries(clice_options INTERFACE version ntdll)
103+
endif()
104+
105+
if(CLICE_ENABLE_TEST)
106+
target_compile_definitions(clice_options INTERFACE CLICE_ENABLE_TEST=1)
107+
endif()
108+
109+
if(CLICE_CI_ENVIRONMENT)
110+
target_compile_definitions(clice_options INTERFACE CLICE_CI_ENVIRONMENT=1)
111+
endif()
112+
125113
set(FBS_SCHEMA_FILE "${PROJECT_SOURCE_DIR}/src/index/schema.fbs")
126114
set(GENERATED_HEADER "${PROJECT_BINARY_DIR}/generated/schema_generated.h")
127115

cmake/toolchain.cmake

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,39 @@
11
cmake_minimum_required(VERSION 3.30)
22

3-
set(CMAKE_C_COMPILER clang CACHE STRING "C compiler")
4-
set(CMAKE_CXX_COMPILER clang++ CACHE STRING "C++ compiler")
5-
set(AR_PROGRAM_NAME "llvm-ar")
6-
set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld" CACHE STRING "Executable linker flags")
7-
set(CMAKE_SHARED_LINKER_FLAGS "-fuse-ld=lld" CACHE STRING "Shared library linker flags")
8-
set(CMAKE_MODULE_LINKER_FLAGS "-fuse-ld=lld" CACHE STRING "Module linker flags")
3+
set(CMAKE_C_COMPILER clang CACHE STRING "")
4+
set(CMAKE_CXX_COMPILER clang++ CACHE STRING "")
95

10-
if(WIN32)
11-
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL" CACHE STRING "MSVC runtime")
12-
endif()
13-
14-
find_program(LLVM_AR_PATH ${AR_PROGRAM_NAME})
6+
find_program(LLVM_AR_PATH "llvm-ar")
157
if(LLVM_AR_PATH)
16-
set(CMAKE_AR "${LLVM_AR_PATH}" CACHE FILEPATH "Archiver")
17-
set(CMAKE_C_COMPILER_AR "${LLVM_AR_PATH}" CACHE FILEPATH "C archiver")
18-
set(CMAKE_CXX_COMPILER_AR "${LLVM_AR_PATH}" CACHE FILEPATH "C++ archiver")
8+
set(CMAKE_AR "${LLVM_AR_PATH}" CACHE FILEPATH "")
9+
set(CMAKE_C_COMPILER_AR "${LLVM_AR_PATH}" CACHE FILEPATH "")
10+
set(CMAKE_CXX_COMPILER_AR "${LLVM_AR_PATH}" CACHE FILEPATH "")
1911
endif()
2012

2113
find_program(LLVM_RANLIB_PATH "llvm-ranlib")
2214
if(LLVM_RANLIB_PATH)
23-
set(CMAKE_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "Ranlib")
24-
set(CMAKE_C_COMPILER_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "C ranlib")
25-
set(CMAKE_CXX_COMPILER_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "C++ ranlib")
15+
set(CMAKE_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "")
16+
set(CMAKE_C_COMPILER_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "")
17+
set(CMAKE_CXX_COMPILER_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "")
2618
endif()
2719

2820
find_program(LLVM_NM_PATH "llvm-nm")
2921
if(LLVM_NM_PATH)
30-
set(CMAKE_NM "${LLVM_NM_PATH}" CACHE FILEPATH "Symbol lister")
22+
set(CMAKE_NM "${LLVM_NM_PATH}" CACHE FILEPATH "")
3123
endif()
3224

3325
find_program(LLVM_RC_PATH "llvm-rc")
3426
if(LLVM_RC_PATH)
35-
set(CMAKE_RC_COMPILER "${LLVM_RC_PATH}" CACHE FILEPATH "Resource compiler")
27+
set(CMAKE_RC_COMPILER "${LLVM_RC_PATH}" CACHE FILEPATH "")
28+
endif()
29+
30+
if(WIN32)
31+
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL" CACHE STRING "")
32+
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld-link")
33+
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld-link")
34+
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld-link")
35+
else()
36+
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
37+
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
38+
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
3639
endif()

0 commit comments

Comments
 (0)