Skip to content

Commit 1baaaeb

Browse files
committed
cmake: rework 3rd-party library detection and reporting
By using the 'FeatureSummary' module we can easily produce a nice summary of features and dependend libraries/packages at the end of each CMake run. However, to tell CMake that certain libraries/packages which have not been found on the system will be downloaded and prepared automatically on the first call to 'make', a dirty hack on CMakes (not documented) internal handling of the 'find_package' command is required. I hope somebody else or the future me can actually understand what I was doing right now ...
1 parent c1d8fa6 commit 1baaaeb

File tree

1 file changed

+97
-35
lines changed

1 file changed

+97
-35
lines changed

3rdparty/CMakeLists.txt

Lines changed: 97 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ if(${compiler_version_available} AND ${CMAKE_CXX_COMPILER_ID} MATCHES Clang)
1313
set(Boost_COMPILER "-clang${CMAKE_CXX_COMPILER_VERSION_MAJOR}${CMAKE_CXX_COMPILER_VERSION_MINOR}")
1414
endif()
1515

16-
if(${CMAKE_VERBOSE_MAKEFILE})
17-
set(Boost_DEBUG ON)
18-
set(Boost_DETAILED_FAILURE_MSG ON)
19-
endif()
20-
2116
find_package(Boost COMPONENTS program_options REQUIRED)
17+
set_package_properties(Boost
18+
PROPERTIES
19+
DESCRIPTION "C++ libraries"
20+
URL "http://boost.org/"
21+
TYPE REQUIRED
22+
PURPOSE "command line parameter parsing"
23+
)
2224
message(STATUS "Boost include path: ${Boost_INCLUDE_DIRS}")
2325
message(STATUS "Boost library path: ${Boost_LIBRARY_DIRS}")
2426
list(APPEND 3rdparty_INCLUDES ${Boost_INCLUDE_DIRS})
@@ -29,6 +31,13 @@ message(STATUS "----------------------------------------------------------------
2931
message(STATUS "Eigen3")
3032

3133
find_package(Eigen3)
34+
set_package_properties(Eigen3
35+
PROPERTIES
36+
DESCRIPTION "linear algebra library"
37+
URL "http://eigen.tuxfamily.org/"
38+
TYPE REQUIRED
39+
PURPOSE "matrix and vector types and arithmetics"
40+
)
3241

3342
if(NOT EIGEN3_FOUND)
3443
set(EIGEN3_SOURCE_URL "http://bitbucket.org/eigen/eigen/get/3.2.2.tar.bz2")
@@ -57,50 +66,92 @@ if(NOT EIGEN3_FOUND)
5766
)
5867

5968
# Specify include dir
60-
set(Eigen3_INCLUDE_PATH "${Eigen3_SOURCE_DIR}")
69+
set(Eigen3_INCLUDE_PATH "${Eigen3_SOURCE_DIR}" CACHE PATH "" FORCE)
70+
71+
mark_as_advanced(Eigen3_INCLUDE_PATH)
72+
set(Eigen3_FOUND TRUE)
73+
set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND "Eigen3")
74+
get_property(packages_not_found GLOBAL PROPERTY PACKAGES_NOT_FOUND)
75+
list(REMOVE_ITEM packages_not_found "Eigen3")
76+
set_property(GLOBAL PROPERTY PACKAGES_NOT_FOUND ${packages_not_found})
77+
unset(packages_not_found)
78+
6179
list(APPEND pfasst_DEPENDEND_TARGETS Eigen3)
6280
endif()
6381

6482
list(APPEND 3rdparty_INCLUDES "${Eigen3_INCLUDE_PATH}")
6583

6684

