1+ # This file is part of the libdecimal project and is licensed under the MIT License.
2+ #
3+ # Copyright © 2025–2026 Varga Labs, Toronto, ON, Canada 🇨🇦
4+ # Contact: info@vargalabs.com
5+
6+ cmake_minimum_required (VERSION 3.22 )
7+ project (libdecimal VERSION 0.1.0 DESCRIPTION "Deterministic Decimal Arithmetic Built on Intel LIBBID" LANGUAGES CXX )
8+
9+ include (GNUInstallDirs )
10+ include (CMakePackageConfigHelpers )
11+ include (CTest )
12+
13+ set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
14+
15+ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
16+ message (WARNING "In-source builds are discouraged. Skipping compile_commands.json symlink." )
17+ else ()
18+ execute_process (
19+ COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_BINARY_DIR} /compile_commands.json ${CMAKE_SOURCE_DIR} /compile_commands.json
20+ RESULT_VARIABLE symlink_result OUTPUT_QUIET ERROR_QUIET )
21+ endif ()
22+
23+ set (CMAKE_CXX_STANDARD 23)
24+ set (CMAKE_CXX_STANDARD_REQUIRED ON )
25+ set (CMAKE_CXX_EXTENSIONS OFF )
26+
27+ option (libdecimal_BUILD_TESTS "Build tests" ${BUILD_TESTING} )
28+ option (libdecimal_BUILD_DOCS "Enable MkDocs documentation targets" ON )
29+
30+ set (git_commit_hash "unknown" )
31+ set (git_tag "" )
32+
33+ find_package (Git QUIET )
34+ if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR} /.git" )
35+ execute_process ( COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE git_commit_hash OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET )
36+ execute_process ( COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE git_tag OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET )
37+ endif ()
38+
39+ if (git_tag)
40+ set (libdecimal_version_string "${git_tag} " )
41+ else ()
42+ set (libdecimal_version_string "${PROJECT_VERSION} " )
43+ endif ()
44+
45+ # Third-party dependencies
46+ add_subdirectory (thirdparty EXCLUDE_FROM_ALL )
47+ # Public library target
48+
49+ add_library (libdecimal INTERFACE )
50+ add_library (libdecimal::libdecimal ALIAS libdecimal )
51+ target_compile_features (libdecimal INTERFACE cxx_std_23 )
52+ target_include_directories (libdecimal INTERFACE $<BUILD_INTERFACE :${CMAKE_SOURCE_DIR} /include > $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >)
53+ target_compile_definitions (libdecimal INTERFACE libdecimal_SOFTWARE_VERSION= "${libdecimal_version_string} " libdecimal_SOFTWARE_COMMIT_HASH= "${git_commit_hash} " )
54+ target_link_libraries (libdecimal INTERFACE libdecimal::libbid_static )
55+ # ------------------------------------------------------------------------------
56+ # Installation
57+ # ------------------------------------------------------------------------------
58+ install ( FILES ${CMAKE_SOURCE_DIR} /include/libdecimal.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
59+ install ( TARGETS libdecimal libbid_static EXPORT libdecimal_targets)
60+ install ( FILES ${libbid_static_archive} DESTINATION ${CMAKE_INSTALL_LIBDIR} )
61+ install ( DIRECTORY ${libbid_static_include_dir} / DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /libbid FILES_MATCHING PATTERN "*.h" )
62+ install ( EXPORT libdecimal_targets FILE libdecimal_targets.cmake NAMESPACE libdecimal:: DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/libdecimal)
63+
64+ configure_package_config_file ( ${CMAKE_SOURCE_DIR} /cmake/libdecimal_config.cmake.in ${CMAKE_BINARY_DIR} /libdecimal_config.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/libdecimal )
65+ write_basic_package_version_file ( ${CMAKE_BINARY_DIR} /libdecimal_config_version.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion )
66+ install ( FILES ${CMAKE_BINARY_DIR} /libdecimal_config.cmake ${CMAKE_BINARY_DIR} /libdecimal_config_version.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/libdecimal )
67+ # ------------------------------------------------------------------------------
68+ # Tests
69+ # ------------------------------------------------------------------------------
70+ if (libdecimal_BUILD_TESTS)
71+ enable_testing ()
72+ function (add_test_case file_name )
73+ add_executable (test -${file_name} test /${file_name}.cpp )
74+ set_target_properties (test -${file_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} )
75+ target_link_libraries (test -${file_name} PRIVATE libdecimal::libdecimal libdoctest )
76+ if (CMAKE_BUILD_TYPE MATCHES "Debug" )
77+ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" )
78+ target_compile_options (test -${file_name} PRIVATE -fsanitize=address,undefined -fno-omit-frame-pointer )
79+ target_link_options (test -${file_name} PRIVATE -fsanitize=address,undefined )
80+ target_compile_definitions (test -${file_name} PRIVATE DEBUG )
81+ endif ()
82+ endif ()
83+ add_test (NAME test -${file_name} COMMAND test -${file_name} )
84+ endfunction ()
85+
86+ add_test_case (example )
87+ add_test_case (decimal )
88+ endif ()
89+ # ------------------------------------------------------------------------------
90+ # MkDocs Documentation Targets
91+ # ------------------------------------------------------------------------------
92+ if (libdecimal_BUILD_DOCS)
93+ find_program (PYTHON_EXECUTABLE python3 REQUIRED )
94+ set (DOCS_VENV ${CMAKE_SOURCE_DIR} /.venv)
95+ set (DOCS_ACTIVATE ${DOCS_VENV} /bin/activate)
96+ set (DOCS_REQUIREMENTS ${CMAKE_SOURCE_DIR} /requirements.txt)
97+ set (DOCS_BASE_URL http://127.0.0.1:9000/blog)
98+
99+ add_custom_target (docs_venv
100+ COMMAND ${CMAKE_COMMAND} -E echo "Setting up Python virtual environment"
101+ COMMAND ${PYTHON_EXECUTABLE} -m venv ${DOCS_VENV}
102+ COMMAND ${DOCS_VENV} /bin/pip install --upgrade pip
103+ COMMAND ${DOCS_VENV} /bin/pip install -r ${DOCS_REQUIREMENTS}
104+ BYPRODUCTS ${DOCS_ACTIVATE}
105+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
106+ COMMENT "Creating .venv and installing MkDocs dependencies"
107+ VERBATIM
108+ )
109+
110+ add_custom_target (docs_serve
111+ COMMAND ${CMAKE_COMMAND} -E echo "Starting MkDocs server at ${DOCS_BASE_URL} "
112+ COMMAND ${DOCS_VENV} /bin/mkdocs serve --livereload --dev-addr=127.0.0.1:9000
113+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
114+ DEPENDS docs_venv
115+ COMMENT "Serving MkDocs site"
116+ USES_TERMINAL
117+ )
118+
119+ add_custom_target (docs_build
120+ COMMAND ${DOCS_VENV} /bin/mkdocs build
121+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
122+ DEPENDS docs_venv
123+ COMMENT "Building MkDocs site"
124+ VERBATIM
125+ )
126+
127+ add_custom_target (docs_clean
128+ COMMAND ${CMAKE_COMMAND} -E rm -rf ${DOCS_VENV}
129+ COMMAND ${CMAKE_COMMAND} -E rm -rf ${CMAKE_SOURCE_DIR} /site
130+ COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_SOURCE_DIR} /docs/assets/social/*.png
131+ COMMENT "Cleaning documentation artifacts"
132+ )
133+ endif ()
0 commit comments