| # This is a rewrite over time of the CMake file from the libe57 reference implementation |
| # https://en.wikipedia.org/wiki/Ship_of_Theseus |
| # |
| # Use git blame to see all the changes and who has contributed. |
| # |
| # Copyright 2018-2023 Andy Maloney <asmaloney@gmail.com> |
| # Original work Copyright 2010-2012 Roland Schwarz, Riegl LMS GmbH |
| # |
| # Permission is hereby granted, free of charge, to any person or organization |
| # obtaining a copy of the software and accompanying documentation covered by |
| # this license (the "Software") to use, reproduce, display, distribute, |
| # execute, and transmit the Software, and to prepare derivative works of the |
| # Software, and to permit third-parties to whom the Software is furnished to |
| # do so, all subject to the following: |
| # |
| # The copyright notices in the Software and this entire statement, including |
| # the above license grant, this restriction and the following disclaimer, |
| # must be included in all copies of the Software, in whole or in part, and |
| # all derivative works of the Software, unless such copies or derivative |
| # works are solely in the form of machine-executable object code generated by |
| # a source language processor. |
| # |
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| # FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT |
| # SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE |
| # FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, |
| # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| # DEALINGS IN THE SOFTWARE. |
|
|
| cmake_minimum_required( VERSION 3.15 ) |
|
|
| # Set a private module find path |
| set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) |
|
|
| message( STATUS "Using CMake ${CMAKE_VERSION}" ) |
|
|
| project( E57Format |
| DESCRIPTION |
| "E57Format is a library to read and write E57 files" |
| LANGUAGES |
| CXX |
| VERSION |
| 3.2.0 |
| ) |
|
|
| string( TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPERCASE ) |
|
|
| # Creates a build tag which is used in the REVISION_ID |
| # e.g. "x86_64-darwin-AppleClang140" |
| include( Tags ) |
| include( GitInfo ) |
|
|
| # Collect all our current git info using: |
| # https://github.com/cppmf/GitInfo.cmake |
| GitInfo( ${CMAKE_CURRENT_SOURCE_DIR} ) |
| # GitInfoReport() |
|
|
| # Check if we are building ourself or being included and use this to set some defaults |
| if ( ${PROJECT_NAME} STREQUAL ${CMAKE_PROJECT_NAME} ) |
| set( E57_BUILDING_SELF ON ) |
| endif() |
|
|
| # propose a default installation directory |
| if ( E57_BUILDING_SELF ) |
| if( CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT ) |
| string( REGEX REPLACE "/${PROJECT_NAME}" "" CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} ) |
| set( T_ ${PROJECT_NAME} ) |
| set( T_ ${T_}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} ) |
| set( T_ ${T_}-${${PROJECT_NAME}_BUILD_TAG} ) |
| set( CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/${T_} |
| CACHE PATH |
| "Install path prefix, prepended onto install directories." |
| FORCE |
| ) |
| endif() |
| endif() |
|
|
| find_package( Threads REQUIRED ) |
| find_package( XercesC 3.2 REQUIRED ) |
|
|
| option( E57_BUILD_SHARED |
| "Compile E57Format as a shared library" |
| OFF |
| ) |
|
|
| if( BUILD_SHARED_LIBS ) |
| set( E57_BUILD_SHARED ON ) |
| endif() |
|
|
| ######################################################################################### |
| # Cross checking and runtime verification in the code. |
| # The extra code does not change the file contents. |
| # E57_VALIDATION_LEVEL=0 off |
| # E57_VALIDATION_LEVEL=1 basic |
| # E57_VALIDATION_LEVEL=2 deep (implies basic) - checks at the packet level, so it will be slower |
| set( E57_VALIDATION_LEVEL "1" CACHE STRING "Runtime validation level (0 = OFF, 1 = basic, 2 = deep)" ) |
|
|
| # Output detailed logging while processing. |
| option( E57_VERBOSE "Compile library with verbose logging" OFF ) |
|
|
| # Enable/disable code which dumps detailed node info to std::ostream. (See NodeImpl::dump()) |
| # Instead of always including this code, it is an option for backwards compatibility. |
| # The only real reason to turn this off would be for slightly smaller binaries. |
| option( E57_ENABLE_DIAGNOSTIC_OUTPUT "Include code for diagnostic output using dump() on nodes" ON ) |
|
|
| # Enable writing packets that are correct but will stress the reader. |
| option( E57_WRITE_CRAZY_PACKET_MODE "Compile library to enable reader-stressing packets" OFF ) |
|
|
| # Other compile options |
|
|
| # Link-time optiomization |
| # CMake forces "thin" LTO (see https://gitlab.kitware.com/cmake/cmake/-/issues/23136) |
| # which is a problem if compiling statically for distribution (e.g. in a package manager). |
| # Generally you will only want to turn this off for distributing static release builds. |
| option( E57_RELEASE_LTO "Compile release library with link-time optimization" ON ) |
|
|
| ######################################################################################### |
|
|
| set( REVISION_ID "${PROJECT_NAME}-${PROJECT_VERSION}-${${PROJECT_NAME}_BUILD_TAG}" ) |
| if ( GIT_LATEST_TAG ) |
| set( REVISION_ID "${REVISION_ID} (git ${GIT_LATEST_TAG})" ) |
| endif() |
| message( STATUS "[${PROJECT_NAME}] Revision ID: ${REVISION_ID}" ) |
|
|
| # Target |
| if ( E57_BUILD_SHARED ) |
| message( STATUS "[${PROJECT_NAME}] Building shared library" ) |
| add_library( E57Format SHARED ${E57Format_SOURCES}) |
| else() |
| message( STATUS "[${PROJECT_NAME}] Building static library" ) |
| add_library( E57Format STATIC ${E57Format_SOURCES}) |
| endif() |
|
|
| include(CheckIPOSupported) |
| check_ipo_supported(RESULT ipo_ok OUTPUT ipo_msg) |
| if(NOT ipo_ok) |
| set(E57_RELEASE_LTO Off) |
| endif() |
|
|
| include( E57ExportHeader ) |
| include( GitUpdate ) |
|
|
| # Main sources and includes |
| add_subdirectory( extern/CRCpp ) |
| add_subdirectory( include ) |
| add_subdirectory( src ) |
|
|
| # Target properties |
| set_target_properties( E57Format |
| PROPERTIES |
| CXX_EXTENSIONS NO |
| EXPORT_COMPILE_COMMANDS ON |
| POSITION_INDEPENDENT_CODE ON |
| INTERPROCEDURAL_OPTIMIZATION ${E57_RELEASE_LTO} |
| INTERPROCEDURAL_OPTIMIZATION_DEBUG OFF |
| ) |
|
|
| if ( NOT DEFINED CMAKE_DEBUG_POSTFIX ) |
| set_target_properties( E57Format |
| PROPERTIES |
| DEBUG_POSTFIX "-d" |
| ) |
| endif() |
|
|
| if ( E57_BUILD_SHARED ) |
| set_target_properties( E57Format |
| PROPERTIES |
| VERSION ${PROJECT_VERSION} |
| SOVERSION ${PROJECT_VERSION_MAJOR} |
| ) |
| endif() |
|
|
| target_compile_features( ${PROJECT_NAME} |
| PRIVATE |
| cxx_std_14 |
| ) |
|
|
| # Warnings |
| include( CompilerWarnings ) |
|
|
| # Check our validation level |
| string( STRIP "${E57_VALIDATION_LEVEL}" E57_VALIDATION_LEVEL ) |
| if ( NOT E57_VALIDATION_LEVEL MATCHES "^[0-2]$" ) |
| message( FATAL_ERROR "[${PROJECT_NAME}] E57_VALIDATION_LEVEL should be 0-2: '${E57_VALIDATION_LEVEL}'" ) |
| else() |
| message( STATUS "[${PROJECT_NAME}] Setting validation level to ${E57_VALIDATION_LEVEL}" ) |
| endif () |
|
|
| # Target definitions |
| target_compile_definitions( E57Format |
| PRIVATE |
| REVISION_ID="${REVISION_ID}" |
| E57_VALIDATION_LEVEL=${E57_VALIDATION_LEVEL} |
| $<$<BOOL:${E57_ENABLE_DIAGNOSTIC_OUTPUT}>:E57_ENABLE_DIAGNOSTIC_OUTPUT> |
| $<$<BOOL:${E57_VERBOSE}>:E57_VERBOSE> |
| $<$<BOOL:${E57_WRITE_CRAZY_PACKET_MODE}>:E57_WRITE_CRAZY_PACKET_MODE> |
| ) |
|
|
| # sanitizers |
| include( Sanitizers ) |
|
|
| # Target Libraries |
| target_link_libraries( E57Format PRIVATE XercesC::XercesC ) |
|
|
| # Install |
| install( |
| TARGETS |
| E57Format |
| EXPORT |
| E57Format-export |
| ) |
|
|
| # ccache |
| # Turns on ccache if found |
| include( ccache ) |
|
|
| # Formatting |
| include( ClangFormat ) |
|
|
| # Testing |
| option( E57_BUILD_TEST |
| "Build tests" |
| ${E57_BUILDING_SELF} |
| ) |
|
|
| if ( E57_BUILD_TEST ) |
| message( STATUS "[${PROJECT_NAME}] Testing enabled" ) |
|
|
| enable_testing() |
|
|
| add_subdirectory( test ) |
| endif() |
|
|
| # CMake package files |
| include( GNUInstallDirs ) |
| set( E57_INSTALL_CMAKEDIR |
| "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" |
| CACHE STRING |
| "Install path for ${PROJECT_NAME} CMake files" |
| ) |
|
|
| message( STATUS "[${PROJECT_NAME}] CMake files install to ${CMAKE_INSTALL_PREFIX}/${E57_INSTALL_CMAKEDIR}" ) |
|
|
| install( |
| EXPORT |
| E57Format-export |
| DESTINATION |
| "${E57_INSTALL_CMAKEDIR}" |
| ) |
|
|
| include(CMakePackageConfigHelpers) |
| write_basic_package_version_file ( |
| e57format-config-version.cmake |
| VERSION ${PROJECT_VERSION} |
| COMPATIBILITY SameMajorVersion |
| ) |
|
|
| install( |
| FILES |
| ${CMAKE_CURRENT_SOURCE_DIR}/cmake/e57format-config.cmake |
| ${CMAKE_CURRENT_BINARY_DIR}/e57format-config-version.cmake |
| DESTINATION |
| "${E57_INSTALL_CMAKEDIR}" |
| ) |
|
|