6785
message(STATUS "--------------------------------------------------------------------------------")
68-
message(STATUS "easyloggingpp")
69-
70-
set(EASYLOGGINGPP_SOURCE_URL "https://github.com/easylogging/easyloggingpp/releases/download/v9.75/easyloggingpp_v9.75.tar.gz")
71-
# message(STATUS "easyloggingpp not found on your system")
72-
message(STATUS " going to download sources")
73-
message(STATUS " download URL: ${EASYLOGGINGPP_SOURCE_URL}")
74-
set(easyloggingpp_SOURCE_DIR "${pfasst_BINARY_DIR}/3rdparty/src/easyloggingpp")
75-
76-
ExternalProject_Add(
77-
easyloggingpp
78-
LIST_SEPARATOR " "
79-
URL ${EASYLOGGINGPP_SOURCE_URL}
80-
URL_MD5 3e37462b30cb6ee49faeed6a94d1bc1e
81-
TIMEOUT 30
82-
UPDATE_COMMAND ""
83-
PATCH_COMMAND ""
84-
CONFIGURE_COMMAND ""
85-
BUILD_COMMAND ""
86-
TEST_COMMAND ""
87-
INSTALL_DIR ""
88-
INSTALL_COMMAND ""
89-
LOG_DOWNLOAD ON
90-
LOG_CONFIGURE OFF
91-
LOG_BUILD OFF
86+
message(STATUS "Easyloggingpp")
87+
88+
set(EASYLOGGINGPP_SOURCE_URL
89+
"https://github.com/easylogging/easyloggingpp/releases/download/v9.75/easyloggingpp_v9.75.tar.gz"
9290
)
9391

94-
# Specify include dir
95-
set(easyloggingpp_INCLUDE_PATH "${easyloggingpp_SOURCE_DIR}")
96-
list(APPEND 3rdparty_INCLUDES "${easyloggingpp_INCLUDE_PATH}")
92+
find_package(Easyloggingpp)
93+
set_package_properties(Easyloggingpp
94+
PROPERTIES
95+
DESCRIPTION "Easylogging++ logging library"
96+
URL "https://github.com/easylogging/easyloggingpp"
97+
TYPE REQUIRED
98+
PURPOSE "provides functionality for versatile logging"
99+
)
100+
101+
if(NOT Easyloggingpp_FOUND)
102+
unset(Easyloggingpp_INCLUDE_PATH)
103+
unset(Easyloggingpp_INCLUDE_PATH CACHE)
104+
unset(Easyloggingpp_FOUND)
105+
message(STATUS "Easyloggingpp not found on your system")
106+
message(STATUS " going to download sources")
107+
message(STATUS " download URL: ${EASYLOGGINGPP_SOURCE_URL}")
108+
set(Easyloggingpp_SOURCE_DIR "${pfasst_BINARY_DIR}/3rdparty/src/easyloggingpp")
109+
ExternalProject_Add(
110+
Easyloggingpp
111+
LIST_SEPARATOR " "
112+
URL ${EASYLOGGINGPP_SOURCE_URL}
113+
URL_MD5 3e37462b30cb6ee49faeed6a94d1bc1e
114+
TIMEOUT 30
115+
UPDATE_COMMAND ""
116+
PATCH_COMMAND ""
117+
CONFIGURE_COMMAND ""
118+
BUILD_COMMAND ""
119+
TEST_COMMAND ""
120+
INSTALL_DIR ""
121+
INSTALL_COMMAND ""
122+
LOG_DOWNLOAD ON
123+
LOG_CONFIGURE OFF
124+
LOG_BUILD OFF
125+
)
126+
127+
# Specify include dir and hack on CMake internals to overwrite internal not-found flag
128+
set(Easyloggingpp_INCLUDE_PATH "${Easyloggingpp_SOURCE_DIR}" CACHE PATH "" FORCE)
129+
mark_as_advanced(Easyloggingpp_INCLUDE_PATH)
130+
set(Easyloggingpp_FOUND TRUE)
131+
set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND "Easyloggingpp")
132+
get_property(packages_not_found GLOBAL PROPERTY PACKAGES_NOT_FOUND)
133+
list(REMOVE_ITEM packages_not_found "Easyloggingpp")
134+
set_property(GLOBAL PROPERTY PACKAGES_NOT_FOUND ${packages_not_found})
135+
unset(packages_not_found)
136+
137+
list(APPEND pfasst_DEPENDEND_TARGETS Easyloggingpp)
138+
endif()
139+
140+
list(APPEND 3rdparty_INCLUDES "${Easyloggingpp_INCLUDE_PATH}")
97141

98142

99143
if(pfasst_BUILD_EXAMPLES)
100144
message(STATUS "--------------------------------------------------------------------------------")
101145
message(STATUS "FFTW3")
102146

103147
find_package(FFTW)
148+
set_package_properties(FFTW
149+
PROPERTIES
150+
DESCRIPTION "FFTW3"
151+
URL "http://fftw.org/"
152+
TYPE REQUIRED
153+
PURPOSE "fast Fourier transformation"
154+
)
104155

105156
if(NOT FFTW_FOUND)
106157
set(FFTW3_SOURCE_URL "http://fftw.org/fftw-3.3.4.tar.gz")
@@ -129,8 +180,19 @@ if(pfasst_BUILD_EXAMPLES)
129180
LOG_BUILD ON
130181
)
131182
# Specify include dir
132-
set(FFTW_INCLUDE_PATH ${fftw3_INSTALL_DIR}/include PARENT_SCOPE)
133-
set(FFTW_LIBRARIES ${fftw3_INSTALL_DIR}/lib/libfftw3.a PARENT_SCOPE)
183+
set(FFTW_INCLUDE_PATH ${fftw3_INSTALL_DIR}/include CACHE PATH "" FORCE PARENT_SCOPE)
184+
set(FFTW_LIBRARIES ${fftw3_INSTALL_DIR}/lib/libfftw3.a CACHE FILEPATH "" FORCE PARENT_SCOPE)
185+
186+
mark_as_advanced(FFTW_INCLUDE_PATH FFTW_LIBRARIES)
187+
set(FFTW_FOUND TRUE)
188+
set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND "FFTW")
189+
get_property(packages_not_found GLOBAL PROPERTY PACKAGES_NOT_FOUND)
190+
list(REMOVE_ITEM packages_not_found "FFTW")
191+
set_property(GLOBAL PROPERTY PACKAGES_NOT_FOUND ${packages_not_found})
192+
unset(packages_not_found)
193+
194+
list(APPEND pfasst_DEPENDEND_LIBS FFTW)
195+
134196
else()
135197
set(FFTW_INCLUDE_PATH ${FFTW_INCLUDE_PATH} PARENT_SCOPE)
136198
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} PARENT_SCOPE)

0 commit comments

Comments
 (0)