Skip to content

Commit 293ce5c

Browse files
committed
Add option to use external dependencies instead of fetchcontent
This commit adds the ability to search for already installed software on the system instead of downloading the required libraries using fetchcontent. This allows package managers to select dependencies that are more compatible with the system than the one targeted by the ArrayFire build system. One disadvantage of this approach is the increase build failures and version incompatibilities
1 parent d3c0290 commit 293ce5c

File tree

14 files changed

+221
-148
lines changed

14 files changed

+221
-148
lines changed

CMakeLists.txt

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ set_policies(
3939
CMP0079)
4040
arrayfire_set_cmake_default_variables()
4141

42+
option(AF_WITH_EXTERNAL_PACKAGES_ONLY "Build ArrayFire with External packages only" OFF)
43+
if(AF_WITH_EXTERNAL_PACKAGES_ONLY)
44+
set(AF_REQUIRED REQUIRED)
45+
endif()
46+
4247
#Set Intel OpenMP as default MKL thread layer
4348
set(MKL_THREAD_LAYER "Intel OpenMP" CACHE STRING "The thread layer to choose for MKL")
4449

@@ -54,7 +59,15 @@ find_package(CBLAS)
5459
find_package(LAPACKE)
5560
find_package(Doxygen)
5661
find_package(MKL)
57-
find_package(spdlog 1.8.5 QUIET)
62+
find_package(spdlog QUIET ${AF_REQUIRED})
63+
find_package(fmt QUIET ${AF_REQUIRED})
64+
find_package(span-lite QUIET)
65+
find_package(GTest)
66+
find_package(CLBlast QUIET)
67+
find_package(Boost 1.70 ${AF_REQUIRED})
68+
69+
# CLFFT used in ArrayFire requires a specific fork
70+
#find_package(clFFT QUIET)
5871

5972
include(boost_package)
6073
include(config_ccache)
@@ -75,6 +88,8 @@ option(AF_WITH_STACKTRACE "Add stacktraces to the error messages." ON)
7588
option(AF_CACHE_KERNELS_TO_DISK "Enable caching kernels to disk" ON)
7689
option(AF_WITH_STATIC_MKL "Link against static Intel MKL libraries" OFF)
7790
option(AF_WITH_STATIC_CUDA_NUMERIC_LIBS "Link libafcuda with static numeric libraries(cublas, cufft, etc.)" OFF)
91+
option(AF_WITH_SPDLOG_HEADER_ONLY "Build ArrayFire with header only version of spdlog" OFF)
92+
option(AF_WITH_FMT_HEADER_ONLY "Build ArrayFire with header only version of fmt" OFF)
7893

7994
if(AF_WITH_STATIC_CUDA_NUMERIC_LIBS)
8095
option(AF_WITH_PRUNE_STATIC_CUDA_NUMERIC_LIBS "Prune CUDA static libraries to reduce binary size.(WARNING: May break some libs on older CUDA toolkits for some compute arch)" OFF)
@@ -173,7 +188,7 @@ mark_as_advanced(
173188
FG_BUILD_OFFLINE
174189
)
175190

