1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
project(savitar)
cmake_minimum_required(VERSION 3.6)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
include(GenerateExportHeader)
option(BUILD_PYTHON "Build " ON)
option(BUILD_STATIC "Build as a static library" OFF)
option(BUILD_TESTS "Building the test-suite" OFF)
if(BUILD_TESTS)
message(STATUS "Building with tests...")
find_package(GTest REQUIRED)
find_package(Threads QUIET)
endif()
find_path(PUGIXML_INCLUDE_DIR "pugixml.hpp" REQUIRED)
find_library(PUGIXML_LIBRARY pugixml REQUIRED)
include_directories(${PUGIXML_INCLUDE_DIR} SYSTEM)
if(BUILD_PYTHON)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
# FIXME: Use FindPython3 to find Python, new in CMake 3.12.
# However currently on our CI server it finds the wrong Python version and then doesn't find the headers.
find_package(PythonInterp ${PYVER} EXACT REQUIRED)
find_package(PythonLibs ${PYVER} EXACT REQUIRED)
find_package(SIP REQUIRED)
if(NOT DEFINED LIB_SUFFIX)
set(LIB_SUFFIX "")
endif()
set(Python3_SITEARCH lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages CACHE STRING "Directory to install Python bindings to")
include_directories(python/ src/ ${SIP_INCLUDE_DIRS} ${Python3_INCLUDE_DIRS})
endif()
set(CMAKE_CXX_STANDARD 11)
if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
endif()
set(savitar_SRCS
src/Namespace.cpp
src/ThreeMFParser.cpp
src/SceneNode.cpp
src/Scene.cpp
src/MeshData.cpp
src/Vertex.cpp
src/Face.cpp
)
set(savitar_HDRS
src/Namespace.h
src/ThreeMFParser.h
src/Types.h
src/SceneNode.h
src/Scene.h
src/MeshData.h
src/Vertex.h
src/Face.h
${CMAKE_CURRENT_BINARY_DIR}/src/SavitarExport.h
)
set(SAVITAR_VERSION 0.1.2)
set(SAVITAR_SOVERSION 0)
if(BUILD_STATIC)
add_library(Savitar STATIC ${savitar_SRCS})
else()
add_library(Savitar SHARED ${savitar_SRCS})
endif()
set(Savitar_LINK_LIBRARIES ${PUGIXML_LIBRARY})
if(CMAKE_USE_PTHREADS_INIT)
list(APPEND Savitar_LINK_LIBRARIES pthread)
endif()
target_link_libraries(Savitar PUBLIC ${Savitar_LINK_LIBRARIES})
if(NOT WIN32 OR CMAKE_COMPILER_IS_GNUCXX)
set_target_properties(Savitar PROPERTIES COMPILE_FLAGS -fPIC)
endif()
if(BUILD_PYTHON)
set(SIP_EXTRA_FILES_DEPEND python/Types.sip python/MeshData.sip python/SceneNode.sip python/Scene.sip)
#set(SIP_EXTRA_SOURCE_FILES python/Types.cpp)
set(SIP_EXTRA_OPTIONS -g) # -g means always release the GIL before calling C++ methods.
add_sip_python_module(Savitar python/ThreeMFParser.sip Savitar)
endif()
target_include_directories(Savitar PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
if(${CMAKE_BUILD_TYPE})
if(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
add_definitions(-DSAVITAR_DEBUG)
endif()
endif()
set_target_properties(Savitar PROPERTIES
FRAMEWORK FALSE
VERSION ${SAVITAR_VERSION}
SOVERSION ${SAVITAR_SOVERSION}
PUBLIC_HEADER "${savitar_HDRS}"
DEFINE_SYMBOL MAKE_SAVITAR_LIB
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN 1
)
generate_export_header(Savitar
EXPORT_FILE_NAME src/SavitarExport.h
)
# This is required when building out-of-tree.
# The compiler won't find the generated header otherwise.
include_directories(${CMAKE_BINARY_DIR}/src)
install(TARGETS Savitar
EXPORT Savitar-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/Savitar
)
install(EXPORT Savitar-targets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Savitar
)
configure_package_config_file(SavitarConfig.cmake.in ${CMAKE_BINARY_DIR}/SavitarConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Savitar)
write_basic_package_version_file(${CMAKE_BINARY_DIR}/SavitarConfigVersion.cmake VERSION ${SAVITAR_VERSION} COMPATIBILITY SameMajorVersion)
# List of tests. For each test there must be a file tests/${NAME}.cpp.
set(savitar_TEST
ThreeMFParserTest
MeshDataTest
NamespaceTest
)
# Compiling the test environment.
if (BUILD_TESTS)
include_directories(${GTEST_INCLUDE_DIR})
enable_testing()
#To make sure that the tests are built before running them, add the building of these tests as an additional test.
add_custom_target(build_all_tests)
add_test(BuildTests "${CMAKE_COMMAND}" --build ${CMAKE_CURRENT_BINARY_DIR} --target build_all_tests)
foreach (test ${savitar_TEST})
add_executable(${test} tests/main.cpp tests/${test}.cpp)
target_link_libraries(${test} Savitar ${GTEST_BOTH_LIBRARIES})
add_test(${test} ${test})
add_dependencies(build_all_tests ${test}) #Make sure that this gets built as part of the build_all_tests target.
endforeach()
endif()
install(FILES
${CMAKE_BINARY_DIR}/SavitarConfig.cmake
${CMAKE_BINARY_DIR}/SavitarConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Savitar
)
|