Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update cmake configuration #289

Merged
merged 7 commits into from
May 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/tests_and_coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
max-parallel: 1
matrix:
buildtype: [Debug]
os: [macos-latest]
os: [macos-13] #[macos-latest]
cxx: [clang++]
cc: [clang]
packages: [lcov gcovr]
Expand Down
71 changes: 8 additions & 63 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,75 +2,20 @@ cmake_minimum_required(VERSION 3.20)

project(CLIc VERSION 0.10.0)

set(BUILD_CUDA_BACKEND ON CACHE BOOL "Build CUDA backend")
set(BUILD_OPENCL_BACKEND ON CACHE BOOL "Build OpenCL backend")
# if not set, set the default build type to Release
if(NOT CLE_BACKEND_TYPE)
set(CLE_BACKEND_TYPE "OPENCL" CACHE STRING "Backend to use (CUDA or OCL)")
endif()


# set environment variables
include(${PROJECT_SOURCE_DIR}/cmake/CMakeSetEnv.cmake)
# find library dependencies
include(${PROJECT_SOURCE_DIR}/cmake/CMakeDependencies.cmake)
# managed third party libraries
add_subdirectory(thirdparty)

# include eigen library but exclude it from build
include_directories(${EIGEN_SOURCE_DIR} EXCLUDE_FROM_ALL)

# manage configuration files
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/${LIBRARY_NAME_LOWERCASE}/${LIBRARY_NAME_LOWERCASE}.hpp.in"
"${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME_LOWERCASE}/include/${LIBRARY_NAME_LOWERCASE}.hpp"
NO_SOURCE_PERMISSIONS @ONLY
)

# list project source files
file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/${LIBRARY_NAME_LOWERCASE}/src/*.cpp")
file(GLOB_RECURSE TIERS "${CMAKE_CURRENT_SOURCE_DIR}/${LIBRARY_NAME_LOWERCASE}/src/**/*.cpp")
list(APPEND SOURCES ${TIERS})

