-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
139 lines (120 loc) · 6.81 KB
/
CMakeLists.txt
File metadata and controls
139 lines (120 loc) · 6.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
cmake_minimum_required(VERSION 3.15)
project(maxcomp
VERSION 2.2.0
DESCRIPTION "MaxCompression — Revolutionary file compression library"
LANGUAGES C
)
# ─── Prevent in-source builds ────────────────────────────────────────
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
message(FATAL_ERROR "In-source builds are not allowed. Use: cmake -S . -B build")
endif()
# ─── C Standard ──────────────────────────────────────────────────────
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
# ─── OpenMP (optional — parallel block compression) ─────────────────
find_package(OpenMP QUIET)
if(OpenMP_C_FOUND)
message(STATUS "OpenMP found — parallel compression enabled")
else()
message(STATUS "OpenMP not found — single-threaded mode")
endif()
# ─── Build Options ───────────────────────────────────────────────────
# Shared lib disabled on Windows by default: MSVC produces an import .lib that
# collides with the static .lib name, causing LNK2019 errors for internal symbols.
if(WIN32)
option(BUILD_SHARED_LIBS "Build shared library (DLL/so/dylib)" OFF)
else()
option(BUILD_SHARED_LIBS "Build shared library (DLL/so/dylib)" ON)
endif()
option(MCX_BUILD_CLI "Build the mcx command-line tool" ON)
option(MCX_BUILD_TESTS "Build unit tests" ON)
option(MCX_BUILD_BENCHMARKS "Build benchmarks" ON)
option(MCX_CODE_COVERAGE "Build with gcov code coverage" OFF)
# ─── Code Coverage ───────────────────────────────────────────────────
if(MCX_CODE_COVERAGE)
if(NOT CMAKE_C_COMPILER_ID STREQUAL "GNU")
message(FATAL_ERROR "Code coverage requires GCC (CMAKE_C_COMPILER=gcc)")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage")
message(STATUS "Code coverage enabled (gcov)")
endif()
# ─── Output directories ─────────────────────────────────────────────
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# ─── Library (always built) ──────────────────────────────────────────
add_subdirectory(lib)
# ─── CLI tool ────────────────────────────────────────────────────────
if(MCX_BUILD_CLI)
add_subdirectory(cli)
endif()
# ─── Tests ───────────────────────────────────────────────────────────
if(MCX_BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
# ─── Benchmarks ──────────────────────────────────────────────────────
if(MCX_BUILD_BENCHMARKS)
add_subdirectory(benchmarks)
endif()
# ─── Summary ─────────────────────────────────────────────────────────
message(STATUS "")
message(STATUS "╔══════════════════════════════════════════════╗")
message(STATUS "║ MaxCompression v${PROJECT_VERSION} ║")
message(STATUS "╠══════════════════════════════════════════════╣")
message(STATUS "║ Shared library: ${BUILD_SHARED_LIBS}")
message(STATUS "║ CLI tool: ${MCX_BUILD_CLI}")
message(STATUS "║ Tests: ${MCX_BUILD_TESTS}")
message(STATUS "║ Benchmarks: ${MCX_BUILD_BENCHMARKS}")
message(STATUS "║ C Compiler: ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}")
message(STATUS "║ Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "╚══════════════════════════════════════════════╝")
message(STATUS "")
# ─── Install targets ─────────────────────────────────────────────────
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/maxcomp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(TARGETS maxcomp_static
EXPORT MaxCompressionTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
if(BUILD_SHARED_LIBS)
install(TARGETS maxcomp_shared
EXPORT MaxCompressionTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
endif()
if(MCX_BUILD_CLI)
install(TARGETS mcx RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
# ─── CMake package config (find_package support) ─────────────────────
install(EXPORT MaxCompressionTargets
FILE MaxCompressionTargets.cmake
NAMESPACE MaxCompression::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MaxCompression
)
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/MaxCompressionConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/MaxCompressionConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MaxCompression
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/MaxCompressionConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/MaxCompressionConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/MaxCompressionConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MaxCompression
)
# ─── pkg-config ──────────────────────────────────────────────────────
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/maxcomp.pc.in
${CMAKE_CURRENT_BINARY_DIR}/maxcomp.pc
@ONLY
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/maxcomp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)