#======================================================================================================================= # Preamble #======================================================================================================================= cmake_minimum_required(VERSION 3.15 FATAL_ERROR) set(OPENXLSX_MAJOR_VERSION 0) set(OPENXLSX_MINOR_VERSION 3) set(OPENXLSX_MICRO_VERSION 1) project(OpenXLSX.Library VERSION 0.3.2 LANGUAGES CXX) set(CMAKE_DEBUG_POSTFIX d) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN YES) set(CMAKE_POSITION_INDEPENDENT_CODE ON) #======================================================================================================================= # Set project metadata #======================================================================================================================= set(OPENXLSX_PROJECT_VENDOR "Kenneth Troldal Balslev") set(OPENXLSX_PROJECT_CONTACT "kenneth.balslev@gmail.com") set(OPENXLSX_PROJECT_URL "https://github.com/troldal/OpenXLSX") set(PROJECT_DESCRIPTION "A C++17 library for reading, writing and modifying Excel spreadsheets") #======================================================================================================================= # Set C/C++ compiler version #======================================================================================================================= set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(IGNORE_ME ${CMAKE_C_COMPILER}) # Suppress CMake warning message #======================================================================================================================= # Add build options #======================================================================================================================= option(OPENXLSX_COMPACT_MODE "Build library in compact mode (slower, but uses less memory)" OFF) set(OPENXLSX_LIBRARY_TYPE "STATIC" CACHE STRING "Set the library type to SHARED or STATIC") #======================================================================================================================= # EXTERNAL LIBRARIES # Define external libraries used by OpenXLSX. The libraries (Zippy, PugiXML, and NoWide) are header-only, so # INTERFACE libraries should be defined. #======================================================================================================================= add_library(NoWide INTERFACE IMPORTED) target_include_directories(NoWide SYSTEM INTERFACE $) add_library(Zippy INTERFACE IMPORTED) target_include_directories(Zippy SYSTEM INTERFACE $) add_library(PugiXML INTERFACE IMPORTED) target_include_directories(PugiXML SYSTEM INTERFACE $) if (${OPENXLSX_COMPACT_MODE}) target_compile_definitions(PugiXML INTERFACE PUGIXML_COMPACT) endif () #======================================================================================================================= # COMPILER FEATURES # Some older C++17 compilers don't support the char_conv features. If the compiler doesn't support it, # a less optimal work-around will be used. #======================================================================================================================= include(CheckCXXSourceCompiles) check_cxx_source_compiles(" #include #include #include int main() { std::array str {}; auto p = std::to_chars(str.data(), str.data() + str.size(), 12345).ptr; auto strResult = std::string(str.data(), p - str.data()); unsigned long value = 0; std::from_chars(strResult.data(), strResult.data() + strResult.size(), value); return 0; }" CHARCONV_RESULT) if (CHARCONV_RESULT) add_compile_definitions(CHARCONV_ENABLED) endif () #======================================================================================================================= # PROJECT FILES # List of project source files #======================================================================================================================= set(OPENXLSX_SOURCES ${CMAKE_CURRENT_LIST_DIR}/sources/XLCell.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLCellIterator.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLCellRange.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLCellReference.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLCellValue.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLColor.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLColumn.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLContentTypes.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLDateTime.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLDocument.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLFormula.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLProperties.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLRelationships.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLRow.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLRowData.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLSharedStrings.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLSheet.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLWorkbook.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLXmlData.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLXmlFile.cpp ${CMAKE_CURRENT_LIST_DIR}/sources/XLZipArchive.cpp ) #======================================================================================================================= # STATIC AND SHARED LIBRARY # Check that the input is valid #======================================================================================================================= if(NOT ${OPENXLSX_LIBRARY_TYPE} STREQUAL "STATIC" AND NOT ${OPENXLSX_LIBRARY_TYPE} STREQUAL "SHARED") message( FATAL_ERROR "Invalid library type. Must be SHARED or STATIC." ) endif() #======================================================================================================================= # STATIC LIBRARY # Define the static library #======================================================================================================================= if (${OPENXLSX_LIBRARY_TYPE} STREQUAL "STATIC") add_library(OpenXLSX STATIC "") add_library(OpenXLSX::OpenXLSX ALIAS OpenXLSX) target_sources(OpenXLSX PRIVATE ${OPENXLSX_SOURCES}) target_include_directories(OpenXLSX PUBLIC $ $ $) # For export header target_link_libraries(OpenXLSX PRIVATE $ $ $) target_compile_definitions(OpenXLSX PUBLIC OPENXLSX_STATIC_DEFINE) endif () #======================================================================================================================= # SHARED LIBRARY # Define the shared library #======================================================================================================================= if (${OPENXLSX_LIBRARY_TYPE} STREQUAL "SHARED") add_library(OpenXLSX SHARED "") add_library(OpenXLSX::OpenXLSX ALIAS OpenXLSX) target_sources(OpenXLSX PRIVATE ${OPENXLSX_SOURCES}) target_include_directories(OpenXLSX PUBLIC $ $ $) # For export header target_link_libraries(OpenXLSX PRIVATE $ $ $) # Enable Link-Time Optimization (LTO) include(CheckIPOSupported) check_ipo_supported(RESULT result OUTPUT output) if (result) set_property(TARGET OpenXLSX PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif () endif() # Generate export header include(GenerateExportHeader) generate_export_header(OpenXLSX BASE_NAME openxlsx EXPORT_FILE_NAME OpenXLSX-Exports.hpp EXPORT_MACRO_NAME OPENXLSX_EXPORT NO_EXPORT_MACRO_NAME OPENXLSX_HIDDEN) #======================================================================================================================= # COMPILER FLAGS # Set compiler debug flags for GCC, Clang and MSVC. #======================================================================================================================= list(APPEND OPENXLSX_DEBUG_FLAGS_GNU "-Wmisleading-indentation" "-Wduplicated-cond" "-Wduplicated-branches" "-Wlogical-op" "-Wnull-dereference") list(APPEND OPENXLSX_DEBUG_FLAGS_GNUCLANG "-Wall" "-Wextra" "-Wshadow" "-Wnon-virtual-dtor" "-Wold-style-cast" "-Wcast-align" "-Wunused" "-Woverloaded-virtual" "-Wpedantic" "-Wconversion" "-Wdouble-promotion" "-Wformat=2" "-Weffc++" "-Wno-unknown-pragmas") list(APPEND OPENXLSX_DEBUG_FLAGS_MSVC "/permissive" "/W4" "/w14242" "/w14254" "/w14263" "/w14265" "/w14287" "/we4289" "/w14296" "/w14311" "/w14545" "/w14546" "/w14547" "/w14549" "/w14555" "/w14619" "/w14640" "/w14826" "/w14905" "/w14906" "/w14928" "/wd4251" "/wd4275") list(APPEND OPENXLSX_RELEASE_FLAGS_MSVC "/wd4251" "/wd4275") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") target_compile_options(OpenXLSX PRIVATE $<$:${OPENXLSX_DEBUG_FLAGS_GNU}>) elseif (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")) target_compile_options(OpenXLSX PRIVATE $<$:${OPENXLSX_DEBUG_FLAGS_GNUCLANG}>) elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") string(REGEX REPLACE "/W[3|4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") target_compile_options(OpenXLSX PRIVATE $<$:${OPENXLSX_DEBUG_FLAGS_MSVC}>) target_compile_options(OpenXLSX PRIVATE $<$:${OPENXLSX_RELEASE_FLAGS_MSVC}>) endif () #======================================================================================================================= # Install #======================================================================================================================= # Some basic stuff we'll need in this section include(GNUInstallDirs) include(CMakePackageConfigHelpers) set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/OpenXLSX) # Install interface headers install( FILES ${OPENXLSX_CXX_INTERFACE_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/OpenXLSX/${dir} ) # Install export header install( FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenXLSX-Exports.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/OpenXLSX/headers ) file(GLOB OPENXLSX_HEADER_LIST ${CMAKE_CURRENT_LIST_DIR}/headers/*.hpp) install( FILES ${OPENXLSX_HEADER_LIST} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/OpenXLSX/headers ) install( FILES ${CMAKE_CURRENT_LIST_DIR}/OpenXLSX.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/OpenXLSX ) # Targets install( TARGETS OpenXLSX EXPORT OpenXLSXTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT bin INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/OpenXLSX ) set_target_properties(OpenXLSX PROPERTIES FOLDER libs VERSION ${OPENXLSX_MAJOR_VERSION}.${OPENXLSX_MINOR_VERSION}.${OPENXLSX_MICRO_VERSION} SOVERSION ${OPENXLSX_MAJOR_VERSION}) # Package version write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/OpenXLSX/OpenXLSXConfigVersion.cmake" VERSION ${OpenXLSX_VERSION} COMPATIBILITY AnyNewerVersion ) install( FILES OpenXLSXConfig.cmake "${CMAKE_CURRENT_BINARY_DIR}/OpenXLSX/OpenXLSXConfigVersion.cmake" DESTINATION ${ConfigPackageLocation} ) # Package configuration configure_file(OpenXLSXConfig.cmake "${CMAKE_CURRENT_BINARY_DIR}/OpenXLSX/OpenXLSXConfig.cmake" COPYONLY ) # Package export targets export( EXPORT OpenXLSXTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/OpenXLSX/OpenXLSXTargets.cmake" NAMESPACE OpenXLSX:: ) install( EXPORT OpenXLSXTargets FILE OpenXLSXTargets.cmake NAMESPACE OpenXLSX:: DESTINATION ${ConfigPackageLocation} )