file(GLOB_RECURSE HEADERS_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${LIBRARY_NAME_LOWERCASE}/include/*.hpp")
file(GLOB_RECURSE HEADERS_BIN "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME_LOWERCASE}/include/*.hpp")
set(HEADERS ${HEADERS_SRC})
list(APPEND HEADERS ${HEADERS_BIN})
include(${PROJECT_SOURCE_DIR}/cmake/CMakeBackends.cmake)

# target library definition
add_library(${LIBRARY_NAME} ${SOURCES} ${HEADERS})
add_library(${PROJECT_NAME}::${LIBRARY_NAME} ALIAS ${LIBRARY_NAME})
target_include_directories(${LIBRARY_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${LIBRARY_NAME_LOWERCASE}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME_LOWERCASE}/include>
$<BUILD_INTERFACE:${KERNELS_HEADER_DIR}>
$<INSTALL_INTERFACE:include>
)

set_target_properties(${LIBRARY_NAME} PROPERTIES LINKER_LANGUAGE CXX) # force C++ linker
set_target_properties(${LIBRARY_NAME} PROPERTIES VERSION ${PROJECT_VERSION}) # set version
add_dependencies(${LIBRARY_NAME} generate_kernels)

# link GPU framework to the target
if (OpenCL_FOUND)
message (STATUS "OpenCL found")
target_include_directories(${LIBRARY_NAME} PUBLIC ${OpenCL_INCLUDE_DIRS})
target_link_libraries(${LIBRARY_NAME} PUBLIC ${OpenCL_LIBRARIES})
endif()
if (CUDAToolkit_FOUND)
message (STATUS "CUDA found")
set_target_properties(${LIBRARY_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
set_target_properties(${LIBRARY_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_include_directories(${LIBRARY_NAME} PUBLIC ${CUDAToolkit_INCLUDE_DIRS})
target_link_libraries(${LIBRARY_NAME} PUBLIC CUDA::cudart CUDA::cuda_driver CUDA::nvrtc CUDA::OpenCL)
endif()

# # Set RPATH configuration
# if(APPLE)
# set(CMAKE_BUILD_RPATH "@loader_path")
# set(CMAKE_INSTALL_RPATH "@loader_path/../lib")
# else()
# set(CMAKE_BUILD_RPATH "$ORIGIN")
# set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
# endif()

# library install instructions
include(${PROJECT_SOURCE_DIR}/cmake/Install.cmake)
# managed third party libraries
add_subdirectory(clic)

# Build and run tests
if(BUILD_TESTING)
Expand Down
63 changes: 63 additions & 0 deletions clic/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

# managed third party libraries
add_subdirectory(thirdparty)

# include eigen library but exclude it from build
# include_directories(${EIGEN_SOURCE_DIR})
# message(STATUS "Eigen include directory: ${EIGEN_SOURCE_DIR}")

# manage configuration files
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/${LIBRARY_NAME_LOWERCASE}.hpp.in"
"${CMAKE_CURRENT_BINARY_DIR}/include/${LIBRARY_NAME_LOWERCASE}.hpp"
NO_SOURCE_PERMISSIONS @ONLY
)

# list project source files
file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
file(GLOB_RECURSE TIERS "${CMAKE_CURRENT_SOURCE_DIR}/src/**/*.cpp")
list(APPEND SOURCES ${TIERS})

file(GLOB_RECURSE HEADERS_SRC "${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp")
file(GLOB_RECURSE HEADERS_BIN "${CMAKE_CURRENT_BINARY_DIR}/include/*.hpp")
set(HEADERS ${HEADERS_SRC})
list(APPEND HEADERS ${HEADERS_BIN})

# target library definition
add_library(${LIBRARY_NAME} ${SOURCES} ${HEADERS})
add_library(${PROJECT_NAME}::${LIBRARY_NAME} ALIAS ${LIBRARY_NAME})
target_include_directories(${LIBRARY_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
$<BUILD_INTERFACE:${KERNELS_HEADER_DIR}>
$<BUILD_INTERFACE:${EIGEN_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)

set_target_properties(${LIBRARY_NAME} PROPERTIES LINKER_LANGUAGE CXX) # force C++ linker
set_target_properties(${LIBRARY_NAME} PROPERTIES VERSION ${PROJECT_VERSION}) # set version
add_dependencies(${LIBRARY_NAME} generate_kernels)

# test if BACKEND variable is OpenCL
if(${OpenCL_FOUND})
target_include_directories(${LIBRARY_NAME} PUBLIC ${OpenCL_INCLUDE_DIRS})
target_link_libraries(${LIBRARY_NAME} PUBLIC ${OpenCL_LIBRARIES})
endif()
if(${CUDAToolkit_FOUND})
set_target_properties(${LIBRARY_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
set_target_properties(${LIBRARY_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_include_directories(${LIBRARY_NAME} PUBLIC ${CUDAToolkit_INCLUDE_DIRS})
target_link_libraries(${LIBRARY_NAME} PUBLIC CUDA::cudart CUDA::cuda_driver CUDA::nvrtc CUDA::OpenCL)
endif()

# # Set RPATH configuration
# if(APPLE)
# set(CMAKE_BUILD_RPATH "@loader_path")
# set(CMAKE_INSTALL_RPATH "@loader_path/../lib")
# else()
# set(CMAKE_BUILD_RPATH "$ORIGIN")
# set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
# endif()

# library install instructions
include(${PROJECT_SOURCE_DIR}/cmake/Install.cmake)
File renamed without changes.
File renamed without changes.
57 changes: 57 additions & 0 deletions cmake/CMakeBackends.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
message(STATUS "Searching for backend dependencies")

set(CLE_OPENCL false)
set(CLE_CUDA false)

if (CLE_BACKEND_TYPE STREQUAL "OPENCL" OR CLE_BACKEND_TYPE STREQUAL "ALL")
message(STATUS "Search OpenCL library")
if (DEFINED OpenCL_LIBRARIES AND DEFINED OpenCL_INCLUDE_DIRS)
set(OpenCL_FOUND true)
else()
find_package(OpenCL)
if (OpenCL_FOUND)
set(OpenCL_LIBRARIES ${OpenCL_LIBRARIES})
set(OpenCL_INCLUDE_DIRS ${OpenCL_INCLUDE_DIRS})
endif()
endif()
if (OpenCL_FOUND)
set(CLE_OPENCL true)
message(STATUS "OpenCL library : ${OpenCL_LIBRARIES}")
message(STATUS "OpenCL includes : ${OpenCL_INCLUDE_DIRS}")
endif()
endif()

if (CLE_BACKEND_TYPE STREQUAL "CUDA" OR CLE_BACKEND_TYPE STREQUAL "ALL")
message(STATUS "Search CUDAToolkit library")
if (DEFINED CUDAToolkit_LIBRARY_DIR AND DEFINED CUDAToolkit_INCLUDE_DIRS)
set(CUDAToolkit_FOUND true)
else()
find_package(CUDAToolkit)
if (CUDAToolkit_FOUND)
set(CUDAToolkit_LIBRARY_DIR ${CUDAToolkit_LIBRARY_DIR})
set(CUDAToolkit_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIRS})
endif()
endif()
if (CUDAToolkit_FOUND)
set(CLE_CUDA true)
message(STATUS "CUDAToolkit library : ${CUDAToolkit_LIBRARY_DIR}")
message(STATUS "CUDAToolkit includes : ${CUDAToolkit_INCLUDE_DIRS}")
endif()
endif()

if (NOT OpenCL_FOUND AND NOT CUDAToolkit_FOUND)
message(FATAL_ERROR "No GPU framework found (OpenCL, CUDA). Please provide one of these GPU frameworks in order to compile the library.")
endif()

# add the variables to the compile definitions for the source code
add_compile_definitions(
$<$<BOOL:${CLE_CUDA}>:CLE_CUDA>
$<$<BOOL:${CLE_OPENCL}>:CLE_OPENCL>
)

if (CLE_OPENCL)
message(STATUS "Building for OpenCL Backend")
endif()
if (CLE_CUDA)
message(STATUS "Building for CUDA Backend")
endif()
61 changes: 0 additions & 61 deletions cmake/CMakeDependencies.cmake

This file was deleted.