From 3c7c40cdfa754ed9f5b1e2d7ecdac2028d279d2d Mon Sep 17 00:00:00 2001 From: Thomas Fussell Date: Thu, 27 Oct 2016 18:40:20 -0400 Subject: [PATCH] make build system modular --- CMakeLists.txt | 74 +++-------------- cmake/common.cmake | 27 +++++++ samples/CMakeLists.txt | 21 +++-- source/CMakeLists.txt | 160 ++++++++++++++++++------------------- tests/CMakeLists.txt | 49 +++++------- third-party/CMakeLists.txt | 54 +++++++++++++ 6 files changed, 200 insertions(+), 185 deletions(-) create mode 100644 cmake/common.cmake create mode 100644 third-party/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index bae84089..43cb538a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,82 +1,28 @@ -# Top level cmake script cmake_minimum_required(VERSION 3.1) +set(LIBRARY_NAME xlnt) +project(${LIBRARY_NAME}_all VERSION ${LIBRARY_VERSION} LANGUAGES CXX C) -project(xlnt - VERSION 0.9.0 - LANGUAGES CXX C) - +# This indicates to CMakeLists in subdirectories that they are part of a larger project +set(COMBINED_PROJECT 1) # Library type -option(SHARED "Set to OFF to not build shared libraries" ON) -option(STATIC "Set to ON to build static libraries" OFF) - +option(STATIC "Set to ON to build ${PROJECT_NAME} as a static library instead of a shared library" OFF) # Optional components -option(WITH_SAMPLES "Build executable code samples" OFF) -option(WITH_BENCHMARKS "Build performance benchmarks" OFF) - +option(SAMPLES "Set to ON to build executable code samples (in ./samples)" OFF) +option(BENCHMARKS "Set to ON to build performance benchmarks (in ./benchmarks)" OFF) # Platform specific options if(NOT MSVC) - option(COVERAGE "Generate coverage data for use in Coveralls" OFF) + option(COVERAGE "Generate coverage data using gcov" OFF) endif() -if(APPLE) - option(FRAMEWORK "Set to ON to package dylib and headers into a .framework, OSX only" OFF) -endif() - - -# Global language settings -set(CMAKE_CXX_STANDARD 14) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - - -# Platform specific settings -if(COVERAGE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") -endif() - -if(APPLE) - # Prevent a warning about deployment target not being set - execute_process(COMMAND "sw_vers -productVersion | awk -F'.' '{print $1\".\"$2}'" - OUTPUT_VARIABLE OSX_VERSION) - set(CMAKE_OSX_DEPLOYMENT_TARGET ${OSX_VERSION}) -endif() - -if(MSVC) - add_definitions(-DUNICODE -D_UNICODE) -endif() - - -# Define project directories -set(XLNT_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include) -set(XLNT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/source) -set(THIRD_PARTY_DIR ${CMAKE_SOURCE_DIR}/third-party) - - -# Tell CMake where to find .cmake files -set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) - - -# Put output files in the same directory -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - -foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin) -endforeach() - - # Add components according to selected options -if (WITH_SAMPLES) +if(SAMPLES) add_subdirectory(samples) endif() -if (WITH_BENCHMARKS) +if(BENCHMARKS) add_subdirectory(benchmarks) endif() diff --git a/cmake/common.cmake b/cmake/common.cmake new file mode 100644 index 00000000..7c8ba985 --- /dev/null +++ b/cmake/common.cmake @@ -0,0 +1,27 @@ +set(LIBRARY_NAME xlnt) +set(LIBRARY_VERSION 0.9.0) + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Global platform-specific definitions +if(MSVC) + add_definitions(-DUNICODE -D_UNICODE) +endif() + +# Global library directories +set(LIBRARY_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/../include) +set(LIBRARY_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../source) +set(THIRD_PARTY_DIR ${CMAKE_CURRENT_LIST_DIR}/../third-party) + +# Put all output files in the same directory +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin) +endforeach() diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 0ee5548f..113ce8a5 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -1,18 +1,15 @@ -project(xlnt.samples) +include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/common.cmake) +project(${LIBRARY_NAME}.samples VERSION ${LIBRARY_VERSION} LANGUAGES CXX C) -include_directories(${XLNT_INCLUDE_DIR}) - -if(SHARED) - set(XLNT_LIB xlnt.shared) -else() - set(XLNT_LIB xlnt.static) +if(NOT COMBINED_PROJECT) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../source ${CMAKE_CURRENT_BINARY_DIR}/source) endif() -add_executable(sample-basic ../samples/sample.cpp) -target_link_libraries(sample-basic ${XLNT_LIB}) +add_executable(sample-basic ${CMAKE_CURRENT_SOURCE_DIR}/samples/sample.cpp) +target_link_libraries(sample-basic ${LIBRARY_NAME}) -add_executable(sample-decrypt ../samples/decrypt.cpp) -target_link_libraries(sample-decrypt ${XLNT_LIB}) +add_executable(sample-decrypt ${CMAKE_CURRENT_SOURCE_DIR}/samples/decrypt.cpp) +target_link_libraries(sample-decrypt ${LIBRARY_NAME}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data - DESTINATION ${CMAKE_BINARY_DIR}/bin) + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/bin) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 2b2dff9b..c58ef114 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,16 +1,22 @@ -if(STATIC) - set(PROJECT_NAME xlnt.static) -else() - set(PROJECT_NAME xlnt.shared) -endif() +cmake_minimum_required(VERSION 3.1) +include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/common.cmake) +project(${LIBRARY_NAME} VERSION ${LIBRARY_VERSION} LANGUAGES CXX C) -project(${PROJECT_NAME}) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../third-party ${CMAKE_CURRENT_BINARY_DIR}/third-party) + +if(APPLE) + option(FRAMEWORK "Set to ON to package dylib and headers into a .framework, OSX only" OFF) +endif() set(PROJECT_VENDOR "Thomas Fussell") set(PROJECT_CONTACT "thomas.fussell@gmail.com") set(PROJECT_URL "https://github.com/tfussell/xlnt") set(PROJECT_DESCRIPTION "cross-platform user-friendly xlsx library for C++14") +set(XLNT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../include) +set(XLNT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../third-party) + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE) endif() @@ -27,100 +33,98 @@ if(NOT BIN_DEST_DIR) set(BIN_DEST_DIR ${CMAKE_INSTALL_PREFIX}/bin) endif() -include_directories(${XLNT_INCLUDE_DIR}) -include_directories(${XLNT_INCLUDE_DIR}/xlnt) -include_directories(${XLNT_SOURCE_DIR}) -include_directories(${XLNT_SOURCE_DIR}/detail) -include_directories(${THIRD_PARTY_DIR}/miniz) -include_directories(${THIRD_PARTY_DIR}/libstudxml) -include_directories(${THIRD_PARTY_DIR}/utfcpp/source) -include_directories(${THIRD_PARTY_DIR}/pole) -include_directories(${THIRD_PARTY_DIR}/botan) + +# Put all output files in the same directory +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin) +endforeach() + +# Platform specific settings +if(COVERAGE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") +endif() + +if(APPLE) + # Prevent a warning about deployment target not being set + execute_process(COMMAND "sw_vers -productVersion | awk -F'.' '{print $1\".\"$2}'" + OUTPUT_VARIABLE OSX_VERSION) + set(CMAKE_OSX_DEPLOYMENT_TARGET ${OSX_VERSION}) +endif() + +# Includes +include_directories(${XLNT_INCLUDE_DIR} + ${XLNT_INCLUDE_DIR}/xlnt + ${XLNT_SOURCE_DIR} + ${XLNT_SOURCE_DIR}/detail + ${THIRD_PARTY_DIR}/miniz + ${THIRD_PARTY_DIR}/libstudxml + ${THIRD_PARTY_DIR}/utfcpp/source + ${THIRD_PARTY_DIR}/pole + ${THIRD_PARTY_DIR}/botan) file(GLOB ROOT_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/*.hpp) file(GLOB CELL_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/cell/*.hpp) +file(GLOB CELL_SOURCES ${XLNT_SOURCE_DIR}/cell/*.cpp) file(GLOB CHARTS_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/charts/*.hpp) +file(GLOB CHARTS_SOURCES ${XLNT_SOURCE_DIR}/charts/*.cpp) file(GLOB CHARTSHEET_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/chartsheet/*.hpp) +file(GLOB CHARTSHEET_SOURCES ${XLNT_SOURCE_DIR}/chartsheet/*.cpp) file(GLOB DRAWING_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/drawing/*.hpp) +file(GLOB DRAWING_SOURCES ${XLNT_SOURCE_DIR}/drawing/*.cpp) file(GLOB FORMULA_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/formula/*.hpp) +file(GLOB FORMULA_SOURCES ${XLNT_SOURCE_DIR}/formula/*.cpp) file(GLOB PACKAGING_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/packaging/*.hpp) +file(GLOB PACKAGING_SOURCES ${XLNT_SOURCE_DIR}/packaging/*.cpp) file(GLOB STYLES_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/styles/*.hpp) +file(GLOB STYLES_SOURCES ${XLNT_SOURCE_DIR}/styles/*.cpp) file(GLOB UTILS_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/utils/*.hpp) +file(GLOB UTILS_SOURCES ${XLNT_SOURCE_DIR}/utils/*.cpp) file(GLOB WORKBOOK_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/workbook/*.hpp) +file(GLOB WORKBOOK_SOURCES ${XLNT_SOURCE_DIR}/workbook/*.cpp) file(GLOB WORKSHEET_HEADERS ${XLNT_INCLUDE_DIR}/xlnt/worksheet/*.hpp) +file(GLOB WORKSHEET_SOURCES ${XLNT_SOURCE_DIR}/worksheet/*.cpp) file(GLOB DETAIL_HEADERS ${XLNT_INCLUDE_DIR}/detail/*.hpp) +file(GLOB DETAIL_SOURCES ${XLNT_SOURCE_DIR}/detail/*.cpp) -set(HEADERS ${ROOT_HEADERS} ${CELL_HEADERS} ${CHARTS_HEADERS} +set(XLNT_HEADERS ${ROOT_HEADERS} ${CELL_HEADERS} ${CHARTS_HEADERS} ${CHARTSHEET_HEADERS} ${DRAWING_HEADERS} ${FORMULA_HEADERS} ${PACKAGING_HEADERS} ${STYLES_HEADERS} ${UTILS_HEADERS} ${WORKBOOK_HEADERS} ${WORKSHEET_HEADERS} ${DETAIL_HEADERS}) - -file(GLOB CELL_SOURCES ${XLNT_SOURCE_DIR}/cell/*.cpp) -file(GLOB CHARTS_SOURCES ${XLNT_SOURCE_DIR}/charts/*.cpp) -file(GLOB CHARTSHEET_SOURCES ${XLNT_SOURCE_DIR}/chartsheet/*.cpp) -file(GLOB DRAWING_SOURCES ${XLNT_SOURCE_DIR}/drawing/*.cpp) -file(GLOB FORMULA_SOURCES ${XLNT_SOURCE_DIR}/formula/*.cpp) -file(GLOB PACKAGING_SOURCES ${XLNT_SOURCE_DIR}/packaging/*.cpp) -file(GLOB STYLES_SOURCES ${XLNT_SOURCE_DIR}/styles/*.cpp) -file(GLOB UTILS_SOURCES ${XLNT_SOURCE_DIR}/utils/*.cpp) -file(GLOB WORKBOOK_SOURCES ${XLNT_SOURCE_DIR}/workbook/*.cpp) -file(GLOB WORKSHEET_SOURCES ${XLNT_SOURCE_DIR}/worksheet/*.cpp) -file(GLOB DETAIL_SOURCES ${XLNT_SOURCE_DIR}/detail/*.cpp) - -set(SOURCES ${CELL_SOURCES} ${CHARTS_SOURCES} ${CHARTSHEET_SOURCES} +set(XLNT_SOURCES ${CELL_SOURCES} ${CHARTS_SOURCES} ${CHARTSHEET_SOURCES} ${DRAWING_SOURCES} ${FORMULA_SOURCES} ${PACKAGING_SOURCES} ${STYLES_SOURCES} ${UTILS_SOURCES} ${WORKBOOK_SOURCES} ${WORKSHEET_SOURCES} ${DETAIL_SOURCES}) -set(MINIZ ../third-party/miniz/miniz.c ../third-party/miniz/miniz.h) -set(LIBSTUDXML ../third-party/libstudxml/xml/parser.cxx ../third-party/libstudxml/xml/qname.cxx - ../third-party/libstudxml/xml/serializer.cxx ../third-party/libstudxml/xml/value-traits.cxx - ../third-party/libstudxml/xml/details/expat/xmlparse.c ../third-party/libstudxml/xml/details/expat/xmlrole.c - ../third-party/libstudxml/xml/details/expat/xmltok_impl.c ../third-party/libstudxml/xml/details/expat/xmltok_ns.c - ../third-party/libstudxml/xml/details/expat/xmltok.c ../third-party/libstudxml/xml/details/genx/char-props.c - ../third-party/libstudxml/xml/details/genx/genx.c) -set(POLE ${THIRD_PARTY_DIR}/pole/pole.cpp) -set(BOTAN ${THIRD_PARTY_DIR}/botan/botan_all.cpp) - -if(MSVC) - set_source_files_properties(${BOTAN} PROPERTIES COMPILE_FLAGS "/wd\"4244\"") -endif() - -if (CMAKE_SIZEOF_VOID_P EQUAL 8) - set(CPU "x64") -else() - set(CPU "x86") -endif() - -add_custom_command(OUTPUT ${BOTAN} - COMMAND python configure.py --minimized-build --enable-modules=sha1,aes,filters,codec_filt,cbc,ecb,sha2_32,sha2_64 --disable-shared --amalgamation --cpu=${CPU} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/third-party/botan - COMMENT "Generating botan amalgamation ${BOTAN}") - -if(SHARED) - add_library(xlnt.shared SHARED ${HEADERS} ${SOURCES} ${MINIZ} ${LIBSTUDXML} ${POLE} ${BOTAN}) - target_compile_definitions(xlnt.shared PRIVATE XLNT_SHARED=1 LIBSTUDXML_STATIC_LIB=1) +if(NOT STATIC) + add_library(xlnt SHARED ${XLNT_HEADERS} ${XLNT_SOURCES} $) + target_compile_definitions(xlnt PRIVATE XLNT_SHARED=1) if(MSVC) - target_compile_definitions(xlnt.shared PRIVATE XLNT_EXPORT=1 _CRT_SECURE_NO_WARNINGS=1 NOMINMAX) - set_target_properties(xlnt.shared PROPERTIES COMPILE_FLAGS "/wd\"4251\" /wd\"4275\" /MP") + target_compile_definitions(xlnt PRIVATE XLNT_EXPORT=1 _CRT_SECURE_NO_WARNINGS=1) + set_target_properties(xlnt PROPERTIES COMPILE_FLAGS "/wd\"4251\" /wd\"4275\" /MP") endif() - install(TARGETS xlnt.shared + install(TARGETS xlnt LIBRARY DESTINATION ${LIB_DEST_DIR} ARCHIVE DESTINATION ${LIB_DEST_DIR} RUNTIME DESTINATION ${BIN_DEST_DIR}) set_target_properties( - xlnt.shared + xlnt PROPERTIES - OUTPUT_NAME xlnt - VERSION ${PROJECT_VERSION_FULL} - SOVERSION ${PROJECT_VERSION} + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} INSTALL_NAME_DIR "${LIB_DEST_DIR}") if(FRAMEWORK) add_custom_command( - TARGET xlnt.shared + TARGET xlnt POST_BUILD COMMAND mkdir -p "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.framework/Versions/${PROJECT_VERSION_FULL}/Headers" COMMAND cp -R ../include/xlnt/* "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.framework/Versions/${PROJECT_VERSION_FULL}/Headers" @@ -129,26 +133,20 @@ if(SHARED) COMMAND cd "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.framework" && ln -s Versions/Current/* ./ ) endif() -endif() - -if(STATIC) - add_library(xlnt.static STATIC ${HEADERS} ${SOURCES} ${MINIZ} ${LIBSTUDXML} ${POLE} ${BOTAN}) - target_compile_definitions(xlnt.static PUBLIC XLNT_STATIC=1) - target_compile_definitions(xlnt.static PRIVATE LIBSTUDXML_STATIC_LIB=1) +else() + add_library(xlnt STATIC ${XLNT_HEADERS} ${XLNT_SOURCES} $) + target_compile_definitions(xlnt PUBLIC XLNT_STATIC=1) if(MSVC) - target_compile_definitions(xlnt.static PRIVATE _CRT_SECURE_NO_WARNINGS=1 NOMINMAX) - set_target_properties(xlnt.static PROPERTIES COMPILE_FLAGS "/MP") + target_compile_definitions(xlnt PRIVATE _CRT_SECURE_NO_WARNINGS=1 NOMINMAX) + set_target_properties(xlnt PROPERTIES COMPILE_FLAGS "/MP") endif() - install(TARGETS xlnt.static + install(TARGETS xlnt LIBRARY DESTINATION ${LIB_DEST_DIR} ARCHIVE DESTINATION ${LIB_DEST_DIR} RUNTIME DESTINATION ${BIN_DEST_DIR} ) - set_target_properties(xlnt.static - PROPERTIES - OUTPUT_NAME xlnt) endif() source_group(xlnt FILES ${ROOT_HEADERS}) @@ -164,8 +162,6 @@ source_group(styles FILES ${STYLES_HEADERS} ${STYLES_SOURCES}) source_group(utils FILES ${UTILS_HEADERS} ${UTILS_SOURCES}) source_group(workbook FILES ${WORKBOOK_HEADERS} ${WORKBOOK_SOURCES}) source_group(worksheet FILES ${WORKSHEET_HEADERS} ${WORKSHEET_SOURCES}) -source_group(third-party\\miniz FILES ${MINIZ}) -source_group(third-party\\libstudxml FILES ${LIBSTUDXML}) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) @@ -175,11 +171,11 @@ set(PKG_CONFIG_LIBS "-L\${libdir} -lxlnt") set(PKG_CONFIG_CFLAGS "-I\${includedir}") configure_file( - "${CMAKE_SOURCE_DIR}/cmake/pkg-config.pc.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/pkg-config.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc") configure_file( - "${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5ac8bfad..a872a35c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,24 +1,28 @@ -project(xlnt.test) +cmake_minimum_required(VERSION 3.1) +include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/common.cmake) +project(${LIBRARY_NAME}.test VERSION ${LIBRARY_VERSION} LANGUAGES CXX C) -set(XLNT_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +if(NOT COMBINED_PROJECT) + add_subdirectory(${LIBRARY_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/source) +endif() -include_directories(${XLNT_INCLUDE_DIR}) -include_directories(${XLNT_SOURCE_DIR}) +include_directories(${LIBRARY_INCLUDE_DIR}) +include_directories(${LIBRARY_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${THIRD_PARTY_DIR}/cxxtest) include_directories(${THIRD_PARTY_DIR}/utfcpp/source) include_directories(${THIRD_PARTY_DIR}/pugixml/src) -file(GLOB CELL_TESTS ${XLNT_SOURCE_DIR}/cell/tests/test_*.hpp) -file(GLOB CHARTS_TESTS ${XLNT_SOURCE_DIR}/charts/tests/test_*.hpp) -file(GLOB CHARTSHEET_TESTS ${XLNT_SOURCE_DIR}/chartsheet/tests/test_*.hpp) -file(GLOB DRAWING_TESTS ${XLNT_SOURCE_DIR}/drawing/tests/test_*.hpp) -file(GLOB FORMULA_TESTS ${XLNT_SOURCE_DIR}/formula/tests/test_*.hpp) -file(GLOB PACKAGING_TESTS ${XLNT_SOURCE_DIR}/packaging/tests/test_*.hpp) -file(GLOB STYLES_TESTS ${XLNT_SOURCE_DIR}/styles/tests/test_*.hpp) -file(GLOB UTILS_TESTS ${XLNT_SOURCE_DIR}/utils/tests/test_*.hpp) -file(GLOB WORKBOOK_TESTS ${XLNT_SOURCE_DIR}/workbook/tests/test_*.hpp) -file(GLOB WORKSHEET_TESTS ${XLNT_SOURCE_DIR}/worksheet/tests/test_*.hpp) +file(GLOB CELL_TESTS ${LIBRARY_SOURCE_DIR}/cell/tests/test_*.hpp) +file(GLOB CHARTS_TESTS ${LIBRARY_SOURCE_DIR}/charts/tests/test_*.hpp) +file(GLOB CHARTSHEET_TESTS ${LIBRARY_SOURCE_DIR}/chartsheet/tests/test_*.hpp) +file(GLOB DRAWING_TESTS ${LIBRARY_SOURCE_DIR}/drawing/tests/test_*.hpp) +file(GLOB FORMULA_TESTS ${LIBRARY_SOURCE_DIR}/formula/tests/test_*.hpp) +file(GLOB PACKAGING_TESTS ${LIBRARY_SOURCE_DIR}/packaging/tests/test_*.hpp) +file(GLOB STYLES_TESTS ${LIBRARY_SOURCE_DIR}/styles/tests/test_*.hpp) +file(GLOB UTILS_TESTS ${LIBRARY_SOURCE_DIR}/utils/tests/test_*.hpp) +file(GLOB WORKBOOK_TESTS ${LIBRARY_SOURCE_DIR}/workbook/tests/test_*.hpp) +file(GLOB WORKSHEET_TESTS ${LIBRARY_SOURCE_DIR}/worksheet/tests/test_*.hpp) set(TESTS ${CELL_TESTS} ${CHARTS_TESTS} ${CHARTSHEET_TESTS} ${DRAWING_TESTS} ${FORMULA_TESTS} ${PACKAGING_TESTS} ${STYLES_TESTS} ${UTILS_TESTS} @@ -31,7 +35,7 @@ file(GLOB TEST_HELPERS_SOURCES ${XLNT_TESTS_DIR}/helpers/*.cpp) SET(TEST_HELPERS ${TEST_HELPERS_HEADERS} ${TEST_HELPERS_SOURCES}) file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/tests") -set(RUNNER "${CMAKE_CURRENT_BINARY_DIR}/tests/runner-autogen.cpp") +set(RUNNER "${CMAKE_CURRENT_BINARY_DIR}/runner-autogen.cpp") set_source_files_properties(${RUNNER} PROPERTIES GENERATED TRUE) add_executable(xlnt.test ${TEST_HELPERS} ${TESTS} ${RUNNER} ${PUGIXML}) @@ -50,14 +54,7 @@ source_group(tests\\workbook FILES ${WORKBOOK_TESTS}) source_group(tests\\worksheet FILES ${WORKSHEET_TESTS}) source_group(runner FILES ${RUNNER}) -set(THREADS_PREFER_PTHREAD_FLAG ON) -find_package(Threads REQUIRED) - -if(SHARED) - target_link_libraries(${PROJECT_NAME} xlnt.shared Threads::Threads) -else() - target_link_libraries(${PROJECT_NAME} xlnt.static Threads::Threads) -endif() +target_link_libraries(${PROJECT_NAME} ${LIBRARY_NAME}) if(MSVC) set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd\"4251\" /wd\"4275\"") @@ -66,13 +63,11 @@ if(MSVC) endif() add_custom_command(OUTPUT ${RUNNER} - COMMAND python ${CMAKE_SOURCE_DIR}/third-party/cxxtest/bin/cxxtestgen --runner=ErrorPrinter -o tests/runner-autogen.cpp ${TESTS} + COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../third-party/cxxtest/bin/cxxtestgen --runner=ErrorPrinter -o ${RUNNER} ${TESTS} DEPENDS ${TESTS} COMMENT "Generating test runner ${RUNNER}") add_custom_target(generate-test-runner DEPENDS ${RUNNER}) - add_dependencies(xlnt.test generate-test-runner) -file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data - DESTINATION ${CMAKE_BINARY_DIR}/bin) +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data DESTINATION ${CMAKE_BINARY_DIR}/bin) diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt new file mode 100644 index 00000000..516530b3 --- /dev/null +++ b/third-party/CMakeLists.txt @@ -0,0 +1,54 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/common.cmake) +project(${LIBRARY_NAME}.third-party VERSION ${LIBRARY_VERSION} LANGUAGES CXX C) + +# Includes +include_directories(miniz + libstudxml + utfcpp/source + pole + botan + ${LIBRARY_SOURCE_DIR}/detail) + +set(MINIZ + ../third-party/miniz/miniz.c + ../third-party/miniz/miniz.h) +set(LIBSTUDXML + ../third-party/libstudxml/xml/parser.cxx + ../third-party/libstudxml/xml/qname.cxx + ../third-party/libstudxml/xml/serializer.cxx + ../third-party/libstudxml/xml/value-traits.cxx + ../third-party/libstudxml/xml/details/expat/xmlparse.c + ../third-party/libstudxml/xml/details/expat/xmlrole.c + ../third-party/libstudxml/xml/details/expat/xmltok_impl.c + ../third-party/libstudxml/xml/details/expat/xmltok_ns.c + ../third-party/libstudxml/xml/details/expat/xmltok.c + ../third-party/libstudxml/xml/details/genx/char-props.c + ../third-party/libstudxml/xml/details/genx/genx.c) +set(POLE pole/pole.cpp) +set(BOTAN ${CMAKE_CURRENT_SOURCE_DIR}/botan/botan_all.cpp) + +if(MSVC) + set_source_files_properties(${BOTAN} PROPERTIES COMPILE_FLAGS "/wd\"4244\"") +endif() + +if (CMAKE_SIZEOF_VOID_P EQUAL 8) + set(CPU "x64") +else() + set(CPU "x86") +endif() + +add_custom_command(OUTPUT ${BOTAN} + COMMAND python configure.py --minimized-build --enable-modules=sha1,aes,filters,codec_filt,cbc,ecb,sha2_32,sha2_64 --disable-shared --amalgamation --cpu=${CPU} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/botan + COMMENT "Generating botan amalgamation ${BOTAN}") + +add_library(xlnt.third-party OBJECT ${MINIZ} ${LIBSTUDXML} ${POLE} ${BOTAN}) +target_compile_definitions(xlnt.third-party PRIVATE LIBSTUDXML_STATIC_LIB=1) + +if(MSVC) + target_compile_definitions(xlnt.third-party PRIVATE _CRT_SECURE_NO_WARNINGS=1 NOMINMAX) + set_target_properties(xlnt.third-party PROPERTIES COMPILE_FLAGS "/MP") +endif() + +source_group(miniz FILES ${MINIZ}) +source_group(libstudxml FILES ${LIBSTUDXML})