Skip to content

Commit 156aa38

Browse files
16bit-ykikoclaude
andcommitted
feat(cmake): add release packaging with symbol separation
Add CLICE_RELEASE option that enables LTO and produces two archives: - clice.tar.gz: stripped binary + clang resource dir + config - clice-symbol.tar.gz: debug symbols for crash analysis Platform-specific symbol handling: objcopy on Linux, dsymutil on macOS, PDB on Windows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent c8f8628 commit 156aa38

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed

CMakeLists.txt

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ option(CLICE_OFFLINE_BUILD "Disable network downloads during configuration" OFF)
1818
option(CLICE_ENABLE_TEST "Build unit tests" OFF)
1919
option(CLICE_CI_ENVIRONMENT "Enable CI-specific configuration" OFF)
2020
option(CLICE_ENABLE_BENCHMARK "Build benchmarks" OFF)
21+
option(CLICE_RELEASE "Enable release packaging (LTO + strip + pack)" OFF)
2122

2223
# Global flags that apply to all targets (including FetchContent dependencies).
2324
if(NOT MSVC)
@@ -46,6 +47,10 @@ if(CLICE_USE_LIBCXX)
4647
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -stdlib=libc++")
4748
endif()
4849

50+
if(CLICE_RELEASE)
51+
set(CLICE_ENABLE_LTO ON)
52+
endif()
53+
4954
if(CLICE_ENABLE_LTO)
5055
string(APPEND CMAKE_C_FLAGS " -flto=thin")
5156
string(APPEND CMAKE_CXX_FLAGS " -flto=thin")
@@ -236,3 +241,78 @@ if(CLICE_ENABLE_BENCHMARK)
236241
)
237242
target_link_libraries(scan_benchmark PRIVATE clice::core eventide::deco)
238243
endif()
244+
245+
if(CLICE_RELEASE)
246+
set(CLICE_PACK_DIR "${PROJECT_BINARY_DIR}/pack")
247+
set(CLICE_SYMBOL_DIR "${PROJECT_BINARY_DIR}/pack-symbol")
248+
249+
if(WIN32)
250+
set(CLICE_ARCHIVE_EXT ".zip")
251+
else()
252+
set(CLICE_ARCHIVE_EXT ".tar.gz")
253+
endif()
254+
255+
if(WIN32)
256+
set(CLICE_EXE_NAME "clice.exe")
257+
set(CLICE_SYMBOL_NAME "clice.pdb")
258+
elseif(APPLE)
259+
set(CLICE_EXE_NAME "clice")
260+
set(CLICE_SYMBOL_NAME "clice.dSYM")
261+
else()
262+
set(CLICE_EXE_NAME "clice")
263+
set(CLICE_SYMBOL_NAME "clice.debug")
264+
endif()
265+
266+
if(WIN32)
267+
add_custom_target(clice-strip ALL
268+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CLICE_SYMBOL_DIR}"
269+
DEPENDS clice
270+
COMMENT "Collecting PDB for clice"
271+
)
272+
elseif(APPLE)
273+
add_custom_target(clice-strip ALL
274+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CLICE_SYMBOL_DIR}"
275+
COMMAND dsymutil "$<TARGET_FILE:clice>" -o "${CLICE_SYMBOL_DIR}/${CLICE_SYMBOL_NAME}"
276+
COMMAND strip -x "$<TARGET_FILE:clice>"
277+
DEPENDS clice
278+
COMMENT "Extracting dSYM and stripping clice"
279+
)
280+
else()
281+
add_custom_target(clice-strip ALL
282+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CLICE_SYMBOL_DIR}"
283+
COMMAND ${CMAKE_OBJCOPY} --only-keep-debug "$<TARGET_FILE:clice>" "${CLICE_SYMBOL_DIR}/${CLICE_SYMBOL_NAME}"
284+
COMMAND ${CMAKE_STRIP} --strip-debug --strip-unneeded "$<TARGET_FILE:clice>"
285+
COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink="${CLICE_SYMBOL_DIR}/${CLICE_SYMBOL_NAME}" "$<TARGET_FILE:clice>"
286+
DEPENDS clice
287+
COMMENT "Extracting debug symbols and stripping clice"
288+
)
289+
endif()
290+
291+
add_custom_target(clice-pack ALL
292+
DEPENDS clice-strip copy_clang_resource
293+
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CLICE_PACK_DIR}"
294+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CLICE_PACK_DIR}/clice/bin"
295+
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:clice>" "${CLICE_PACK_DIR}/clice/bin/"
296+
COMMAND ${CMAKE_COMMAND} -E copy_directory "${LLVM_INSTALL_PATH}/lib/clang" "${CLICE_PACK_DIR}/clice/lib/clang"
297+
COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/docs/clice.toml" "${CLICE_PACK_DIR}/clice/"
298+
COMMAND ${CMAKE_COMMAND}
299+
-DARCHIVE_DIR="${CLICE_PACK_DIR}/clice"
300+
-DOUTPUT="${PROJECT_BINARY_DIR}/clice${CLICE_ARCHIVE_EXT}"
301+
-DWORK_DIR="${CLICE_PACK_DIR}"
302+
-P "${PROJECT_SOURCE_DIR}/cmake/archive.cmake"
303+
COMMENT "Packaging clice distribution"
304+
)
305+
306+
add_custom_target(clice-pack-symbol ALL
307+
DEPENDS clice-strip
308+
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CLICE_SYMBOL_DIR}/pack"
309+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CLICE_SYMBOL_DIR}/pack"
310+
COMMAND ${CMAKE_COMMAND} -E copy "${CLICE_SYMBOL_DIR}/${CLICE_SYMBOL_NAME}" "${CLICE_SYMBOL_DIR}/pack/"
311+
COMMAND ${CMAKE_COMMAND}
312+
-DARCHIVE_DIR="${CLICE_SYMBOL_DIR}/pack"
313+
-DOUTPUT="${PROJECT_BINARY_DIR}/clice-symbol${CLICE_ARCHIVE_EXT}"
314+
-DWORK_DIR="${CLICE_SYMBOL_DIR}/pack"
315+
-P "${PROJECT_SOURCE_DIR}/cmake/archive.cmake"
316+
COMMENT "Packaging clice debug symbols"
317+
)
318+
endif()

cmake/archive.cmake

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
if(OUTPUT MATCHES "\\.tar\\.gz$")
2+
execute_process(
3+
COMMAND ${CMAKE_COMMAND} -E tar czf "${OUTPUT}" .
4+
WORKING_DIRECTORY "${WORK_DIR}"
5+
COMMAND_ERROR_IS_FATAL ANY
6+
)
7+
elseif(OUTPUT MATCHES "\\.zip$")
8+
execute_process(
9+
COMMAND ${CMAKE_COMMAND} -E tar cf "${OUTPUT}" --format=zip .
10+
WORKING_DIRECTORY "${WORK_DIR}"
11+
COMMAND_ERROR_IS_FATAL ANY
12+
)
13+
else()
14+
message(FATAL_ERROR "Unsupported archive format: ${OUTPUT}")
15+
endif()
16+
17+
message(STATUS "Created: ${OUTPUT}")

0 commit comments

Comments
 (0)