From c5b0f147d23bf950f2b40ff8149e865b21013924 Mon Sep 17 00:00:00 2001 From: Pradeep Garigipati Date: Tue, 5 Mar 2019 02:18:11 +0530 Subject: [PATCH] Update googletest, cmake and cleanup build variables (#38) * Update googletest, cmake and cleanup build variables * Moved github templates to .github folder * Replaced chrome/googletest with googletest/googltest * Refactored cmake scripts to modern cmake syntax * Increased minimum required CMake version to 3.12.3 * Cleanup documentation generation cmake script --- .../ISSUE_TEMPLATE.md | 0 .../PULL_REQUEST_TEMPLATE.md | 0 .gitmodules | 2 +- .travis.yml | 23 ++- CMakeLists.txt | 148 ++++++++++-------- CMakeModules/build_gtest.cmake | 98 ------------ cmake/MeshIOConfig.cmake.in | 42 +++++ docs/CMakeLists.txt | 61 ++++---- docs/doxygen.mk | 3 +- test/CMakeLists.txt | 121 +++++++------- test/googletest | 2 +- 11 files changed, 222 insertions(+), 278 deletions(-) rename ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md (100%) rename PULL_REQUEST_TEMPLATE.md => .github/PULL_REQUEST_TEMPLATE.md (100%) delete mode 100644 CMakeModules/build_gtest.cmake create mode 100644 cmake/MeshIOConfig.cmake.in diff --git a/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE.md diff --git a/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from PULL_REQUEST_TEMPLATE.md rename to .github/PULL_REQUEST_TEMPLATE.md diff --git a/.gitmodules b/.gitmodules index b383af2..6889aed 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "test/googletest"] path = test/googletest - url = https://chromium.googlesource.com/external/googletest + url = https://github.com/google/googletest.git diff --git a/.travis.yml b/.travis.yml index f2883ed..4bc2a34 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,39 +1,35 @@ -#----------------------------------------------------------------------------- -# -# Configuration for continuous integration service at travis-ci.org -# -#----------------------------------------------------------------------------- -# -# This file is copy of https://github.com/mapbox/protozero/blob/master/.travis.yml - language: cpp +branches: + only: + - master + sudo: false matrix: include: - - os: linux + - dist: xenial compiler: clang env: INSTALL_CXX=clang++-3.5 addons: apt: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5', 'george-edison55-precise-backports'] packages: ['clang-3.5', 'lcov', 'cmake', 'cmake-data'] - - os: linux + - dist: xenial compiler: clang env: INSTALL_CXX=clang++-3.6 addons: apt: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6', 'george-edison55-precise-backports'] packages: ['clang-3.6', 'lcov', 'cmake', 'cmake-data'] - - os: linux + - dist: xenial compiler: gcc-4.8 env: INSTALL_CXX=g++-4.8 INSTALL_CC=gcc-4.8 addons: apt: sources: ['ubuntu-toolchain-r-test', 'george-edison55-precise-backports'] packages: ['g++-4.8', 'lcov', 'cmake', 'cmake-data'] - - os: linux + - dist: xenial compiler: gcc-4.9 env: INSTALL_CXX=g++-4.9 INSTALL_CC=gcc-4.9 addons: @@ -41,6 +37,7 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'george-edison55-precise-backports'] packages: ['g++-4.9', 'lcov', 'cmake', 'cmake-data'] - os: osx + osx_image: xcode10.1 compiler: clang env: INSTALL_CXX=clang++ INSTALL_CC=clang @@ -50,7 +47,7 @@ before_install: script: - mkdir -p build - cd build - - CC=$INSTALL_CC CXX=$INSTALL_CXX cmake ../ -DBUILD_COVERAGE:BOOL=ON + - CC=$INSTALL_CC CXX=$INSTALL_CXX cmake ../ -DMeshIO_BUILD_COVERAGE:BOOL=ON - make -j4 - ctest --output-on-failure diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a1d6b3..8aa9150 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,67 +1,81 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 3.0.2) - -PROJECT(MeshIO) - -SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") - -OPTION(BUILD_DOCUMENTATION "Build Documentation" OFF) -OPTION(BUILD_EXAMPLES "Build examples" OFF) -OPTION(BUILD_TESTS "Build Tests" ON) -OPTION(BUILD_COVERAGE "Create test coverage report" OFF) -OPTION(USE_SYSTEM_GTEST "Use GTEST from system libraries" OFF) -OPTION(USE_RELATIVE_TEST_DIR "Use relative paths for the test data directory(For continious integration(CI) purposes only)" OFF) - -# Set a default build type if none was specified -IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - SET(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) - # Set the possible values of build type for cmake-gui - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" - "MinSizeRel" "RelWithDebInfo") -ENDIF() - -### Marking BUILD_COVERAGE as advanced as it won't be -### used by regular developers -MARK_AS_ADVANCED(BUILD_COVERAGE) - -IF(UNIX) - IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") - ELSEIF("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 4.7) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") - ELSE() - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") - ENDIF() -ENDIF() - -# Generate documentation -IF(BUILD_DOCUMENTATION) - ADD_SUBDIRECTORY(docs) -ENDIF(BUILD_DOCUMENTATION) - -IF(BUILD_EXAMPLES) - ADD_SUBDIRECTORY(examples) -ENDIF() - -IF(BUILD_TESTS) - ENABLE_TESTING() - ADD_SUBDIRECTORY(test) -ENDIF() - -### Following commented out changes work only on CMAKE version >=3.0 -ADD_LIBRARY(MeshIO INTERFACE) -TARGET_INCLUDE_DIRECTORIES(MeshIO INTERFACE - $ - $ - ) - -INSTALL(TARGETS MeshIO EXPORT meshioExport) -INSTALL(EXPORT meshioExport NAMESPACE Upstream:: - DESTINATION share/MeshIO/cmake - ) - -INSTALL(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" - DESTINATION . - COMPONENT Headers - FILES_MATCHING - PATTERN "*.hpp" - ) +cmake_minimum_required(VERSION 3.12.3) + +project(MeshIO VERSION 0.1.0) + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +if (NOT EXISTS "${MeshIO_SOURCE_DIR}/test/googletest") + message(WARNING "google/googletest is not available. Tests will not built.") + message("Did you miss the --recursive option when cloning?") + message("Run the following commands to correct this:") + message("git submodule init") + message("git submodule update") + message("git submodule foreach git pull origin master") +endif () + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) + set_property(CACHE CMAKE_BUILD_TYPE + PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif() + +option(MeshIO_BUILD_DOCS "Build Documentation" OFF) +option(MeshIO_BUILD_EXAMPLES "Build examples" OFF) +option(MeshIO_BUILD_COVERAGE "Create test coverage report" OFF) + +add_library(meshio INTERFACE) + +target_include_directories(meshio INTERFACE + $ + $ + ) + +include(CTest) +enable_testing() +add_subdirectory(test) + +if(MeshIO_BUILD_DOCS) + add_subdirectory(docs) +endif(MeshIO_BUILD_DOCS) + +if (MeshIO_BUILD_EXAMPLES) + add_subdirectory(examples) +endif () + +include(CMakePackageConfigHelpers) +set(INCLUDE_DIRS include) +set(CMAKE_DIR share/meshio/cmake) +configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/MeshIOConfig.cmake.in" + "cmake_install/MeshIOConfig.cmake" + INSTALL_DESTINATION share/meshio/cmake + PATH_VARS INCLUDE_DIRS CMAKE_DIR +) + +install(TARGETS meshio EXPORT MeshIOTargets COMPONENT meshio) + +install(EXPORT MeshIOTargets + NAMESPACE MeshIO:: + DESTINATION share/meshio/cmake + COMPONENT meshio + ) + +install(FILES + ${MeshIO_BINARY_DIR}/cmake_install/MeshIOConfig.cmake + DESTINATION share/meshio/cmake + COMPONENT cmake +) + +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" + DESTINATION . + COMPONENT Headers + FILES_MATCHING + PATTERN "*.hpp" + PATTERN "*.inl" + ) + +mark_as_advanced(MeshIO_BUILD_COVERAGE) diff --git a/CMakeModules/build_gtest.cmake b/CMakeModules/build_gtest.cmake deleted file mode 100644 index c5ee87a..0000000 --- a/CMakeModules/build_gtest.cmake +++ /dev/null @@ -1,98 +0,0 @@ -# Build the gtest libraries - -# Check if Google Test exists -SET(GTEST_SOURCE_DIR "${CMAKE_SOURCE_DIR}/test/googletest") -IF(NOT EXISTS "${GTEST_SOURCE_DIR}/README") - MESSAGE(WARNING "GTest Source is not available. Tests will not built.") - MESSAGE("Did you miss the --recursive option when cloning?") - MESSAGE("Run the following commands to correct this:") - MESSAGE("git submodule init") - MESSAGE("git submodule update") - MESSAGE("git submodule foreach git pull origin master") -ENDIF() - -if(CMAKE_VERSION VERSION_LESS 3.2 AND CMAKE_GENERATOR MATCHES "Ninja") - message(WARNING "Building GTest with Ninja has known issues with CMake older than 3.2") -endif() - -include(ExternalProject) - -# Set the build type if it isn't already -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# Set default ExternalProject root directory -set(prefix "${CMAKE_BINARY_DIR}/third_party/gtest") -# the binary dir must be know before creating the external project in order -# to pass the byproducts -set(binary_dir "${prefix}/src/googletest-build") -set(stdlib_binary_dir "${prefix}/src/googletest-build-stdlib") - -set(GTEST_LIBRARIES gtest gtest_main) -set(GTEST_LIBRARIES_STDLIB gtest_stdlib gtest_main_stdlib) - -set(byproducts) -set(byproducts_libstdcpp) -foreach(lib ${GTEST_LIBRARIES}) - set(${lib}_location - ${binary_dir}/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}) - set(${lib}_location_libstdcpp - ${stdlib_binary_dir}/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}) - list(APPEND byproducts ${${lib}_location}) - list(APPEND byproducts_libstdcpp ${${lib}_location_libstdcpp}) -endforeach() -SET(CMAKE_CXX_FLAGS_STD "${CMAKE_CXX_FLAGS} -stdlib=libstdc++") - -FUNCTION(GTEST_BUILD BUILD_NAME BUILD_TYPE BUILD_BINARY_DIR BUILD_BYPRODUCTS) -# Add gtest -ExternalProject_Add( - ${BUILD_NAME} - # URL http://googletest.googlecode.com/files/gtest-1.7.0.zip - # URL_MD5 2d6ec8ccdf5c46b05ba54a9fd1d130d7 - SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../test/googletest" - PREFIX ${prefix} - BINARY_DIR ${BUILD_BINARY_DIR} - TIMEOUT 10 - CMAKE_ARGS -Dgtest_force_shared_crt=ON - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_BUILD_TYPE=${BUILD_TYPE} - -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} - -DCMAKE_CXX_FLAGS_LIBSTDCPP=${CMAKE_CXX_FLAGS_STD} - -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} - -DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL} - -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} - -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO} - BUILD_BYPRODUCTS ${BUILD_BYPRODUCTS} - # Disable install step - INSTALL_COMMAND "" - # Wrap download, configure and build steps in a script to log output - LOG_DOWNLOAD 0 - LOG_UPDATE 0 - LOG_CONFIGURE 0 - LOG_BUILD 0) -ENDFUNCTION(GTEST_BUILD) - -GTEST_BUILD(googletest ${CMAKE_BUILD_TYPE} ${binary_dir} "${byproducts}") - -# If we are on OSX and using the clang compiler go ahead and build GTest using libstdc++ -IF("${APPLE}" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - GTEST_BUILD(googletest_libstdcpp LibStdCpp ${stdlib_binary_dir} "${byproducts_libstdcpp}") -ENDIF("${APPLE}" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - -foreach(lib ${GTEST_LIBRARIES}) - add_library(${lib} IMPORTED STATIC) - add_dependencies(${lib} googletest) - set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${${lib}_location}) - - IF("${APPLE}" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - add_library(${lib}_stdlib IMPORTED STATIC) - add_dependencies(${lib}_stdlib googletest_libstdcpp) - set_target_properties(${lib}_stdlib PROPERTIES IMPORTED_LOCATION ${${lib}_location_libstdcpp}) - ENDIF("${APPLE}" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") -endforeach() - -# Specify include dir -ExternalProject_Get_Property(googletest source_dir) -set(GTEST_INCLUDE_DIRS ${source_dir}/include) -set(GTEST_FOUND ON) diff --git a/cmake/MeshIOConfig.cmake.in b/cmake/MeshIOConfig.cmake.in new file mode 100644 index 0000000..82c92de --- /dev/null +++ b/cmake/MeshIOConfig.cmake.in @@ -0,0 +1,42 @@ +#Copyright (c) 2019, Lakshman Anumolu, Pradeep Garigipati +#All rights reserved. +# +#This file is part of MeshIO whose distribution is governed by +#the BSD 2-Clause License contained in the accompanying LICENSE.txt +#file. + +# MeshIO +# ----- +# +# This is the cmake configuration file for MeshIO header library. It provides +# the following imported targets. +# +# ``MeshIO::meshio`` - the target for MeshIO +# +# This target can be used to link with your application using the +# ``target_link_library`` command. Here is an example of how to use these +# targets in your application: +# +# add_executable(mybinary source.cpp) +# target_link_library(mybinary PRIVATE MeshIO::meshio) +# +# This example creates a mybinary executable from the source.cpp file and links +# against the MeshIO library. Note you do *not* need to set the include +# directories as they are automatically included with the target. +# +# This is the recommended way of linking against MeshIO + +@PACKAGE_INIT@ + +set_and_check(MeshIO_INCLUDE_DIRS @PACKAGE_INCLUDE_DIRS@) + +if (NOT TARGET MeshIO::meshio AND NOT TARGET meshio AND + EXISTS @PACKAGE_CMAKE_DIR@/MeshIOTargets.cmake) + include(@PACKAGE_CMAKE_DIR@/MeshIOTargets.cmake) +endif () + +if (TARGET MeshIO::meshio OR TARGET meshio) + if (TARGET meshio AND NOT TARGET MeshIO::meshio) + add_library(MeshIO::meshio ALIAS meshio) + endif () +endif () diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index ce16702..1338c52 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -1,40 +1,33 @@ -FIND_PACKAGE(Doxygen REQUIRED) +find_package(Doxygen REQUIRED) -# Documentation -IF(NOT DEFINED MESHIO_INSTALL_DOC_DIR) - SET(MESHIO_INSTALL_DOC_DIR "${CMAKE_INSTALL_PREFIX}/doc" CACHE PATH "Installation path for documentation") -ENDIF() +set(MESHIO_DOCS_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/doxygen.mk") +set(MESHIO_DOCS_CONFIG_OUT "${CMAKE_CURRENT_BINARY_DIR}/doxygen.mk.out") -SET(MESHIO_DOCS_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/doxygen.mk") -SET(MESHIO_DOCS_CONFIG_OUT "${CMAKE_CURRENT_BINARY_DIR}/doxygen.mk.out") +set(MESHIO_DOCS_LAYOUT "${CMAKE_CURRENT_SOURCE_DIR}/layout.xml") +set(MESHIO_DOCS_LAYOUT_OUT "${CMAKE_CURRENT_BINARY_DIR}/layout.xml.out") -SET(MESHIO_DOCS_LAYOUT "${CMAKE_CURRENT_SOURCE_DIR}/layout.xml") -SET(MESHIO_DOCS_LAYOUT_OUT "${CMAKE_CURRENT_BINARY_DIR}/layout.xml.out") +set(DOCS_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +set(ASSETS_DIR "${PROJECT_SOURCE_DIR}/resources") +set(INCLUDE_DIR "${PROJECT_SOURCE_DIR}/include") +set(EXAMPLES_DIR "${PROJECT_SOURCE_DIR}/examples") +set(SNIPPETS_DIR "${PROJECT_SOURCE_DIR}/test") -SET(DOCS_DIR "${CMAKE_CURRENT_SOURCE_DIR}") -SET(ASSETS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/resources") -SET(INCLUDE_DIR "${PROJECT_SOURCE_DIR}/include") -#SET(EXAMPLES_DIR "${PROJECT_SOURCE_DIR}/examples") -#Re-enable test snippets directory setting when doc examples are added -#SET(SNIPPETS_DIR "${PROJECT_SOURCE_DIR}/test") -CONFIGURE_FILE(${MESHIO_DOCS_CONFIG} ${MESHIO_DOCS_CONFIG_OUT}) -CONFIGURE_FILE(${MESHIO_DOCS_LAYOUT} ${MESHIO_DOCS_LAYOUT_OUT}) +configure_file(${MESHIO_DOCS_CONFIG} ${MESHIO_DOCS_CONFIG_OUT}) +configure_file(${MESHIO_DOCS_LAYOUT} ${MESHIO_DOCS_LAYOUT_OUT}) -ADD_CUSTOM_TARGET(docs - ALL - COMMAND ${DOXYGEN_EXECUTABLE} ${MESHIO_DOCS_CONFIG_OUT} - COMMAND cmake -E copy_directory ${ASSETS_DIR} ${CMAKE_CURRENT_BINARY_DIR}/html - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Generating Documentation" - VERBATIM) - -# Install Doxygen documentation -INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html - DESTINATION ${MESHIO_INSTALL_DOC_DIR} - COMPONENT documentation - PATTERN "*" - PATTERN ".git" EXCLUDE - PATTERN "CMakeFiles" EXCLUDE - PATTERN "man" EXCLUDE - ) +add_custom_target(docs + ALL + COMMAND ${DOXYGEN_EXECUTABLE} ${MESHIO_DOCS_CONFIG_OUT} + COMMAND cmake -E copy_directory ${ASSETS_DIR} ${CMAKE_CURRENT_BINARY_DIR}/html + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating Documentation" + VERBATIM) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html + DESTINATION docs + COMPONENT documentation + PATTERN "*" + PATTERN ".git" EXCLUDE + PATTERN "CMakeFiles" EXCLUDE + PATTERN "man" EXCLUDE + ) diff --git a/docs/doxygen.mk b/docs/doxygen.mk index 3958ddb..a2c951e 100644 --- a/docs/doxygen.mk +++ b/docs/doxygen.mk @@ -38,7 +38,7 @@ PROJECT_NAME = "MeshIO" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "" +PROJECT_NUMBER = "${PROJECT_VERSION}" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -51,7 +51,6 @@ PROJECT_BRIEF = "" # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # to the output directory. -#PROJECT_LOGO = ${ASSETS_DIR}/arrayfire_logo.png PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 350d476..1ab786c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,5 +1,3 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7) - ### Below code was used to verify GNU compiler ### version on travis-ci servers if (CMAKE_COMPILER_IS_GNUCC) @@ -13,72 +11,71 @@ if (CMAKE_COMPILER_IS_GNUCC) message(STATUS "Using GNUCC Compiler Verson ${GCC_MAJOR}.${GCC_MINOR}") endif() -############################################################################### -### Pulled the section enclosed by hashed lines from the following project. -### https://github.com/arrayfire/arrayfire/blob/devel/test/CMakeLists.txt -FIND_PACKAGE(Threads REQUIRED) -IF(CMAKE_USE_PTHREADS_INIT AND NOT "${APPLE}") - SET(THREAD_LIB_FLAG "-pthread") -ELSE() - SET(THREAD_LIB_FLAG ${CMAKE_THREAD_LIB_INIT}) -ENDIF() +if (NOT TARGET gtest) + # gtest targets cmake version 2.6 which throws warnings for policy CMP0042 on + # newer cmakes. This sets the default global setting for that policy. + set(CMAKE_POLICY_DEFAULT_CMP0042 NEW) + if(WIN32) + set(gtest_force_shared_crt ON + CACHE INTERNAL "Required so that the libs Runtime is not set to MT DLL") + endif() + + set(GOOGLETEST_VERSION 1.8.1) #DUMMY to suppress cmake bug + add_subdirectory(googletest/googletest EXCLUDE_FROM_ALL) + set_target_properties(gtest gtest_main + PROPERTIES + FOLDER "ExternalProjectTargets/gtest") + + # Hide gtest project variables + mark_as_advanced( + BUILD_SHARED_LIBS + gtest_build_samples + gtest_build_tests + gtest_disable_pthreads + gtest_force_shared_crt + gtest_hide_internal_symbols) +endif() + +file(GLOB FILES "*.cpp") -IF(USE_SYSTEM_GTEST) - FIND_PACKAGE(GTest REQUIRED) -ELSE(USE_SYSTEM_GTEST) - INCLUDE("${CMAKE_MODULE_PATH}/build_gtest.cmake") -ENDIF(USE_SYSTEM_GTEST) +foreach(FILE ${FILES}) + get_filename_component(FNAME ${FILE} NAME_WE) + set(TEST_NAME ${FNAME}) + add_test(Test_${TEST_NAME} ${TEST_NAME}) + file(GLOB TEST_FILE "${FNAME}.cpp" "${FNAME}.c") -IF(${USE_RELATIVE_TEST_DIR}) - SET(RELATIVE_TEST_DATA_DIR "../resources" CACHE STRING "Relative Test Data Directory") - SET(TESTDATA_SOURCE_DIR ${RELATIVE_TEST_DATA_DIR}) -ELSE(${USE_RELATIVE_TEST_DIR}) - SET(TESTDATA_SOURCE_DIR "${PROJECT_SOURCE_DIR}/resources") -ENDIF(${USE_RELATIVE_TEST_DIR}) + add_executable(${TEST_NAME} ${TEST_FILE}) -IF(${CMAKE_GENERATOR} STREQUAL "Xcode") - ADD_DEFINITIONS("-D TEST_DIR=\"\\\\\"${TESTDATA_SOURCE_DIR}\\\\\"\"") -ELSE(${CMAKE_GENERATOR} STREQUAL "Xcode") - ADD_DEFINITIONS("-D TEST_DIR=\"\\\"${TESTDATA_SOURCE_DIR}\\\"\"") -ENDIF(${CMAKE_GENERATOR} STREQUAL "Xcode") + set_property(TARGET ${TEST_NAME} PROPERTY CXX_STANDARD 14) -IF(NOT ${USE_RELATIVE_TEST_DIR}) -# Check if data exists -IF(EXISTS "${TESTDATA_SOURCE_DIR}" AND IS_DIRECTORY "${TESTDATA_SOURCE_DIR}" - AND EXISTS "${TESTDATA_SOURCE_DIR}/README.md") - # Test data is available - # Do Nothing -ELSE(EXISTS "${TESTDATA_SOURCE_DIR}" AND IS_DIRECTORY "${TESTDATA_SOURCE_DIR}" - AND EXISTS "${TESTDATA_SOURCE_DIR}/README.md") - MESSAGE(WARNING "Test Data is not available. Tests will build but fail when run.") - MESSAGE("Clone the repository properly and make sure there is a folder known as resources under it") -ENDIF() -ENDIF(NOT ${USE_RELATIVE_TEST_DIR}) -############################################################################### + target_include_directories(${TEST_NAME} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + ) -IF(BUILD_COVERAGE) - # debug, no optimisation - # enabling coverage - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 --coverage -fprofile-arcs -ftest-coverage") -ENDIF() + target_compile_definitions(${TEST_NAME} + PRIVATE + TEST_DIR="${MeshIO_SOURCE_DIR}/resources" + ) -INCLUDE_DIRECTORIES( - ${PROJECT_SOURCE_DIR}/include - ${CMAKE_CURRENT_SOURCE_DIR} - ${GTEST_INCLUDE_DIRS} + target_link_libraries(${TEST_NAME} + PRIVATE + meshio + gtest + gtest_main ) -FILE(GLOB FILES "*.cpp" "*.c") + if (MeshIO_BUILD_COVERAGE) + target_compile_options(${TEST_NAME} + PRIVATE + -g -O0 -fprofile-arcs -ftest-coverage + ) + target_link_libraries(${TEST_NAME} + PRIVATE + -g -O0 -fprofile-arcs -ftest-coverage + ) + endif (MeshIO_BUILD_COVERAGE) + + set_target_properties(${TEST_NAME} PROPERTIES FOLDER "Tests") -FOREACH(FILE ${FILES}) - GET_FILENAME_COMPONENT(FNAME ${FILE} NAME_WE) - SET(TEST_NAME ${FNAME}) - ADD_TEST(Test_${TEST_NAME} ${TEST_NAME}) - FILE(GLOB TEST_FILE "${FNAME}.cpp" "${FNAME}.c") - ADD_EXECUTABLE(${TEST_NAME} ${TEST_FILE}) - ## Following commented out changes work only on CMAKE version >=3.0 - TARGET_LINK_LIBRARIES(${TEST_NAME} INTERFACE MeshIO - PRIVATE ${THREAD_LIB_FLAG} - PRIVATE ${GTEST_LIBRARIES}) - SET_TARGET_PROPERTIES(${TEST_NAME} PROPERTIES FOLDER "Tests") -ENDFOREACH() + add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME}) +endforeach() diff --git a/test/googletest b/test/googletest index 23574bf..2fe3bd9 160000 --- a/test/googletest +++ b/test/googletest @@ -1 +1 @@ -Subproject commit 23574bf2333f834ff665f894c97bef8a5b33a0a9 +Subproject commit 2fe3bd994b3189899d93f1d5a881e725e046fdc2