Skip to content

Commit 9738a31

Browse files
author
pradeep
committed
vcpkg manifest file for ease of development
Developers can now invoke cmake as shown below to install dependencies automatically when using vcpkg and cmake. ```cmake cmake .. -DVCPKG_ROOT:PATH=<path to vcpkg repository tool> ``` or ```cmake export VCPKG_ROOT=<path to vcpkg repository tool> cmake .. ``` One may add `-DAF_BUILD_CUDA:BOOL=ON` command line argument to enable CUDA dependency check. Even if not provided, ArrayFire will silently check for CUDA and enable the backend if available. There are couple of caveats though for the following dependencies - cuda - cudnn - intel-mkl As these libraries have complex installation mechanisms, their respective vcpkg dependency is merely a check for user. They have to be installed using respective vendor provided installers. A few important notes regarding using vcpg manifest file: 1. For linux developers, currently full support for only Intel MKL compute backend is availalbe. 2. As x64-linux triplet creates static builds only as of now, forge cannot be part of vcpkg dependency list on non windows platforms. Nevertheless, the user doesn't need to do anything as fetchcontent workflow is the fallback. 3. vcpkg manifest is for development puporses only and isn't intended to be production ready dependency management for arrayfire as there are dependencies that don't get built with vcpkg at all.
1 parent 26604b7 commit 9738a31

11 files changed

Lines changed: 265 additions & 103 deletions

File tree

.github/workflows/docs_build.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
name: Documentation
1414
runs-on: ubuntu-18.04
1515
env:
16-
DOXYGEN_VER: 1.8.18
16+
DOXYGEN_VER: 1.8.18
1717
steps:
1818
- name: Checkout Repository
1919
uses: actions/checkout@master
@@ -36,8 +36,7 @@ jobs:
3636
cmake -DAF_BUILD_CPU:BOOL=OFF -DAF_BUILD_CUDA:BOOL=OFF \
3737
-DAF_BUILD_OPENCL:BOOL=OFF -DAF_BUILD_UNIFIED:BOOL=OFF \
3838
-DAF_BUILD_EXAMPLES:BOOL=OFF -DBUILD_TESTING:BOOL=OFF \
39-
-DDOXYGEN_EXECUTABLE:FILEPATH=${GITHUB_WORKSPACE}/doxygen/bin/doxygen \
40-
..
39+
-DDOXYGEN_EXECUTABLE:FILEPATH=${GITHUB_WORKSPACE}/doxygen/bin/doxygen ..
4140
4241
- name: Build
4342
run: |

.github/workflows/unix_cpu_build.yml

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ jobs:
1919
fail-fast: false
2020
matrix:
2121
blas_backend: [Atlas, MKL, OpenBLAS]
22-
os: [ubuntu-16.04, ubuntu-18.04, macos-latest]
22+
os: [ubuntu-18.04, ubuntu-20.04, macos-latest]
2323
exclude:
24-
- os: ubuntu-16.04
25-
blas_backend: Atlas
2624
- os: macos-latest
2725
blas_backend: Atlas
2826
- os: macos-latest
@@ -64,7 +62,7 @@ jobs:
6462
echo "CMAKE_PROGRAM=cmake" >> $GITHUB_ENV
6563
6664
- name: Install Common Dependencies for Ubuntu
67-
if: matrix.os == 'ubuntu-16.04' || matrix.os == 'ubuntu-18.04'
65+
if: matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-18.04'
6866
run: |
6967
sudo add-apt-repository ppa:mhier/libboost-latest
7068
sudo apt-get -qq update
@@ -75,11 +73,11 @@ jobs:
7573
liblapacke-dev
7674
7775
- name: Install Atlas for Ubuntu
78-
if: matrix.os == 'ubuntu-18.04' && matrix.blas_backend == 'Atlas'
76+
if: matrix.os != 'macos-latest' && matrix.blas_backend == 'Atlas'
7977
run: sudo apt-get install -y libatlas-base-dev
8078