176-
if(MKL_FOUND)
191+
if(AF_COMPUTE_LIBRARY STREQUAL "Intel-MKL")
177192
set(BLA_VENDOR "Intel10_64lp")
178193
if(MKL_THREAD_LAYER STREQUAL "Sequential")
179194
set(BLA_VENDOR "${BLA_VENDOR}_seq")
@@ -209,22 +224,38 @@ endif()
209224
#forge is included in ALL target if AF_BUILD_FORGE is ON
210225
#otherwise, forge is not built at all
211226
include(AFconfigure_forge_dep)
212-
add_library(af_spdlog INTERFACE)
213-
set_target_properties(af_spdlog
214-
PROPERTIES
215-
INTERFACE_COMPILE_DEFINITIONS FMT_HEADER_ONLY)
216-
217-
if(TARGET spdlog::spdlog_header_only)
218-
target_include_directories(af_spdlog
219-
SYSTEM INTERFACE
220-
$<TARGET_PROPERTY:spdlog::spdlog_header_only,INTERFACE_INCLUDE_DIRECTORIES>
221-
)
227+
228+
if(TARGET fmt::fmt AND AF_WITH_FMT_HEADER_ONLY)
229+
set_target_properties(fmt::fmt
230+
PROPERTIES
231+
INTERFACE_COMPILE_DEFINITIONS "FMT_HEADER_ONLY=1")
232+
endif()
233+
234+
if(TARGET spdlog::spdlog OR AF_WITH_EXTERNAL_PACKAGES_ONLY)
235+
if(AF_WITH_SPDLOG_HEADER_ONLY)
236+
add_library(af_spdlog ALIAS spdlog::spdlog_header_only)
237+
else()
238+
add_library(af_spdlog ALIAS spdlog::spdlog)
239+
endif()
222240
else()
241+
add_library(af_spdlog INTERFACE)
223242
af_dep_check_and_populate(${spdlog_prefix}
224243
URI https://github.com/gabime/spdlog.git
225-
REF v1.8.5
244+
REF v1.9.2
226245
)
246+
add_subdirectory(${${spdlog_prefix}_SOURCE_DIR} ${${spdlog_prefix}_BINARY_DIR} EXCLUDE_FROM_ALL)
247+
227248
target_include_directories(af_spdlog INTERFACE "${${spdlog_prefix}_SOURCE_DIR}/include")
249+
if(TARGET fmt::fmt)
250+
set_target_properties(af_spdlog
251+
PROPERTIES
252+
INTERFACE_COMPILE_DEFINITIONS "SPDLOG_FMT_EXTERNAL")
253+
endif()
254+
if(AF_WITH_SPDLOG_HEADER_ONLY)
255+
set_target_properties(af_spdlog
256+
PROPERTIES
257+
INTERFACE_COMPILE_DEFINITIONS "$<TARGET_PROPERTY:af_spdlog,INTERFACE_COMPILE_DEFINITIONS>;SPDLOG_HEADER_ONLY")
258+
endif()
228259
endif()
229260

230261
if(NOT TARGET glad::glad)
@@ -237,15 +268,17 @@ if(NOT TARGET glad::glad)
237268
add_library(af_glad STATIC $<TARGET_OBJECTS:af_glad_obj_lib>)
238269
target_link_libraries(af_glad PUBLIC ${CMAKE_DL_LIBS})
239270
target_include_directories(af_glad
240-
PUBLIC
241-
$<BUILD_INTERFACE:$<TARGET_PROPERTY:af_glad_obj_lib,INTERFACE_INCLUDE_DIRECTORIES>>
242-
)
271+
SYSTEM PUBLIC
272+
$<BUILD_INTERFACE:$<TARGET_PROPERTY:af_glad_obj_lib,INTERFACE_INCLUDE_DIRECTORIES>>)
243273
endif()
244274

245-
af_dep_check_and_populate(span-lite
246-
URI https://github.com/martinmoene/span-lite
247-
REF "ccf2351"
248-
)
275+
if(NOT TARGET nonstd::span-lite)
276+
af_dep_check_and_populate(span-lite
277+
URI https://github.com/martinmoene/span-lite
278+
REF "ccf2351"
279+
)
280+
add_subdirectory(${span-lite_SOURCE_DIR} EXCLUDE_FROM_ALL)
281+
endif()
249282

250283
af_dep_check_and_populate(${assets_prefix}
251284
URI https://github.com/arrayfire/assets.git
@@ -271,6 +304,9 @@ if(CMAKE_CROSSCOMPILING)
271304
else()
272305
add_executable(bin2cpp ${ArrayFire_SOURCE_DIR}/CMakeModules/bin2cpp.cpp
273306
${ArrayFire_SOURCE_DIR}/src/backend/common/util.cpp)
307+
308+
# NOSPDLOG is used to remove the spdlog dependency from bin2cpp
309+
target_compile_definitions(bin2cpp PRIVATE NOSPDLOG)
274310
if(WIN32)
275311
target_compile_definitions(bin2cpp PRIVATE OS_WIN)
276312
elseif(APPLE)
@@ -282,11 +318,6 @@ else()
282318
${ArrayFire_SOURCE_DIR}/include
283319
${ArrayFire_BINARY_DIR}/include
284320
${ArrayFire_SOURCE_DIR}/src/backend)
285-
if(TARGET spdlog::spdlog_header_only)
286-
target_link_libraries(bin2cpp PRIVATE spdlog::spdlog_header_only)
287-
else()
288-
target_link_libraries(bin2cpp PRIVATE af_spdlog)
289-
endif()
290321
export(TARGETS bin2cpp FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake)
291322
endif()
292323

