Skip to content

Commit 17edeb1

Browse files
committed
Allow building against system libs instead of bundled dependencies
When DIP_BUILD_BUNDLED_DEPENDENCIES=OFF is passed to cmake, we will rely on find_package to find Eigen3, zlib, jpeg, ics and tiff libraries. The fftw_api.h header will always be used, as it's not public API that's included in the fftw3 package on ArchLinux e.g. The default for this option is still ON, i.e. this is an opt-in feature. Change-Id: I4ed9095eefbfd889642d1c3d42b3d9af0dfc15ae
1 parent 65c29a8 commit 17edeb1

File tree

7 files changed

+191
-19
lines changed

7 files changed

+191
-19
lines changed

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ endif()
2222
set(DIP_SHARED_LIBRARY ON CACHE BOOL "Build a shared library (off for static library)")
2323
set(BUILD_SHARED_LIBS ${DIP_SHARED_LIBRARY})
2424

25+
# build bundled dependencies or use find_package?
26+
set(DIP_BUILD_BUNDLED_DEPENDENCIES ON CACHE BOOL "Build the bundled dependencies or use find_package otherwise")
27+
2528
# Installation path
2629
set(CMAKE_INSTALL_PREFIX "${CMAKE_BUILD_TYPE}" CACHE PATH "Installation directory")
2730
set(DOCUMENTATION_OUTPUT share/doc/DIPlib)

dependencies/libics/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ endif(UNIX)
100100
#endif()
101101

102102
# DIPlib-specific zlib
103-
if(TARGET zlibstatic)
104-
target_link_libraries(libics PRIVATE zlibstatic)
103+
if(TARGET ZLIB::ZLIB)
104+
target_link_libraries(libics PRIVATE ZLIB::ZLIB)
105105
target_compile_definitions(libics PUBLIC -DICS_ZLIB)
106106
endif()
107107

dependencies/libtiff/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ set(MDI_SUPPORT TRUE)
378378

379379
# ZLIB
380380
set(ZLIB_SUPPORT FALSE)
381-
if(TARGET zlibstatic)
381+
if(TARGET ZLIB::ZLIB)
382382
set(ZLIB_SUPPORT TRUE)
383383
endif()
384384
set(ZIP_SUPPORT ${ZLIB_SUPPORT})
@@ -468,10 +468,10 @@ if(M_LIBRARY)
468468
list(APPEND TIFF_LIBRARY_DEPS ${M_LIBRARY})
469469
endif()
470470
if(ZLIB_SUPPORT)
471-
list(APPEND TIFF_LIBRARY_DEPS zlibstatic)
471+
list(APPEND TIFF_LIBRARY_DEPS ZLIB::ZLIB)
472472
endif()
473473
if(JPEG_SUPPORT)
474-
list(APPEND TIFF_LIBRARY_DEPS jpeg)
474+
list(APPEND TIFF_LIBRARY_DEPS JPEG::JPEG)
475475
endif()
476476
if(JPEG12_LIBRARIES)
477477
list(APPEND TIFF_LIBRARY_DEPS ${JPEG12_LIBRARIES})

pydip/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
set(PYBIND11_PYTHON_VERSION ${PYTHON_VERSION}) # Avoid a warning message
2-
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/pybind11" "${PROJECT_BINARY_DIR}/pybind11" EXCLUDE_FROM_ALL)
2+
if(DIP_BUILD_BUNDLED_DEPENDENCIES)
3+
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/pybind11" "${PROJECT_BINARY_DIR}/pybind11" EXCLUDE_FROM_ALL)
4+
else()
5+
find_package(pybind11 REQUIRED)
6+
endif()
37

48
# Find sources
59
file(GLOB DIP_PYTHON_SRC "${CMAKE_CURRENT_LIST_DIR}/src/*.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/*.h")