8179
- name: Install MKL for Ubuntu
82-
if: (matrix.os == 'ubuntu-16.04' || matrix.os == 'ubuntu-18.04') && matrix.blas_backend == 'MKL'
80+
if: matrix.os != 'macos-latest' && matrix.blas_backend == 'MKL'
8381
run: |
8482
wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
8583
sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
@@ -88,7 +86,7 @@ jobs:
8886
sudo apt-get install -y intel-mkl-64bit-2020.0-088
8987
9088
- name: Install OpenBLAS for Ubuntu
91-
if: (matrix.os == 'ubuntu-16.04' || matrix.os == 'ubuntu-18.04') && matrix.blas_backend == 'OpenBLAS'
89+
if: matrix.os != 'macos-latest' && matrix.blas_backend == 'OpenBLAS'
9290
run: sudo apt-get install -y libopenblas-dev
9391

9492
- name: CMake Configure
@@ -109,8 +107,7 @@ jobs:
109107
-DAF_BUILD_UNIFIED:BOOL=OFF -DAF_BUILD_EXAMPLES:BOOL=ON \
110108
-DAF_BUILD_FORGE:BOOL=ON \
111109
-DUSE_CPU_MKL:BOOL=$USE_MKL \
112-
-DBUILDNAME:STRING=${buildname} \
113-
..
110+
-DBUILDNAME:STRING=${buildname} ..
114111
echo "CTEST_DASHBOARD=${dashboard}" >> $GITHUB_ENV
115112
116113
- name: Build and Test

.github/workflows/win_cpu_build.yml

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,60 +10,48 @@ name: ci
1010

1111
jobs:
1212
window_build_cpu:
13-
name: CPU (OpenBLAS, windows-latest)
13+
name: CPU (fftw, OpenBLAS, windows-latest)
1414
runs-on: windows-latest
1515
env:
16-
VCPKG_HASH: 0cbc579e1ee21fa4ad0974a9ed926f60c6ed1a4a # FEB 25, 2021 - [rsasynccpp] Add new port (Rstein.AsyncCpp) (#16380)
17-
NINJA_VER: 1.10.2
16+
VCPKG_HASH: 5568f110b509a9fd90711978a7cb76bae75bb092 # vcpkg release tag 2021.05.12 with Forge v1.0.7 update
1817
steps:
1918
- name: Checkout Repository
2019
uses: actions/checkout@master
2120

22-
- name: VCPKG Cache
23-
uses: actions/cache@v1
24-
id: vcpkg-cache
21+
- name: VCPKG Binary Cache
22+
uses: actions/cache@v2
23+
id: vcpkg-bin-cache
2524
with:
26-
path: vcpkg
27-
key: vcpkg-deps-${{ env.VCPKG_HASH }}
28-
29-
- name: Install VCPKG Common Deps
30-
if: steps.vcpkg-cache.outputs.cache-hit != 'true'
31-
run: |
32-
git clone --recursive https://github.com/microsoft/vcpkg
33-
Set-Location -Path .\vcpkg
34-
git reset --hard $env:VCPKG_HASH
35-
.\bootstrap-vcpkg.bat
36-
.\vcpkg.exe install --triplet x64-windows boost fftw3 freeimage freetype glfw3 openblas
37-
Remove-Item .\downloads,.\buildtrees,.\packages -Recurse -Force
38-
39-
- name: Download Ninja
40-
run: |
41-
Invoke-WebRequest -Uri "https://github.com/ninja-build/ninja/releases/download/v$env:NINJA_VER/ninja-win.zip" -OutFile ninja.zip
42-
Expand-Archive -Path ninja.zip -DestinationPath .
25+
path: vcpkg_cache
26+
key: vcpkg_bin_cache_${{ env.VCPKG_HASH }} # vcpkg manifest baseline
4327

