22# APR - Adaptive Particle Representation
33###############################################################################
44cmake_minimum_required (VERSION 3.2)
5- project (LibAPR)
5+ project (LibAPR DESCRIPTION "Adaptive Particle Representation library" )
6+
67set (CMAKE_CXX_STANDARD 14)
78
9+ # APR build options:
10+ option (APR_INSTALL "Install APR library" ON )
11+ option (APR_BUILD_SHARED_LIB "Builds shared library" ON )
12+ option (APR_BUILD_STATIC_LIB "Builds shared library" ON )
13+ option (APR_BUILD_EXAMPLES "Build APR examples" OFF )
14+ option (APR_TESTS "Build APR tests" OFF )
15+ option (APR_PREFER_EXTERNAL_GTEST "When found, use the installed GTEST libs instead of included sources" OFF )
16+ option (APR_BUILD_JAVA_WRAPPERS "Build APR JAVA wrappers" OFF )
17+
18+ # Validation of options
19+ if (NOT APR_BUILD_SHARED_LIB AND NOT APR_BUILD_STATIC_LIB)
20+ message (FATAL_ERROR "At least one target: APR_BUILD_SHARED_LIB or APR_BUILD_STATIC_LIB must be build!" )
21+ endif ()
22+
23+
824###############################################################################
925# Generate configuration file
1026###############################################################################
1127set (APR_VERSION_MAJOR 1)
1228set (APR_VERSION_MINOR 0)
1329set (APR_VERSION_PATCH 0)
14- execute_process (COMMAND git rev-parse HEAD
15- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
16- OUTPUT_VARIABLE APR_GIT_HASH)
30+ set (APR_VERSION_STRING ${APR_VERSION_MAJOR} .${APR_VERSION_MINOR} .${APR_VERSION_PATCH} )
31+ execute_process (COMMAND git rev-parse HEAD
32+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
33+ OUTPUT_VARIABLE APR_GIT_HASH)
1734string (REGEX REPLACE "\n $" "" APR_GIT_HASH "${APR_GIT_HASH} " )
1835configure_file (
1936 "${PROJECT_SOURCE_DIR} /src/ConfigAPR.h.in"
2037 "${PROJECT_BINARY_DIR} /ConfigAPR.h"
2138)
2239include_directories ("${PROJECT_BINARY_DIR} " )
40+ message ("Configuring for APR version: " ${APR_VERSION_STRING} )
41+
2342
2443###############################################################################
2544# Find all required libraries
2645###############################################################################
2746find_package (HDF5 REQUIRED)
2847find_package (TIFF REQUIRED)
48+
49+ # Handle OpenMP
2950find_package (OpenMP)
3051if (NOT OPENMP_FOUND OR DISABLE_OPENMP)
3152 message ("OpenMP support not found with current compiler. While APR can compile like this, performance might not be optimal. Please see README.md for instructions." )
3253else ()
3354 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_OPENMP ${OpenMP_C_FLAGS} " )
3455 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_OPENMP ${OpenMP_CXX_FLAGS} " )
3556endif ()
36- include_directories (${HDF5_INCLUDE_DIRS} ${TIFF_INCLUDE_DIR} )
57+ include_directories (${HDF5_INCLUDE_DIRS} ${TIFF_INCLUDE_DIR} )
58+
59+ # needed here for blosc library
60+ SET (CMAKE_POSITION_INDEPENDENT_CODE ON )
61+
62+ # Configure and add submodule BLOSC
63+ set (BLOSC_IS_SUBPROJECT ON )
64+ set (BUILD_TESTS OFF CACHE BOOL "" FORCE)
65+ set (BUILD_BENCHMARKS OFF CACHE BOOL "" FORCE)
66+ set (BUILD_SHARED OFF CACHE BOOL "" FORCE)
67+ set (BUILD_STATIC ON CACHE BOOL "" FORCE)
3768add_subdirectory ("external/c-blosc" )
38- set_target_properties (blosc_shared PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR} )
39- set_target_properties (blosc_shared PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR} )
69+ include_directories (external/c-blosc/blosc)
70+
71+ # Add submodule GLM (include files only)
4072include_directories ("external/glm" )
41- include_directories ( "external/c-blosc/blosc" )
73+
4274
4375###############################################################################
4476# Configure compiler options
4577###############################################################################
4678# If you ever want to compile with Intel's icc (or any other compiler) provide
4779# compiler names/paths in cmake command like this:
4880# CC="icc" CXX="icc" CXXFLAGS="-O3" cmake -DAPR_TESTS=1
49- SET (CMAKE_POSITION_INDEPENDENT_CODE ON )
5081set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -pedantic " )
5182if (CMAKE_COMPILER_IS_GNUCC)
5283 set (CMAKE_CXX_FLAGS_RELEASE "-O4 -ffast-math" )
@@ -58,47 +89,134 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
5889 set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g" )
5990endif ()
6091
92+
6193###############################################################################
6294# Generate APR library
6395###############################################################################
96+
97+ set (LIBRARY_NAME apr)
98+
6499set (SOURCE_FILES src/io/blosc_filter.c src/io/hdf5functions_blosc.cpp)
65- set (SOURCE_FILES_RAYCAST src/vis/Camera.cpp src/vis/Object.cpp src/vis/RaytracedObject.cpp)
100+ set (SOURCE_FILES_RAYCAST src/numerics/APRRaycaster.cpp src/vis/Camera.cpp src/vis/Object.cpp src/vis/RaytracedObject.cpp)
101+
102+ add_library (aprObjLib OBJECT ${SOURCE_FILES} ${SOURCE_FILES_RAYCAST} )
103+
104+ if (APR_BUILD_STATIC_LIB)
105+ # generate static library used as a intermediate step in generating fat lib
106+ set (STATIC_TARGET_NAME staticLib)
107+ add_library (${STATIC_TARGET_NAME} STATIC $<TARGET_OBJECTS:aprObjLib>)
108+ set_target_properties (${STATIC_TARGET_NAME} PROPERTIES OUTPUT_NAME ${LIBRARY_NAME} )
109+
110+ # generate fat static library by adding dependencies
111+ include (cmake/AddStaticLibs.cmake)
112+ addStaticLibs(${STATIC_TARGET_NAME} blosc_static)
113+ endif ()
114+
115+ if (APR_BUILD_SHARED_LIB)
116+ # generate fat shared library
117+ set (SHARED_TARGET_NAME sharedLib)
118+ add_library (${SHARED_TARGET_NAME} SHARED $<TARGET_OBJECTS:aprObjLib>)
119+ set_target_properties (${SHARED_TARGET_NAME} PROPERTIES OUTPUT_NAME ${LIBRARY_NAME} )
120+ set_target_properties (${SHARED_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_NAME ${LIBRARY_NAME} )
121+ set_target_properties (${SHARED_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_NAME ${LIBRARY_NAME} )
122+ add_dependencies (${SHARED_TARGET_NAME} blosc_static)
123+ set_property (TARGET ${SHARED_TARGET_NAME} PROPERTY VERSION ${APR_VERSION_STRING} )
124+ set_property (TARGET ${SHARED_TARGET_NAME} PROPERTY SOVERSION ${APR_VERSION_MAJOR} )
125+ target_link_libraries (${SHARED_TARGET_NAME} PRIVATE ${HDF5_LIBRARIES} ${TIFF_LIBRARIES} -Wl,-force_load,$<TARGET_FILE:blosc_static>)
126+ endif ()
127+
128+ # choose one of the build libraries to be used later for tests and/or examples
129+ if (APR_BUILD_SHARED_LIB)
130+ set (APR_BUILD_LIBRARY ${SHARED_TARGET_NAME} )
131+ else ()
132+ set (APR_BUILD_LIBRARY ${STATIC_TARGET_NAME} )
133+ endif ()
134+
135+
136+ ###############################################################################
137+ # Install APR library
138+ ###############################################################################
139+ if (APR_INSTALL)
140+ set (INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries" )
141+ set (INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files" )
142+ set (INSTALL_INCLUDE_PROJECT_DIR ${INSTALL_INCLUDE_DIR} /${LIBRARY_NAME} CACHE PATH "Installation directory for header files" )
143+ set (INSTALL_CMAKE_DIR ${INSTALL_LIB_DIR} /cmake/${LIBRARY_NAME} CACHE PATH "Installation directory for cmake files" )
144+
145+ message (STATUS "APR: Install library in [${CMAKE_INSTALL_PREFIX} ]" )
146+ set (INC_DIRS src/algorithm src/data_structures src/io src/misc src/numerics src/vis)
147+ install (DIRECTORY ${INC_DIRS} DESTINATION ${INSTALL_INCLUDE_PROJECT_DIR} COMPONENT DEV FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h" )
148+ # TODO: It is installed twice since it is used by different compoonents - it must be fixed
149+ install (FILES ${PROJECT_BINARY_DIR} /ConfigAPR.h COMPONENT DEV DESTINATION ${INSTALL_INCLUDE_PROJECT_DIR} /io)
150+ install (FILES ${PROJECT_BINARY_DIR} /ConfigAPR.h COMPONENT DEV DESTINATION ${INSTALL_INCLUDE_PROJECT_DIR} )
151+
152+ set (APR_TARGETS LibAprTargets)
153+ install (TARGETS ${SHARED_TARGET_NAME} ${STATIC_TARGET_NAME}
154+ EXPORT ${APR_TARGETS}
155+ LIBRARY DESTINATION ${INSTALL_LIB_DIR}
156+ ARCHIVE DESTINATION ${INSTALL_LIB_DIR}
157+ INCLUDES DESTINATION ${INSTALL_INCLUDE_DIR} )
158+
159+ # pkg-config
160+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/apr.pc.in" "${CMAKE_CURRENT_BINARY_DIR} /apr.pc" @ONLY)
161+ install (FILES "${CMAKE_CURRENT_BINARY_DIR} /apr.pc" DESTINATION lib/pkgconfig COMPONENT DEV)
162+
163+ # AprTargets
164+ set (APR_NAMESPACE ${LIBRARY_NAME} ::)
165+ export ( EXPORT ${APR_TARGETS} FILE "${CMAKE_CURRENT_BINARY_DIR} /AprTargets.cmake" NAMESPACE ${APR_NAMESPACE} )
166+ install (EXPORT ${APR_TARGETS} FILE AprTargets.cmake NAMESPACE ${APR_NAMESPACE} DESTINATION ${INSTALL_CMAKE_DIR} )
167+
168+ # AprConfig
169+ configure_file (cmake/AprConfig.cmake "${CMAKE_CURRENT_BINARY_DIR} /AprConfig.cmake" @ONLY)
170+ install (FILES ${CMAKE_CURRENT_BINARY_DIR} /AprConfig.cmake ${CMAKE_CURRENT_BINARY_DIR} /AprConfigVersion.cmake DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT DEV)
171+
172+ # AprConfigVersion
173+ include (CMakePackageConfigHelpers)
174+ write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR} /AprConfigVersion.cmake" VERSION ${APR_VERSION_STRING} COMPATIBILITY AnyNewerVersion)
175+
176+ # uninstall
177+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/cmake-uninstall.cmake.in"
178+ "${CMAKE_CURRENT_BINARY_DIR} /cmake-uninstall.cmake"
179+ IMMEDIATE @ONLY)
180+ add_custom_target (uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR} /cmake-uninstall.cmake)
181+ endif (APR_INSTALL)
66182
67- add_library (libapr ${SOURCE_FILES} ${SOURCE_FILES_RAYCAST} )
68- set_target_properties (libapr PROPERTIES PREFIX "" )
69- target_include_directories (libapr PUBLIC . src external/glm ${PROJECT_BINARY_DIR} )
70- target_link_libraries (libapr PUBLIC ${HDF5_LIBRARIES} ${TIFF_LIBRARIES} blosc_shared)
71183
72184###############################################################################
73185# Examples
74186###############################################################################
75- option (APR_BUILD_EXAMPLES "Build APR examples" ON )
76187if (APR_BUILD_EXAMPLES)
188+ include_directories (src)
77189 message (STATUS "APR: Building examples" )
78190 add_subdirectory (examples)
79191endif (APR_BUILD_EXAMPLES)
80192
193+
81194###############################################################################
82195# Tests
83196###############################################################################
84- option (APR_TESTS "Build tests wrappers" OFF )
85197if (APR_TESTS)
198+ include_directories (src)
86199 message (STATUS "APR: Building tests" )
87- find_package (GTest 1.8.0)
200+ if (APR_PREFER_EXTERNAL_GTEST)
201+ find_package (GTest 1.8.0)
202+ endif ()
88203 if (GTEST_FOUND)
89204 include_directories (${GTEST_INCLUDE_DIRS} )
90205 else (GTEST_FOUND)
206+ set (BUILD_GMOCK OFF CACHE BOOL "" FORCE)
207+ set (BUILD_GTEST ON CACHE BOOL "" FORCE)
208+ set (INSTALL_GTEST OFF CACHE BOOL "" FORCE)
91209 message (STATUS "APR: GTest not found, using internal gtest" )
92210 add_subdirectory ("external/gtest" )
93211 set (GTEST_LIBRARIES gtest)
94212 endif (GTEST_FOUND)
95213 add_subdirectory (test )
96214endif (APR_TESTS)
97215
216+
98217###############################################################################
99218# JAVA wrappers
100219###############################################################################
101- option (APR_BUILD_JAVA_WRAPPERS "Build JAVA wrappers" OFF )
102220if (APR_BUILD_JAVA_WRAPPERS)
103221 message (STATUS "APR: Building JAVA wrappers" )
104222 find_package (SWIG 3.0 REQUIRED)
0 commit comments