src/CMakeLists.txt

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,17 @@ endif()
6868
# that uses DIPlib, hence we define a variable here that removes all of DocTest from the DIPlib sources.
6969
set(DIP_ENABLE_DOCTEST ON CACHE BOOL "Turn off to not include doctest.h in the library headers")
7070
if(DIP_ENABLE_DOCTEST)
71-
target_include_directories(DIP PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/doctest")
71+
if(DIP_BUILD_BUNDLED_DEPENDENCIES)
72+
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/dependencies/doctest")
73+
add_library(doctest INTERFACE)
74+
target_include_directories(doctest INTERFACE "${PROJECT_SOURCE_DIR}/dependencies/doctest")
75+
add_library(doctest::doctest ALIAS doctest)
76+
else()
77+
find_package(doctest REQUIRED)
78+
# upstream doctest wants includes of the form <doctest/doctest.h> but diplib uses just doctest.h
79+
target_include_directories(DIP PRIVATE "$<TARGET_PROPERTY:doctest::doctest,INTERFACE_INCLUDE_DIRECTORIES>/doctest")
80+
endif()
81+
target_link_libraries(DIP PRIVATE doctest::doctest)
7282
target_compile_definitions(DIP PRIVATE
7383
DIP_CONFIG_ENABLE_DOCTEST
7484
DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
@@ -95,39 +105,64 @@ endif()
95105
set(HAS_128_INT ${HAS_128_INT} PARENT_SCOPE)
96106

97107
# Eigen
98-
target_include_directories(DIP PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/eigen3")
108+
if(DIP_BUILD_BUNDLED_DEPENDENCIES)
109+
target_include_directories(DIP PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/eigen3")
110+
else()
111+
find_package(Eigen3 REQUIRED)
112+
target_include_directories(DIP PRIVATE ${EIGEN3_INCLUDE_DIR})
113+
endif()
99114
target_compile_definitions(DIP PRIVATE
100115
EIGEN_MPL2_ONLY # This makes sure we only use parts of the Eigen library that use the MPL2 license or more permissive ones.
101116
EIGEN_DONT_PARALLELIZE) # This to prevent Eigen algorithms trying to run in parallel -- we parallelize at a larger scale.
102117

103118
# zlib (for use in libics and libtiff)
104119
set(DIP_ENABLE_ZLIB ON CACHE BOOL "Enable zlib compression in ICS and TIFF (deflate)")
105120
if(DIP_ENABLE_ZLIB)
106-
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/zlib" "${PROJECT_BINARY_DIR}/zlib" EXCLUDE_FROM_ALL)
121+
if(DIP_BUILD_BUNDLED_DEPENDENCIES)
122+
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/zlib" "${PROJECT_BINARY_DIR}/zlib" EXCLUDE_FROM_ALL)
123+
add_library(ZLIB::ZLIB ALIAS zlibstatic)
124+
else()
125+
find_package(ZLIB REQUIRED)
126+
endif()
107127
endif()
108128

109129
# libjpeg (for use in libtiff)
110130
set(DIP_ENABLE_JPEG ON CACHE BOOL "Enable JPEG file support and compression in TIFF")
111131
if(DIP_ENABLE_JPEG)
112-
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libjpeg" "${PROJECT_BINARY_DIR}/libjpeg" EXCLUDE_FROM_ALL)
113-
target_link_libraries(DIP PRIVATE jpeg)
132+
if(DIP_BUILD_BUNDLED_DEPENDENCIES)
133+
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libjpeg" "${PROJECT_BINARY_DIR}/libjpeg" EXCLUDE_FROM_ALL)
134+
add_library(JPEG::JPEG ALIAS jpeg)
135+
else()
136+
find_package(JPEG REQUIRED)
137+
endif()
138+
target_link_libraries(DIP PRIVATE JPEG::JPEG)
114139
target_compile_definitions(DIP PRIVATE DIP_CONFIG_HAS_JPEG)
115140
endif()
116141

117142
# libics
118143
set(DIP_ENABLE_ICS ON CACHE BOOL "Enable ICS file support")
119144
if(DIP_ENABLE_ICS)
120-
set(LIBICS_INCLUDE_CPP Off) # TODO: we should start using the C++ interface
121-
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libics" "${PROJECT_BINARY_DIR}/libics" EXCLUDE_FROM_ALL)
122-
target_link_libraries(DIP PRIVATE libics)
145+
if(DIP_BUILD_BUNDLED_DEPENDENCIES)
146+
set(LIBICS_INCLUDE_CPP Off) # TODO: we should start using the C++ interface
147+
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libics" "${PROJECT_BINARY_DIR}/libics" EXCLUDE_FROM_ALL)
148+
add_library(ICS::ICS ALIAS libics)
149+
else()
150+
find_package(ICS REQUIRED)
151+
endif()
152+
target_link_libraries(DIP PRIVATE ICS::ICS)
123153
target_compile_definitions(DIP PRIVATE DIP_CONFIG_HAS_ICS)
124154
endif()
125155

126156
# libtiff
127157
set(DIP_ENABLE_TIFF ON CACHE BOOL "Enable TIFF file support")
128158
if(DIP_ENABLE_TIFF)
129-
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libtiff" "${PROJECT_BINARY_DIR}/libtiff" EXCLUDE_FROM_ALL)
130-
target_link_libraries(DIP PRIVATE tiff)
159+
if(DIP_BUILD_BUNDLED_DEPENDENCIES)
160+
add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libtiff" "${PROJECT_BINARY_DIR}/libtiff" EXCLUDE_FROM_ALL)
161+
add_library(TIFF::TIFF ALIAS tiff)
162+
else()
163+
find_package(TIFF REQUIRED)
164+
endif()
165+
target_link_libraries(DIP PRIVATE TIFF::TIFF)
131166
target_compile_definitions(DIP PRIVATE DIP_CONFIG_HAS_TIFF)
132167
endif()
133168

@@ -157,8 +192,7 @@ install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/" DESTINATION include
157192
# DIPlib unit tests
158193
if(DIP_ENABLE_DOCTEST)
159194
add_executable(unit_tests EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/library/unit_tests.cpp")
160-
target_include_directories(unit_tests PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/doctest")
161-
target_link_libraries(unit_tests PRIVATE DIP)
195+
target_link_libraries(unit_tests PRIVATE DIP doctest::doctest)
162196
target_compile_definitions(unit_tests PRIVATE
163197
DIP_IMPLEMENT_UNIT_TESTS
164198
DIP_CONFIG_ENABLE_DOCTEST
@@ -171,7 +205,7 @@ if(DIP_ENABLE_DOCTEST)
171205
set_target_properties(unit_tests PROPERTIES INSTALL_RPATH "$ORIGIN")
172206
endif()
173207
else()
174-
include("${PROJECT_SOURCE_DIR}/dependencies/doctest/doctest_force_link_static_lib_in_target.cmake")
208+
include(doctest_force_link_static_lib_in_target.cmake)
175209
doctest_force_link_static_lib_in_target(unit_tests DIP) # This pulls in all object files from the static DIP library
176210
endif()
177211
add_custom_target(check COMMAND unit_tests)

tools/FindEigen3.cmake

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# - Try to find Eigen3 lib
2+
#
3+
# This module supports requiring a minimum version, e.g. you can do
4+
# find_package(Eigen3 3.1.2)
5+
# to require version 3.1.2 or newer of Eigen3.
6+
#
7+
# Once done this will define
8+
#
9+
# EIGEN3_FOUND - system has eigen lib with correct version
10+
# EIGEN3_INCLUDE_DIR - the eigen include directory
11+
# EIGEN3_VERSION - eigen version
12+
13+
# Copyright (c) 2006, 2007 Montel Laurent, <[email protected]>
14+
# Copyright (c) 2008, 2009 Gael Guennebaud, <[email protected]>
15+
# Copyright (c) 2009 Benoit Jacob <[email protected]>
16+
# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
17+
18+
if(NOT Eigen3_FIND_VERSION)
19+
if(NOT Eigen3_FIND_VERSION_MAJOR)
20+
set(Eigen3_FIND_VERSION_MAJOR 2)
21+
endif(NOT Eigen3_FIND_VERSION_MAJOR)
22+
if(NOT Eigen3_FIND_VERSION_MINOR)
23+
set(Eigen3_FIND_VERSION_MINOR 91)
24+
endif(NOT Eigen3_FIND_VERSION_MINOR)
25+
if(NOT Eigen3_FIND_VERSION_PATCH)
26+
set(Eigen3_FIND_VERSION_PATCH 0)
27+
endif(NOT Eigen3_FIND_VERSION_PATCH)
28+
29+
set(Eigen3_FIND_VERSION
30+
"${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
31+
endif(NOT Eigen3_FIND_VERSION)
32+
33+
macro(_eigen3_check_version)
34+
file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
35+
36+
string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match
37+
"${_eigen3_version_header}")
38+
set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
39+
string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match
40+
"${_eigen3_version_header}")
41+
set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
42+
string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match
43+
"${_eigen3_version_header}")
44+
set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
45+
46+
set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
47+
if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
48+
set(EIGEN3_VERSION_OK FALSE)
49+
else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
50+
set(EIGEN3_VERSION_OK TRUE)
51+
endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
52+
53+
if(NOT EIGEN3_VERSION_OK)
54+
55+
message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
56+
"but at least version ${Eigen3_FIND_VERSION} is required")
57+
endif(NOT EIGEN3_VERSION_OK)
58+
endmacro(_eigen3_check_version)
59+
60+
if(EIGEN3_INCLUDE_DIR)
61+
62+
# in cache already
63+
_eigen3_check_version()
64+
set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
65+
66+
else(EIGEN3_INCLUDE_DIR)
67+
68+
find_path(
69+
EIGEN3_INCLUDE_DIR
70+
NAMES signature_of_eigen3_matrix_library
71+
PATHS ${CMAKE_INSTALL_PREFIX}/include ${KDE4_INCLUDE_DIR}
72+
PATH_SUFFIXES eigen3 eigen)
73+
74+
if(EIGEN3_INCLUDE_DIR)
75+
_eigen3_check_version()
76+
endif(EIGEN3_INCLUDE_DIR)
77+
78+
include(FindPackageHandleStandardArgs)
79+
find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
80+
81+
mark_as_advanced(EIGEN3_INCLUDE_DIR)
82+
83+
endif(EIGEN3_INCLUDE_DIR)

tools/FindICS.cmake

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Copyright (C) 2021 LuaDist.
2+
# Created by Peter Kapec <[email protected]>
3+
# Modified by Cris Luengo to look for GLFW instead of FreeGLUT, and set a target.
4+
# Modified by Milian Wolff to look for ICS instead of GLFW, and set a target.
5+
# Redistribution and use of this file is allowed according to the terms of the MIT license.
6+
# For details see the COPYRIGHT file distributed with LuaDist.
7+
# Note:
8+
# Searching headers and libraries is very simple and is NOT as powerful as scripts
9+
# distributed with CMake, because LuaDist defines directories to search for.
10+
# Everyone is encouraged to contact the author with improvements. Maybe this file
11+
# becomes part of CMake distribution sometime.
12+
13+
# - Find ICS
14+
# Find the native ICS headers and libraries.
15+
#
16+
# ICS_INCLUDE_DIRS - where to find libics.h
17+
# ICS_LIBRARIES - List of libraries when using ICS.
18+
# ICS_FOUND - True if ICS found.
19+
# ICS::ICS - Target to link to (automatically sets include directories and linked libraries)
20+
21+
# Look for the header file.
22+
find_path(ICS_INCLUDE_DIR NAMES libics.h)
23+
24+
# Look for the library.
25+
find_library(ICS_LIBRARY NAMES ics)
26+
27+
# Handle the QUIETLY and REQUIRED arguments and set ICS_FOUND to TRUE if all listed variables are TRUE.
28+
include(FindPackageHandleStandardArgs)
29+
find_package_handle_standard_args(ICS DEFAULT_MSG ICS_LIBRARY ICS_INCLUDE_DIR)
30+
31+
# Copy the results to the output variables.
32+
if(ICS_FOUND)
33+
set(ICS_LIBRARIES ${ICS_LIBRARY})
34+
set(ICS_INCLUDE_DIRS ${ICS_INCLUDE_DIR})
35+
if (NOT TARGET ICS::ICS)
36+
add_library(ICS::ICS UNKNOWN IMPORTED)
37+
set_target_properties(ICS::ICS PROPERTIES
38+
INTERFACE_INCLUDE_DIRECTORIES "${ICS_INCLUDE_DIRS}"
39+
IMPORTED_LOCATION "${ICS_LIBRARY}")
40+
endif()
41+
message(STATUS "ICS found: ${ICS_LIBRARY} -- ${ICS_INCLUDE_DIR}")
42+
else()
43+
set(ICS_LIBRARIES)
44+
set(ICS_INCLUDE_DIRS)
45+
message(STATUS "ICS not found")
46+
endif()
47+
48+
mark_as_advanced(ICS_INCLUDE_DIRS ICS_LIBRARIES)

0 commit comments

Comments
 (0)