4428
- name: CMake Configure
4529
run: |
4630
$cwd = (Get-Item -Path ".\").FullName
31+
Set-Location -Path ${env:VCPKG_INSTALLATION_ROOT}
32+
git pull
33+
.\bootstrap-vcpkg.bat
34+
.\vcpkg.exe install --triplet x64-windows boost-compute boost-functional boost-stacktrace fftw3 forge freeimage freetype glfw3 openblas
35+
Set-Location -Path $cwd
4736
$ref = $env:GITHUB_REF | %{ if ($_ -match "refs/pull/[0-9]+/merge") { $_;} }
4837
$prnum = $ref | %{$_.Split("/")[2]}
4938
$branch = git branch --show-current
5039
$buildname = if($prnum -eq $null) { $branch } else { "PR-$prnum" }
5140
$dashboard = if($prnum -eq $null) { "Continuous" } else { "Experimental" }
5241
$buildname = "$buildname-cpu-openblas"
5342
mkdir build && cd build
43+
New-Item -Path "${cwd}/vcpkg_cache" -ItemType "directory" -Force
44+
$env:VCPKG_DEFAULT_BINARY_CACHE="${cwd}/vcpkg_cache"
5445
cmake .. -G "Visual Studio 16 2019" -A x64 `
55-
-DCMAKE_TOOLCHAIN_FILE:FILEPATH="$env:GITHUB_WORKSPACE\vcpkg\scripts\buildsystems\vcpkg.cmake" `
56-
-DFFTW_INCLUDE_DIR:PATH="$env:GITHUB_WORKSPACE\vcpkg\installed/x64-windows\include" `
57-
-DFFTW_LIBRARY:FILEPATH="$env:GITHUB_WORKSPACE\vcpkg\installed\x64-windows\lib\fftw3.lib" `
58-
-DFFTWF_LIBRARY:FILEPATH="$env:GITHUB_WORKSPACE\vcpkg\installed\x64-windows\lib\fftw3f.lib" `
5946
-DAF_BUILD_CUDA:BOOL=OFF -DAF_BUILD_OPENCL:BOOL=OFF `
6047
-DAF_BUILD_UNIFIED:BOOL=OFF -DAF_BUILD_FORGE:BOOL=ON `
61-
-DBUILDNAME:STRING="$buildname"
48+
-DBUILDNAME:STRING="$buildname" `
49+
-DVCPKG_ROOT:PATH="${env:VCPKG_INSTALLATION_ROOT}" `
50+
-DVCPKG_MANIFEST_MODE:BOOL=OFF
6251
echo "CTEST_DASHBOARD=${dashboard}" >> $env:GITHUB_ENV
6352
6453
- name: Build and Test
6554
run: |
66-
$cwd = (Get-Item -Path ".\").FullName
67-
$Env:PATH += ";$cwd/vcpkg/installed/x64-windows/bin"
68-
Set-Location -Path $cwd/build
55+
Set-Location -Path .\build
56+
$Env:PATH += ";${env:VCPKG_INSTALLATION_ROOT}/installed/x64-windows/bin"
6957
ctest -D Experimental --track ${CTEST_DASHBOARD} -T Test -T Submit -C Release -R cpu -E pinverse -j2

CMakeLists.txt

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
cmake_minimum_required(VERSION 3.5)
99

10+
include(CMakeModules/AF_vcpkg_options.cmake)
11+
1012
project(ArrayFire VERSION 3.9.0 LANGUAGES C CXX)
1113

1214
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
@@ -44,6 +46,7 @@ find_package(CUDA 9.0)
4446
find_package(cuDNN 4.0)
4547
find_package(OpenCL 1.2)
4648
find_package(OpenGL)
49+
find_package(glad CONFIG QUIET)
4750
find_package(FreeImage)
4851
find_package(Threads)
4952
find_package(FFTW)
@@ -127,6 +130,9 @@ mark_as_advanced(
127130
Backtrace_LIBRARY
128131
AF_WITH_STATIC_MKL
129132
GIT
133+
Forge_DIR
134+
glad_DIR
135+
FG_BUILD_OFFLINE
130136
)
131137
mark_as_advanced(CLEAR CUDA_VERSION)
132138

@@ -140,12 +146,25 @@ FetchContent_Declare(
140146
GIT_TAG v1.0.0
141147
)
142148
af_dep_check_and_populate(${spdlog_prefix})
143-
FetchContent_Declare(
144-
${glad_prefix}
145-
GIT_REPOSITORY https://github.com/arrayfire/glad.git
146-
GIT_TAG master
147-
)
148-
af_dep_check_and_populate(${glad_prefix})
149+
150+
151+
if(NOT TARGET glad::glad)
152+
FetchContent_Declare(
153+
${glad_prefix}
154+
GIT_REPOSITORY https://github.com/arrayfire/glad.git
155+
GIT_TAG main
156+
)
157+
af_dep_check_and_populate(${glad_prefix})
158+
add_subdirectory(${${glad_prefix}_SOURCE_DIR} ${${glad_prefix}_BINARY_DIR})
159+
160+
add_library(af_glad STATIC $<TARGET_OBJECTS:af_glad_obj_lib>)
161+
target_link_libraries(af_glad PUBLIC ${CMAKE_DL_LIBS})
162+
target_include_directories(af_glad
163+
PUBLIC
164+
$<BUILD_INTERFACE:$<TARGET_PROPERTY:af_glad_obj_lib,INTERFACE_INCLUDE_DIRECTORIES>>
165+
)
166+
endif()
167+
149168
FetchContent_Declare(
150169
${assets_prefix}
151170
GIT_REPOSITORY https://github.com/arrayfire/assets.git
@@ -202,8 +221,6 @@ if(NOT LAPACK_FOUND)
202221
endif()
203222
endif()
204223

205-
add_subdirectory(${${glad_prefix}_SOURCE_DIR} ${${glad_prefix}_BINARY_DIR})
206-
207224
add_subdirectory(src/backend/common)
208225
add_subdirectory(src/api/c)
209226
add_subdirectory(src/api/cpp)
@@ -437,3 +454,24 @@ conditional_directory(AF_BUILD_EXAMPLES examples)
437454
conditional_directory(AF_BUILD_DOCS docs)
438455

439456
include(CPackConfig)
457+
458+
# VCPKG variables that aren't necessarily important
459+
# for ArrayFire Development. They are marked hidden.
460+
# If VCPKG is not used, marking them is not harmful
461+
mark_as_advanced(
462+
VCPKG_APPLOCAL_DEPS
463+
VCPKG_BOOTSTRAP_OPTIONS
464+
VCPKG_INSTALL_OPTIONS
465+
VCPKG_MANIFEST_DIR
466+
VCPKG_MANIFEST_INSTALL
467+
VCPKG_MANIFEST_MODE
468+
VCPKG_OVERLAY_PORTS
469+
VCPKG_OVERLAY_TRIPLETS
470+
VCPKG_TARGET_TRIPLET
471+
X_VCPKG_APPLOCAL_DEPS_INSTALL
472+
X_VCPKG_APPLOCAL_DEPS_SERIALIZED
473+
Z_VCPKG_BUILTIN_POWERSHELL_PATH
474+
Z_VCPKG_PWSH_PATH
475+
Z_VCPKG_CL
476+
_VCPKG_INSTALLED_DIR
477+
)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Copyright (c) 2021, ArrayFire
2+
# All rights reserved.
3+
#
4+
# This file is distributed under 3-clause BSD license.
5+
# The complete license agreement can be obtained at:
6+
# http://arrayfire.com/licenses/BSD-3-Clause
7+
8+
set(ENV{VCPKG_FEATURE_FLAGS} "versions")
9+
set(ENV{VCPKG_KEEP_ENV_VARS} "MKLROOT")
10+
11+
if(AF_BUILD_CUDA)
12+
list(APPEND VCPKG_MANIFEST_FEATURES "cuda")
13+
endif()
14+
if(AF_BUILD_OPENCL)
15+
list(APPEND VCPKG_MANIFEST_FEATURES "opencl")
16+
endif()
17+
18+
if(DEFINED VCPKG_ROOT AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
19+
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
20+
elseif(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
21+
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
22+
endif()

CMakeModules/AFconfigure_forge_dep.cmake

Lines changed: 66 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,55 +7,75 @@
77

88
set(FG_VERSION_MAJOR 1)
99
set(FG_VERSION_MINOR 0)
10-
set(FG_VERSION_PATCH 5)
11-
set(FG_VERSION "${FG_VERSION_MAJOR}.${FG_VERSION_MINOR}.${FG_VERSION_PATCH}")
12-
set(FG_API_VERSION_CURRENT ${FG_VERSION_MAJOR}${FG_VERSION_MINOR})
10+
set(FG_VERSION_PATCH 7)
1311

14-
FetchContent_Declare(
15-
${forge_prefix}
16-
GIT_REPOSITORY https://github.com/arrayfire/forge.git
17-
GIT_TAG "v${FG_VERSION}"
12+
find_package(Forge
13+
${FG_VERSION_MAJOR}.${FG_VERSION_MINOR}.${FG_VERSION_PATCH}
14+
QUIET
1815
)
19-
af_dep_check_and_populate(${forge_prefix})
2016

21-
if(AF_BUILD_FORGE)
22-
set(ArrayFireInstallPrefix ${CMAKE_INSTALL_PREFIX})
23-
set(ArrayFireBuildType ${CMAKE_BUILD_TYPE})
24-
set(CMAKE_INSTALL_PREFIX ${${forge_prefix}_BINARY_DIR}/extern/forge/package)
25-
set(CMAKE_BUILD_TYPE Release)
26-
set(FG_BUILD_EXAMPLES OFF CACHE BOOL "Used to build Forge examples")
27-
set(FG_BUILD_DOCS OFF CACHE BOOL "Used to build Forge documentation")
28-
set(FG_WITH_FREEIMAGE OFF CACHE BOOL "Turn on usage of freeimage dependency")
17+
if(TARGET Forge::forge)
18+
get_target_property(fg_lib_type Forge::forge TYPE)
19+
if(NOT ${fg_lib_type} STREQUAL "STATIC_LIBRARY")
20+
install(FILES
21+
$<TARGET_FILE:Forge::forge>
22+
$<$<PLATFORM_ID:Linux>:$<TARGET_SONAME_FILE:Forge::forge>>
23+
$<$<PLATFORM_ID:Darwin>:$<TARGET_SONAME_FILE:Forge::forge>>
24+
$<$<PLATFORM_ID:Linux>:$<TARGET_LINKER_FILE:Forge::forge>>
25+
$<$<PLATFORM_ID:Darwin>:$<TARGET_LINKER_FILE:Forge::forge>>
26+
DESTINATION "${AF_INSTALL_LIB_DIR}"
27+
COMPONENT common_backend_dependencies)
28+
endif()
29+
else()
30+
set(FG_VERSION "${FG_VERSION_MAJOR}.${FG_VERSION_MINOR}.${FG_VERSION_PATCH}")
31+
set(FG_API_VERSION_CURRENT ${FG_VERSION_MAJOR}${FG_VERSION_MINOR})
2932

30-
add_subdirectory(${${forge_prefix}_SOURCE_DIR} ${${forge_prefix}_BINARY_DIR} EXCLUDE_FROM_ALL)
33+
FetchContent_Declare(
34+
${forge_prefix}
35+
GIT_REPOSITORY https://github.com/arrayfire/forge.git
36+
GIT_TAG "v${FG_VERSION}"
37+
)
38+
af_dep_check_and_populate(${forge_prefix})
3139

32-
mark_as_advanced(
33-
FG_BUILD_EXAMPLES
34-
FG_BUILD_DOCS
35-
FG_WITH_FREEIMAGE
36-
FG_USE_WINDOW_TOOLKIT
37-
FG_USE_SYSTEM_CL2HPP
38-
FG_ENABLE_HUNTER
39-
FG_RENDERING_BACKEND
40-
SPHINX_EXECUTABLE
41-
glfw3_DIR
42-
glm_DIR
43-
)
44-
set(CMAKE_BUILD_TYPE ${ArrayFireBuildType})
45-
set(CMAKE_INSTALL_PREFIX ${ArrayFireInstallPrefix})
40+
if(AF_BUILD_FORGE)
41+
set(ArrayFireInstallPrefix ${CMAKE_INSTALL_PREFIX})
42+
set(ArrayFireBuildType ${CMAKE_BUILD_TYPE})
43+
set(CMAKE_INSTALL_PREFIX ${${forge_prefix}_BINARY_DIR}/extern/forge/package)
44+
set(CMAKE_BUILD_TYPE Release)
45+
set(FG_BUILD_EXAMPLES OFF CACHE BOOL "Used to build Forge examples")
46+
set(FG_BUILD_DOCS OFF CACHE BOOL "Used to build Forge documentation")
47+
set(FG_WITH_FREEIMAGE OFF CACHE BOOL "Turn on usage of freeimage dependency")
48+
49+
add_subdirectory(
50+
${${forge_prefix}_SOURCE_DIR} ${${forge_prefix}_BINARY_DIR} EXCLUDE_FROM_ALL)
51+
mark_as_advanced(
52+
FG_BUILD_EXAMPLES
53+
FG_BUILD_DOCS
54+
FG_WITH_FREEIMAGE
55+
FG_USE_WINDOW_TOOLKIT
56+
FG_USE_SYSTEM_CL2HPP
57+
FG_ENABLE_HUNTER
58+
FG_RENDERING_BACKEND
59+
SPHINX_EXECUTABLE
60+
glfw3_DIR
61+
glm_DIR
62+
)
63+
set(CMAKE_BUILD_TYPE ${ArrayFireBuildType})
64+
set(CMAKE_INSTALL_PREFIX ${ArrayFireInstallPrefix})
4665

47-
install(FILES
48-
$<TARGET_FILE:forge>
49-
$<$<PLATFORM_ID:Linux>:$<TARGET_SONAME_FILE:forge>>
50-
$<$<PLATFORM_ID:Darwin>:$<TARGET_SONAME_FILE:forge>>
51-
$<$<PLATFORM_ID:Linux>:$<TARGET_LINKER_FILE:forge>>
52-
$<$<PLATFORM_ID:Darwin>:$<TARGET_LINKER_FILE:forge>>
53-
DESTINATION "${AF_INSTALL_LIB_DIR}"
54-
COMPONENT common_backend_dependencies)
55-
set_property(TARGET forge APPEND_STRING PROPERTY COMPILE_FLAGS " -w")
56-
else(AF_BUILD_FORGE)
57-
configure_file(
58-
${${forge_prefix}_SOURCE_DIR}/CMakeModules/version.h.in
59-
${${forge_prefix}_BINARY_DIR}/include/fg/version.h
60-
)
61-
endif(AF_BUILD_FORGE)
66+
install(FILES
67+
$<TARGET_FILE:forge>
68+
$<$<PLATFORM_ID:Linux>:$<TARGET_SONAME_FILE:forge>>
69+
$<$<PLATFORM_ID:Darwin>:$<TARGET_SONAME_FILE:forge>>
70+
$<$<PLATFORM_ID:Linux>:$<TARGET_LINKER_FILE:forge>>
71+
$<$<PLATFORM_ID:Darwin>:$<TARGET_LINKER_FILE:forge>>
72+
DESTINATION "${AF_INSTALL_LIB_DIR}"
73+
COMPONENT common_backend_dependencies)
74+
set_property(TARGET forge APPEND_STRING PROPERTY COMPILE_FLAGS " -w")
75+
else(AF_BUILD_FORGE)
76+
configure_file(
77+
${${forge_prefix}_SOURCE_DIR}/CMakeModules/version.h.in
78+
${${forge_prefix}_BINARY_DIR}/include/fg/version.h
79+
)
80+
endif(AF_BUILD_FORGE)
81+
endif()

0 commit comments

Comments
 (0)