@@ -298,7 +329,6 @@ if(NOT LAPACK_FOUND)
298329
unset(LAPACK_LIB CACHE)
299330
unset(LAPACKE_INCLUDES CACHE)
300331
unset(LAPACKE_ROOT_DIR CACHE)
301-
find_package(LAPACK)
302332
endif()
303333
endif()
304334

CMakeModules/bin2cpp.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
#define STRTOK_CALL(...) strtok_r(__VA_ARGS__)
1515
#endif
1616

17-
#include <assert.h>
18-
#include <common/util.hpp>
1917
#include <algorithm>
18+
#include <cassert>
2019
#include <cstdlib>
2120
#include <cstring>
2221
#include <fstream>
@@ -29,6 +28,8 @@
2928
#include <utility>
3029
#include <vector>
3130

31+
#include <common/util.hpp>
32+
3233
using namespace std;
3334
using std::cout;
3435
typedef map<string, string> opt_t;

CMakeModules/boost_package.cmake

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
# The complete license agreement can be obtained at:
66
# http://arrayfire.com/licenses/BSD-3-Clause
77

8-
find_package(Boost 1.66 REQUIRED)
9-
108
set(Boost_MIN_VER 107000)
119
set(Boost_MIN_VER_STR "1.70")
1210

@@ -16,7 +14,8 @@ if(NOT
1614
(Boost_VERSION_STRING VERSION_GREATER Boost_MIN_VER_STR OR
1715
Boost_VERSION_STRING VERSION_EQUAL Boost_MIN_VER_STR) OR
1816
(Boost_VERSION_MACRO VERSION_GREATER Boost_MIN_VER OR
19-
Boost_VERSION_MACRO VERSION_EQUAL Boost_MIN_VER)))
17+
Boost_VERSION_MACRO VERSION_EQUAL Boost_MIN_VER))
18+
AND NOT AF_WITH_EXTERNAL_PACKAGES_ONLY)
2019
set(VER 1.70.0)
2120
message(WARNING
2221
"WARN: Found Boost v${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}."

CMakeModules/build_CLBlast.cmake

Lines changed: 75 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -5,76 +5,89 @@
55
# The complete license agreement can be obtained at:
66
# http://arrayfire.com/licenses/BSD-3-Clause
77

8-
af_dep_check_and_populate(${clblast_prefix}
9-
URI https://github.com/cnugteren/CLBlast.git
10-
REF 4500a03440e2cc54998c0edab366babf5e504d67
11-
)
8+
if(TARGET clblast OR AF_WITH_EXTERNAL_PACKAGES_ONLY)
9+
if(TARGET clblast)
10+
# CLBlast has a broken imported link interface where it lists
11+
# the full path to the OpenCL library. OpenCL is imported by
12+
# another package so we dont need this property to link against
13+
# CLBlast.
14+
set_target_properties(clblast PROPERTIES
15+
IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "")
16+
else()
17+
message(ERROR "CLBlast now found")
18+
endif()
19+
else()
20+
af_dep_check_and_populate(${clblast_prefix}
21+
URI https://github.com/cnugteren/CLBlast.git
22+
REF 4500a03440e2cc54998c0edab366babf5e504d67
23+
)
1224

13-
include(ExternalProject)
14-
find_program(GIT git)
25+
include(ExternalProject)
26+
find_program(GIT git)
1527

16-
set(prefix ${PROJECT_BINARY_DIR}/third_party/CLBlast)
17-
set(CLBlast_libname ${CMAKE_STATIC_LIBRARY_PREFIX}clblast${CMAKE_STATIC_LIBRARY_SUFFIX})
18-
set(CLBlast_location ${${clblast_prefix}_BINARY_DIR}/pkg/lib/${CLBlast_libname})
28+
set(prefix ${PROJECT_BINARY_DIR}/third_party/CLBlast)
29+
set(CLBlast_libname ${CMAKE_STATIC_LIBRARY_PREFIX}clblast${CMAKE_STATIC_LIBRARY_SUFFIX})
30+
set(CLBlast_location ${${clblast_prefix}_BINARY_DIR}/pkg/lib/${CLBlast_libname})
1931

20-
set(extproj_gen_opts "-G${CMAKE_GENERATOR}")
21-
if(WIN32 AND CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_GENERATOR MATCHES "Ninja")
22-
list(APPEND extproj_gen_opts "-A${CMAKE_GENERATOR_PLATFORM}")
23-
if(CMAKE_GENERATOR_TOOLSET)
24-
list(APPEND extproj_gen_opts "-T${CMAKE_GENERATOR_TOOLSET}")
32+
set(extproj_gen_opts "-G${CMAKE_GENERATOR}")
33+
if(WIN32 AND CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_GENERATOR MATCHES "Ninja")
34+
list(APPEND extproj_gen_opts "-A${CMAKE_GENERATOR_PLATFORM}")
35+
if(CMAKE_GENERATOR_TOOLSET)
36+
list(APPEND extproj_gen_opts "-T${CMAKE_GENERATOR_TOOLSET}")
37+
endif()
38+
endif()
39+
if(VCPKG_TARGET_TRIPLET)
40+
list(APPEND extproj_gen_opts "-DOPENCL_ROOT:PATH=${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}")
2541
endif()
26-
endif()
27-
if(VCPKG_TARGET_TRIPLET)
28-
list(APPEND extproj_gen_opts "-DOPENCL_ROOT:PATH=${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}")
29-
endif()
3042

31-
set(extproj_build_type_option "")
32-
if(NOT isMultiConfig)
33-
if("${CMAKE_BUILD_TYPE}" MATCHES "Release|RelWithDebInfo")
34-
set(extproj_build_type "Release")
35-
else()
36-
set(extproj_build_type ${CMAKE_BUILD_TYPE})
43+
set(extproj_build_type_option "")
44+
if(NOT isMultiConfig)
45+
if("${CMAKE_BUILD_TYPE}" MATCHES "Release|RelWithDebInfo")
46+
set(extproj_build_type "Release")
47+
else()
48+
set(extproj_build_type ${CMAKE_BUILD_TYPE})
49+
endif()
50+
set(extproj_build_type_option "-DCMAKE_BUILD_TYPE:STRING=${extproj_build_type}")
3751
endif()
38-
set(extproj_build_type_option "-DCMAKE_BUILD_TYPE:STRING=${extproj_build_type}")
39-
endif()
4052

41-
ExternalProject_Add(
42-
CLBlast-ext
43-
DOWNLOAD_COMMAND ""
44-
UPDATE_COMMAND ""
45-
PATCH_COMMAND ""
46-
SOURCE_DIR "${${clblast_prefix}_SOURCE_DIR}"
47-
BINARY_DIR "${${clblast_prefix}_BINARY_DIR}"
48-
PREFIX "${prefix}"
49-
INSTALL_DIR "${${clblast_prefix}_BINARY_DIR}/pkg"
50-
BUILD_BYPRODUCTS ${CLBlast_location}
51-
CONFIGURE_COMMAND ${CMAKE_COMMAND} ${extproj_gen_opts}
52-
-Wno-dev <SOURCE_DIR>
53-
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
54-
"-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} -w -fPIC"
55-
-DOVERRIDE_MSVC_FLAGS_TO_MT:BOOL=OFF
56-
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
57-
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} -w -fPIC"
58-
${extproj_build_type_option}
59-
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
60-
-DCMAKE_INSTALL_LIBDIR:PATH=lib
61-
-DBUILD_SHARED_LIBS:BOOL=OFF
62-
-DSAMPLES:BOOL=OFF
63-
-DTUNERS:BOOL=OFF
64-
-DCLIENTS:BOOL=OFF
65-
-DTESTS:BOOL=OFF
66-
-DNETLIB:BOOL=OFF
67-
)
53+
ExternalProject_Add(
54+
CLBlast-ext
55+
DOWNLOAD_COMMAND ""
56+
UPDATE_COMMAND ""
57+
PATCH_COMMAND ""
58+
SOURCE_DIR "${${clblast_prefix}_SOURCE_DIR}"
59+
BINARY_DIR "${${clblast_prefix}_BINARY_DIR}"
60+
PREFIX "${prefix}"
61+
INSTALL_DIR "${${clblast_prefix}_BINARY_DIR}/pkg"
62+
BUILD_BYPRODUCTS ${CLBlast_location}
63+
CONFIGURE_COMMAND ${CMAKE_COMMAND} ${extproj_gen_opts}
64+
-Wno-dev <SOURCE_DIR>
65+
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
66+
"-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} -w -fPIC"
67+
-DOVERRIDE_MSVC_FLAGS_TO_MT:BOOL=OFF
68+
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
69+
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} -w -fPIC"
70+
${extproj_build_type_option}
71+
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
72+
-DCMAKE_INSTALL_LIBDIR:PATH=lib
73+
-DBUILD_SHARED_LIBS:BOOL=OFF
74+
-DSAMPLES:BOOL=OFF
75+
-DTUNERS:BOOL=OFF
76+
-DCLIENTS:BOOL=OFF
77+
-DTESTS:BOOL=OFF
78+
-DNETLIB:BOOL=OFF
79+
)
6880

