blob: 40a102c669e482da4e935e41d6b0c5e869c2e0bc [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
message(STATUS "Building using CMake version: ${CMAKE_VERSION}")
cmake_minimum_required(VERSION 3.14)
include(FetchContent)
if(NOT DEFINED CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 11)
endif()
project(nanoarrow_device)
option(NANOARROW_DEVICE_BUILD_TESTS "Build tests" OFF)
option(NANOARROW_DEVICE_BUNDLE "Create bundled nanoarrow_device.h and nanoarrow_device.c"
OFF)
option(NANOARROW_DEVICE_WITH_METAL "Build Apple metal extension" OFF)
option(NANOARROW_DEVICE_WITH_CUDA "Build CUDA extension" OFF)
option(NANOARROW_DEVICE_CODE_COVERAGE "Enable coverage reporting" OFF)
add_library(device_coverage_config INTERFACE)
if(NANOARROW_DEVICE_BUILD_TESTS OR NOT NANOARROW_DEVICE_BUNDLE)
# Add the nanoarrow dependency. nanoarrow is not linked into the
# nanoarrow_device library (the caller must link this themselves);
# however, we need nanoarrow.h to build nanoarrow_device.c.
fetchcontent_declare(nanoarrow SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
# Don't install nanoarrow because of this configuration
fetchcontent_getproperties(nanoarrow)
if(NOT nanoarrow_POPULATED)
fetchcontent_populate(nanoarrow)
add_subdirectory(${nanoarrow_SOURCE_DIR} ${nanoarrow_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
endif()
if(NANOARROW_DEVICE_BUNDLE)
# The CMake build step is creating nanoarrow_device.c and nanoarrow_device.h;
# the CMake install step is copying them to a specific location
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/amalgamation)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/amalgamation/nanoarrow)
# nanoarrow_device.h is currently standalone
set(NANOARROW_DEVICE_H_TEMP
${CMAKE_BINARY_DIR}/amalgamation/nanoarrow/nanoarrow_device.h)
file(READ src/nanoarrow/nanoarrow_device.h SRC_FILE_CONTENTS)
file(WRITE ${NANOARROW_DEVICE_H_TEMP} "${SRC_FILE_CONTENTS}")
# nanoarrow_device.c is currently standalone
set(NANOARROW_DEVICE_C_TEMP
${CMAKE_BINARY_DIR}/amalgamation/nanoarrow/nanoarrow_device.c)
file(READ src/nanoarrow/nanoarrow_device.c SRC_FILE_CONTENTS)
file(WRITE ${NANOARROW_DEVICE_C_TEMP} "${SRC_FILE_CONTENTS}")
# Add a library that the tests can link against (but don't install it)
if(NANOARROW_DEVICE_BUILD_TESTS)
add_library(nanoarrow_device ${NANOARROW_DEVICE_C_TEMP})
target_include_directories(nanoarrow_device
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${nanoarrow_SOURCE_DIR}/src/nanoarrow>
$<BUILD_INTERFACE:${nanoarrow_BINARY_DIR}/generated>
$<BUILD_INTERFACE:${NANOARROW_DEVICE_FLATCC_INCLUDE_DIR}>
)
endif()
# Install the amalgamated header and sources
install(FILES ${NANOARROW_DEVICE_H_TEMP} ${NANOARROW_DEVICE_C_TEMP} DESTINATION ".")
else()
# This is a normal CMake build that builds + installs some includes and a static lib
if(NANOARROW_DEVICE_WITH_METAL)
if(NOT EXISTS "${CMAKE_BINARY_DIR}/metal-cpp")
message(STATUS "Fetching metal-cpp")
file(DOWNLOAD
"https://developer.apple.com/metal/cpp/files/metal-cpp_macOS12_iOS15.zip"
"${CMAKE_BINARY_DIR}/metal-cpp.zip")
file(ARCHIVE_EXTRACT
INPUT
${CMAKE_BINARY_DIR}/metal-cpp.zip
DESTINATION
${CMAKE_BINARY_DIR})
endif()
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_library(METAL_LIBRARY Metal REQUIRED)
message(STATUS "Metal framework found at '${METAL_LIBRARY}'")
find_library(FOUNDATION_LIBRARY Foundation REQUIRED)
message(STATUS "Foundation framework found at '${FOUNDATION_LIBRARY}'")
find_library(QUARTZ_CORE_LIBRARY QuartzCore REQUIRED)
message(STATUS "CoreFoundation framework found at '${QUARTZ_CORE_LIBRARY}'")
set(NANOARROW_DEVICE_SOURCES_METAL src/nanoarrow/nanoarrow_device_metal.cc)
set(NANOARROW_DEVICE_INCLUDE_METAL ${CMAKE_BINARY_DIR}/metal-cpp)
set(NANOARROW_DEVICE_LIBS_METAL ${METAL_LIBRARY} ${FOUNDATION_LIBRARY}
${QUARTZ_CORE_LIBRARY})
set(NANOARROW_DEVICE_DEFS_METAL "NANOARROW_DEVICE_WITH_METAL")
endif()
if(NANOARROW_DEVICE_WITH_CUDA)
find_package(CUDAToolkit REQUIRED)
set(NANOARROW_DEVICE_SOURCES_CUDA src/nanoarrow/nanoarrow_device_cuda.c)
set(NANOARROW_DEVICE_LIBS_CUDA CUDA::cudart_static)
set(NANOARROW_DEVICE_DEFS_CUDA "NANOARROW_DEVICE_WITH_CUDA")
endif()
add_library(nanoarrow_device
src/nanoarrow/nanoarrow_device.c ${NANOARROW_DEVICE_SOURCES_METAL}
${NANOARROW_DEVICE_SOURCES_CUDA})
target_include_directories(nanoarrow_device
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/nanoarrow>
$<BUILD_INTERFACE:${nanoarrow_SOURCE_DIR}/src/nanoarrow>
$<BUILD_INTERFACE:${nanoarrow_BINARY_DIR}/generated>
$<BUILD_INTERFACE:${NANOARROW_DEVICE_INCLUDE_METAL}>
$<INSTALL_INTERFACE:include>)
target_compile_definitions(nanoarrow_device PRIVATE ${NANOARROW_DEVICE_DEFS_METAL}
${NANOARROW_DEVICE_DEFS_CUDA})
target_link_libraries(nanoarrow_device PUBLIC ${NANOARROW_DEVICE_LIBS_METAL}
${NANOARROW_DEVICE_LIBS_CUDA})
install(TARGETS nanoarrow_device DESTINATION lib)
install(FILES src/nanoarrow/nanoarrow_device.h DESTINATION include/nanoarrow)
endif()
if(NANOARROW_DEVICE_BUILD_TESTS)
set(MEMORYCHECK_COMMAND_OPTIONS
"--leak-check=full --suppressions=${CMAKE_CURRENT_LIST_DIR}/../../valgrind.supp --error-exitcode=1"
)
include(CTest)
include(FetchContent)
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 11)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Warning about timestamps of downloaded files
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.23")
cmake_policy(SET CMP0135 NEW)
endif()
# Use an old version of googletest if we have to to support gcc 4.8
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_VERSION
VERSION_GREATER_EQUAL "5.0.0")
fetchcontent_declare(googletest
URL https://github.com/google/googletest/archive/release-1.11.0.zip
URL_HASH SHA256=353571c2440176ded91c2de6d6cd88ddd41401d14692ec1f99e35d013feda55a
)
else()
fetchcontent_declare(googletest
URL https://github.com/google/googletest/archive/release-1.10.0.zip
URL_HASH SHA256=94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91
)
endif()
fetchcontent_makeavailable(googletest)
enable_testing()
add_executable(nanoarrow_device_test src/nanoarrow/nanoarrow_device_test.cc)
add_executable(nanoarrow_device_hpp_test src/nanoarrow/nanoarrow_device_hpp_test.cc)
if(NANOARROW_DEVICE_CODE_COVERAGE)
target_compile_options(device_coverage_config INTERFACE -O0 -g --coverage)
target_link_options(device_coverage_config INTERFACE --coverage)
target_link_libraries(nanoarrow_device PRIVATE device_coverage_config)
endif()
target_link_libraries(nanoarrow_device_test
nanoarrow_device
nanoarrow
gtest_main
device_coverage_config)
target_link_libraries(nanoarrow_device_hpp_test
nanoarrow_device
nanoarrow
gtest_main
device_coverage_config)
include(GoogleTest)
gtest_discover_tests(nanoarrow_device_test)
gtest_discover_tests(nanoarrow_device_hpp_test)
if(NANOARROW_DEVICE_WITH_METAL)
add_executable(nanoarrow_device_metal_test
src/nanoarrow/nanoarrow_device_metal_test.cc)
target_link_libraries(nanoarrow_device_metal_test
nanoarrow_device
nanoarrow
gtest_main
device_coverage_config)
gtest_discover_tests(nanoarrow_device_metal_test)
endif()
if(NANOARROW_DEVICE_WITH_CUDA)
add_executable(nanoarrow_device_cuda_test src/nanoarrow/nanoarrow_device_cuda_test.cc)
target_link_libraries(nanoarrow_device_cuda_test
nanoarrow_device
nanoarrow
gtest_main
device_coverage_config)
gtest_discover_tests(nanoarrow_device_cuda_test)
endif()
endif()