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_DIR} ${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,41 +89,136 @@ 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+ target_include_directories (${STATIC_TARGET_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /src> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR} >)
110+
111+ # generate fat static library by adding dependencies
112+ include (cmake/AddStaticLibs.cmake)
113+ addStaticLibs(${STATIC_TARGET_NAME} blosc_static)
114+ endif ()
115+
116+ if (APR_BUILD_SHARED_LIB)
117+ # generate fat shared library
118+ set (SHARED_TARGET_NAME sharedLib)
119+ add_library (${SHARED_TARGET_NAME} SHARED $<TARGET_OBJECTS:aprObjLib>)
120+ target_include_directories (${SHARED_TARGET_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /src> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR} >)
121+ set_target_properties (${SHARED_TARGET_NAME} PROPERTIES OUTPUT_NAME ${LIBRARY_NAME} )
122+ set_target_properties (${SHARED_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_NAME ${LIBRARY_NAME} )
123+ set_target_properties (${SHARED_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_NAME ${LIBRARY_NAME} )
124+ add_dependencies (${SHARED_TARGET_NAME} blosc_static)
125+ set_property (TARGET ${SHARED_TARGET_NAME} PROPERTY VERSION ${APR_VERSION_STRING} )
126+ set_property (TARGET ${SHARED_TARGET_NAME} PROPERTY SOVERSION ${APR_VERSION_MAJOR} )
127+ target_link_libraries (${SHARED_TARGET_NAME} PRIVATE ${HDF5_LIBRARIES} ${TIFF_LIBRARIES} -Wl,-force_load,$<TARGET_FILE:blosc_static>)
128+ endif ()
129+
130+ # choose one of the build libraries to be used later for tests and/or examples
131+ if (APR_BUILD_SHARED_LIB)
132+ set (APR_BUILD_LIBRARY ${SHARED_TARGET_NAME} )
133+ else ()
134+ set (APR_BUILD_LIBRARY ${STATIC_TARGET_NAME} )
135+ endif ()
136+
137+
138+ ###############################################################################
139+ # Install APR library
140+ ###############################################################################
141+ if (APR_INSTALL)
142+ set (INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries" )
143+ set (INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files" )
144+ set (INSTALL_INCLUDE_PROJECT_DIR ${INSTALL_INCLUDE_DIR} /${LIBRARY_NAME} CACHE PATH "Installation directory for header files" )
145+ set (INSTALL_CMAKE_DIR ${INSTALL_LIB_DIR} /cmake/${LIBRARY_NAME} CACHE PATH "Installation directory for cmake files" )
146+
147+ message (STATUS "APR: Install library in [${CMAKE_INSTALL_PREFIX} ]" )
148+ set (INC_DIRS src/algorithm src/data_structures src/io src/misc src/numerics src/vis)
149+ install (DIRECTORY ${INC_DIRS} DESTINATION ${INSTALL_INCLUDE_PROJECT_DIR} COMPONENT DEV FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h" )
150+ # TODO: It is installed twice since it is used by different compoonents - it must be fixed
151+ install (FILES ${PROJECT_BINARY_DIR} /ConfigAPR.h COMPONENT DEV DESTINATION ${INSTALL_INCLUDE_PROJECT_DIR} /io)
152+ install (FILES ${PROJECT_BINARY_DIR} /ConfigAPR.h COMPONENT DEV DESTINATION ${INSTALL_INCLUDE_PROJECT_DIR} )
153+
154+ set (APR_TARGETS LibAprTargets)
155+ install (TARGETS ${SHARED_TARGET_NAME} ${STATIC_TARGET_NAME}
156+ EXPORT ${APR_TARGETS}
157+ LIBRARY DESTINATION ${INSTALL_LIB_DIR}
158+ ARCHIVE DESTINATION ${INSTALL_LIB_DIR}
159+ INCLUDES DESTINATION ${INSTALL_INCLUDE_DIR} ${INSTALL_INCLUDE_DIR} /${LIBRARY_NAME} )
160+
161+ # pkg-config
162+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/apr.pc.in" "${CMAKE_CURRENT_BINARY_DIR} /apr.pc" @ONLY)
163+ install (FILES "${CMAKE_CURRENT_BINARY_DIR} /apr.pc" DESTINATION lib/pkgconfig COMPONENT DEV)
164+
165+ # AprTargets
166+ set (APR_NAMESPACE ${LIBRARY_NAME} ::)
167+ export ( EXPORT ${APR_TARGETS} FILE "${CMAKE_CURRENT_BINARY_DIR} /AprTargets.cmake" NAMESPACE ${APR_NAMESPACE} )
168+ install (EXPORT ${APR_TARGETS} FILE AprTargets.cmake NAMESPACE ${APR_NAMESPACE} DESTINATION ${INSTALL_CMAKE_DIR} )
169+
170+ # AprConfig
171+ configure_file (cmake/AprConfig.cmake "${CMAKE_CURRENT_BINARY_DIR} /AprConfig.cmake" @ONLY)
172+ install (FILES ${CMAKE_CURRENT_BINARY_DIR} /AprConfig.cmake ${CMAKE_CURRENT_BINARY_DIR} /AprConfigVersion.cmake DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT DEV)
173+
174+ # AprConfigVersion
175+ include (CMakePackageConfigHelpers)
176+ write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR} /AprConfigVersion.cmake" VERSION ${APR_VERSION_STRING} COMPATIBILITY AnyNewerVersion)
177+
178+ # uninstall
179+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/cmake-uninstall.cmake.in"
180+ "${CMAKE_CURRENT_BINARY_DIR} /cmake-uninstall.cmake"
181+ IMMEDIATE @ONLY)
182+ add_custom_target (uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR} /cmake-uninstall.cmake)
183+ endif (APR_INSTALL)
66184
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)
71185
72186###############################################################################
73187# Examples
74188###############################################################################
75- option (APR_BUILD_EXAMPLES "Build APR examples" ON )
76189if (APR_BUILD_EXAMPLES)
190+ include_directories (src)
77191 message (STATUS "APR: Building examples" )
78192 add_subdirectory (examples)
79193endif (APR_BUILD_EXAMPLES)
80194
195+
81196###############################################################################
82197# Tests
83198###############################################################################
84- option (APR_TESTS "Build tests wrappers" OFF )
85199if (APR_TESTS)
200+ include_directories (src)
86201 message (STATUS "APR: Building tests" )
87- add_subdirectory ("external/gtest" )
88- set (GTEST_LIBRARIES gtest)
202+ if (APR_PREFER_EXTERNAL_GTEST)
203+ find_package (GTest 1.8.0)
204+ endif ()
205+ if (GTEST_FOUND)
206+ include_directories (${GTEST_INCLUDE_DIRS} )
207+ else (GTEST_FOUND)
208+ set (BUILD_GMOCK OFF CACHE BOOL "" FORCE)
209+ set (BUILD_GTEST ON CACHE BOOL "" FORCE)
210+ set (INSTALL_GTEST OFF CACHE BOOL "" FORCE)
211+ message (STATUS "APR: GTest not found, using internal gtest" )
212+ add_subdirectory ("external/gtest" )
213+ set (GTEST_LIBRARIES gtest)
214+ endif (GTEST_FOUND)
89215 add_subdirectory (test )
90216endif (APR_TESTS)
91217
218+
92219###############################################################################
93220# JAVA wrappers
94221###############################################################################
95- option (APR_BUILD_JAVA_WRAPPERS "Build JAVA wrappers" OFF )
96222if (APR_BUILD_JAVA_WRAPPERS)
97223 message (STATUS "APR: Building JAVA wrappers" )
98224 find_package (SWIG 3.0 REQUIRED)
0 commit comments