69-
set(CLBLAST_INCLUDE_DIRS "${${clblast_prefix}_BINARY_DIR}/pkg/include")
70-
set(CLBLAST_LIBRARIES CLBlast)
71-
set(CLBLAST_FOUND ON)
81+
set(CLBLAST_INCLUDE_DIRS "${${clblast_prefix}_BINARY_DIR}/pkg/include")
82+
set(CLBLAST_LIBRARIES CLBlast)
83+
set(CLBLAST_FOUND ON)
7284

73-
make_directory("${CLBLAST_INCLUDE_DIRS}")
85+
make_directory("${CLBLAST_INCLUDE_DIRS}")
7486

75-
add_library(CLBlast UNKNOWN IMPORTED)
76-
set_target_properties(CLBlast PROPERTIES
77-
IMPORTED_LOCATION "${CLBlast_location}"
78-
INTERFACE_INCLUDE_DIRECTORIES "${CLBLAST_INCLUDE_DIRS}")
87+
add_library(clblast UNKNOWN IMPORTED)
88+
set_target_properties(clblast PROPERTIES
89+
IMPORTED_LOCATION "${CLBlast_location}"
90+
INTERFACE_INCLUDE_DIRECTORIES "${CLBLAST_INCLUDE_DIRS}")
7991

80-
add_dependencies(CLBlast CLBlast-ext)
92+
add_dependencies(clblast CLBlast-ext)
93+
endif()

