|
| 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 | +endif() |
0 commit comments