Skip to content

Commit a4738b1

Browse files
authored
Merge pull request #2 from cheesema/master
Merge with cheesema/LibAPR
2 parents 70d1a75 + b0d89b8 commit a4738b1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1287
-1090
lines changed

.gitmodules

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[submodule "external/glm"]
22
path = external/glm
33
url = https://github.com/g-truc/glm.git
4-
[submodule "external/c-blosc"]
5-
path = external/c-blosc
6-
url = https://github.com/Blosc/c-blosc
74
[submodule "external/gtest"]
85
path = external/gtest
96
url = https://github.com/google/googletest
7+
[submodule "external/c-blosc"]
8+
path = external/c-blosc
9+
url = https://github.com/Blosc/c-blosc

CMakeLists.txt

Lines changed: 145 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,82 @@
22
# APR - Adaptive Particle Representation
33
###############################################################################
44
cmake_minimum_required(VERSION 3.2)
5-
project(LibAPR)
5+
project(LibAPR DESCRIPTION "Adaptive Particle Representation library")
6+
67
set(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
###############################################################################
1127
set (APR_VERSION_MAJOR 1)
1228
set (APR_VERSION_MINOR 0)
1329
set (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)
1734
string(REGEX REPLACE "\n$" "" APR_GIT_HASH "${APR_GIT_HASH}")
1835
configure_file (
1936
"${PROJECT_SOURCE_DIR}/src/ConfigAPR.h.in"
2037
"${PROJECT_BINARY_DIR}/ConfigAPR.h"
2138
)
2239
include_directories("${PROJECT_BINARY_DIR}")
40+
message("Configuring for APR version: " ${APR_VERSION_STRING})
41+
2342

2443
###############################################################################
2544
# Find all required libraries
2645
###############################################################################
2746
find_package(HDF5 REQUIRED)
2847
find_package(TIFF REQUIRED)
48+
49+
# Handle OpenMP
2950
find_package(OpenMP)
3051
if(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.")
3253
else()
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}")
3556
endif()
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)
3768
add_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)
4072
include_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)
5081
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -pedantic ")
5182
if(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")
5990
endif()
6091

92+
6193
###############################################################################
6294
# Generate APR library
6395
###############################################################################
96+
97+
set(LIBRARY_NAME apr)
98+
6499
set(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)
76189
if(APR_BUILD_EXAMPLES)
190+
include_directories(src)
77191
message(STATUS "APR: Building examples")
78192
add_subdirectory(examples)
79193
endif(APR_BUILD_EXAMPLES)
80194

195+
81196
###############################################################################
82197
# Tests
83198
###############################################################################
84-
option (APR_TESTS "Build tests wrappers" OFF)
85199
if(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)
90216
endif(APR_TESTS)
91217

218+
92219
###############################################################################
93220
# JAVA wrappers
94221
###############################################################################
95-
option (APR_BUILD_JAVA_WRAPPERS "Build JAVA wrappers" OFF)
96222
if(APR_BUILD_JAVA_WRAPPERS)
97223
message(STATUS "APR: Building JAVA wrappers")
98224
find_package(SWIG 3.0 REQUIRED)

cmake/AddStaticLibs.cmake

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Adds staticLib to provided (existing) static target. Useful for merging all dependencies to
2+
# one fat static lib.
3+
# Use: addStaticLibs(libStatic someStaticLibToMerge [evenMoreStaticLibsIfNeeded])
4+
function(addStaticLibs outLibTarget)
5+
get_target_property(libtype ${outLibTarget} TYPE)
6+
if(NOT libtype STREQUAL "STATIC_LIBRARY")
7+
message(FATAL_ERROR "[${outLibTarget}] is not a static lib")
8+
endif()
9+
# Get unique list of libraries to be merged
10+
set(libsToMerge ${ARGV})
11+
list(REMOVE_AT libsToMerge 0)
12+
list(REMOVE_DUPLICATES libsToMerge)
13+
14+
# Get the file names of the libraries to be merged
15+
foreach(lib ${libsToMerge})
16+
get_target_property(libtype ${lib} TYPE)
17+
if(NOT libtype STREQUAL "STATIC_LIBRARY")
18+
message(FATAL_ERROR "[${lib}] is not a static lib!")
19+
endif()
20+
list(APPEND filesToMerge $<TARGET_FILE:${lib}>)
21+
endforeach()
22+
23+
set(outLibFile $<TARGET_FILE:${outLibTarget}>)
24+
# --------------- Mac OS ----------------
25+
find_program(HAS_LIBTOOL "libtool") #if not found it will go to UNIX section on Mac
26+
if(APPLE AND HAS_LIBTOOL )
27+
add_custom_command(TARGET ${outLibTarget} POST_BUILD
28+
COMMAND libtool -static -o ${outLibFile} ${outLibFile} ${filesToMerge})
29+
# --------------- UNIX -------------------
30+
elseif(UNIX)
31+
foreach(lib ${libsToMerge})
32+
set(libObjDir mergedLibs/${lib}.objDir)
33+
34+
# create object directory for current lib ...
35+
add_custom_command(
36+
TARGET ${outLibTarget}
37+
COMMAND ${CMAKE_COMMAND} -E make_directory ${libObjDir})
38+
39+
# ... and output all obj from archive, then merge them into outLibTarget
40+
add_custom_command(
41+
TARGET ${outLibTarget} POST_BUILD
42+
COMMAND ${CMAKE_AR} -x $<TARGET_FILE:${lib}>
43+
COMMAND ${CMAKE_AR} rus ${outLibFile} *.o
44+
WORKING_DIRECTORY ${libObjDir})
45+
endforeach()
46+
# --------------- Windows ---------------
47+
elseif(WIN32)
48+
set_target_properties(${outLibTarget} PROPERTIES STATIC_LIBRARY_FLAGS "${filesToMerge}")
49+
endif()
50+
endfunction()

cmake/AprConfig.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include("${CMAKE_CURRENT_LIST_DIR}/AprTargets.cmake")

cmake/apr.pc.in

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
prefix=@CMAKE_INSTALL_PREFIX@
2+
exec_prefix=${prefix}
3+
libdir=${exec_prefix}/lib
4+
sharedlibdir=${libdir}
5+
includedir=${prefix}/include
6+
7+
Name: apr
8+
Description: LibAPR - Adaptive Particle Representation library
9+
URL: https://github.com/cheesema/LibAPR
10+
Version: @APR_VERSION_STRING@
11+
12+
Requires:
13+
Libs: -L${libdir} -L${sharedlibdir} -lblosc
14+
Cflags: -I${includedir}

cmake/cmake-uninstall.cmake.in

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
2+
message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
3+
endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
4+
5+
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
6+
string(REGEX REPLACE "\n" ";" files "${files}")
7+
list(REVERSE files)
8+
foreach (file ${files})
9+
message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
10+
if (EXISTS "$ENV{DESTDIR}${file}")
11+
execute_process(
12+
COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
13+
OUTPUT_VARIABLE rm_out
14+
RESULT_VARIABLE rm_retval
15+
)
16+
if(NOT ${rm_retval} EQUAL 0)
17+
message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
18+
endif (NOT ${rm_retval} EQUAL 0)
19+
else (EXISTS "$ENV{DESTDIR}${file}")
20+
message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
21+
endif (EXISTS "$ENV{DESTDIR}${file}")
22+
endforeach(file)

examples/CMakeLists.txt

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
1-
add_executable(Example_get_apr Example_get_apr.cpp )
2-
add_executable(Example_apr_iterate Example_apr_iterate.cpp)
3-
add_executable(Example_reconstruct_image Example_reconstruct_image.cpp)
4-
add_executable(Example_compress Example_compress_apr.cpp)
5-
add_executable(Example_produce_paraview_file Example_produce_paraview_file.cpp)
6-
add_executable(Example_apr_neighbour_access Example_apr_neighbour_access.cpp)
7-
add_executable(Example_compute_gradient Example_compute_gradient.cpp)
8-
add_executable(Example_random_access Example_random_access.cpp)
9-
add_executable(Example_ray_cast Example_ray_cast.cpp)
1+
macro(buildTarget TARGET)
2+
add_executable(${TARGET} ${TARGET}.cpp)
3+
target_link_libraries(${TARGET} ${HDF5_LIBRARIES} ${TIFF_LIBRARIES} ${APR_BUILD_LIBRARY})
4+
endmacro(buildTarget)
105

11-
target_link_libraries(Example_get_apr libapr)
12-
target_link_libraries(Example_apr_iterate libapr)
13-
target_link_libraries(Example_reconstruct_image libapr)
14-
target_link_libraries(Example_apr_neighbour_access libapr)
15-
target_link_libraries(Example_produce_paraview_file libapr)
16-
target_link_libraries(Example_compress libapr)
17-
target_link_libraries(Example_compute_gradient libapr)
18-
target_link_libraries(Example_random_access libapr)
19-
target_link_libraries(Example_ray_cast libapr)
6+
buildTarget(Example_get_apr)
7+
buildTarget(Example_apr_iterate)
8+
buildTarget(Example_reconstruct_image)
9+
buildTarget(Example_compress_apr)
10+
buildTarget(Example_produce_paraview_file)
11+
buildTarget(Example_apr_neighbour_access)
12+
buildTarget(Example_compute_gradient)
13+
buildTarget(Example_random_access)
14+
buildTarget(Example_ray_cast)

examples/Example_apr_iterate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <functional>
55
#include <string>
66

7-
#include "src/data_structures/APR/APR.hpp"
7+
#include "data_structures/APR/APR.hpp"
88

99
struct cmdLineOptions{
1010
std::string output = "output";

0 commit comments

Comments
 (0)