CMakeModules/build_cl2hpp.cmake

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@
1313

1414
find_package(OpenCL)
1515

16-
af_dep_check_and_populate(${cl2hpp_prefix}
17-
URI https://github.com/KhronosGroup/OpenCL-CLHPP.git
18-
REF v2.0.12
19-
)
20-
2116
if (NOT TARGET OpenCL::cl2hpp OR NOT TARGET cl2hpp)
17+
af_dep_check_and_populate(${cl2hpp_prefix}
18+
URI https://github.com/KhronosGroup/OpenCL-CLHPP.git
19+
REF v2.0.12)
20+
21+
find_path(cl2hpp_var
22+
NAMES CL/cl2.hpp
23+
PATHS ${ArrayFire_BINARY_DIR}/extern/${cl2hpp_prefix}-src/include)
24+
2225
add_library(cl2hpp IMPORTED INTERFACE GLOBAL)
2326
add_library(OpenCL::cl2hpp IMPORTED INTERFACE GLOBAL)
2427

2528
set_target_properties(cl2hpp OpenCL::cl2hpp PROPERTIES
26-
INTERFACE_INCLUDE_DIRECTORIES ${${cl2hpp_prefix}_SOURCE_DIR}/include)
29+
INTERFACE_INCLUDE_DIRECTORIES ${cl2hpp_var})
2730
endif()

examples/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ project(ArrayFire-Examples
1111
VERSION 3.7.0
1212
LANGUAGES CXX)
1313

14-
set(CMAKE_CXX_STANDARD 98)
14+
set(CMAKE_CXX_STANDARD 14)
1515
if(NOT EXISTS "${ArrayFire_SOURCE_DIR}/CMakeLists.txt")
1616
set(ASSETS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
1717
endif()

src/api/unified/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ target_link_libraries(af
107107
${CMAKE_DL_LIBS}
108108
)
109109

110+
if(TARGET fmt::fmt)
111+
target_link_libraries(af
112+
PRIVATE
113+
fmt::fmt
114+
)
115+
endif()
116+
110117
install(TARGETS af
111118
EXPORT ArrayFireUnifiedTargets
112119
COMPONENT unified

0 commit comments

Comments
 (0)