Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 73 additions & 50 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
cmake_minimum_required (VERSION 3.21 FATAL_ERROR)

# See here: https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

#---[ CMake Config ]--------------------
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
# See here: https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )

set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" )
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

message(STATUS "Using CMake version ${CMAKE_VERSION}")
cmake_policy(SET CMP0054 NEW)
Expand All @@ -17,38 +17,39 @@ cmake_policy(SET CMP0056 NEW)

#---[ Build Config ]--------------------
project(OCCA
VERSION 2.0.0
VERSION 2.0.0
DESCRIPTION "JIT Compilation for Multiple Architectures: C++, OpenMP, CUDA, HIP, OpenCL, Metal"
HOMEPAGE_URL "https://github.com/libocca/occa"
LANGUAGES C CXX)
LANGUAGES C CXX
)

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
endif()

# CMake will decay to a previous C++ standard if a compiler does not support C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

option(OCCA_ENABLE_OPENMP "Build with OpenMP if available" ON)
option(OCCA_ENABLE_CUDA "Build with CUDA if available" ON)
option(OCCA_ENABLE_OPENCL "Build with OpenCL if available" ON)
option(OCCA_ENABLE_HIP "Build with HIP if available" ON)
option(OCCA_ENABLE_METAL "Build with Metal if available" ON)
option(OCCA_ENABLE_DPCPP "Build with SYCL/DPCPP if available" ON)
option(OCCA_ENABLE_OPENMP "Build with OpenMP if available" ON)
option(OCCA_ENABLE_CUDA "Build with CUDA if available" ON)
option(OCCA_ENABLE_OPENCL "Build with OpenCL if available" ON)
option(OCCA_ENABLE_HIP "Build with HIP if available" ON)
option(OCCA_ENABLE_METAL "Build with Metal if available" ON)
option(OCCA_ENABLE_DPCPP "Build with SYCL/DPCPP if available" ON)

option(OCCA_ENABLE_TESTS "Build tests" OFF)
option(OCCA_ENABLE_EXAMPLES "Build simple examples" OFF)
option(OCCA_ENABLE_FORTRAN "Enable Fortran interface" OFF)
option(OCCA_CLANG_BASED_TRANSPILER "Build with occa-transpiler dependecy" OFF)
option(OCCA_ENABLE_TESTS "Build tests" OFF)
option(OCCA_ENABLE_EXAMPLES "Build simple examples" OFF)
option(OCCA_ENABLE_FORTRAN "Enable Fortran interface" OFF)
option(OCCA_CLANG_BASED_TRANSPILER "Build with occa-transpiler dependecy" OFF)

if(OCCA_ENABLE_FORTRAN)
enable_language(Fortran)
endif()

option(ENABLE_SHARABLE_DEVICE "Enable sharable device by multiple threads" OFF)
option(ENABLE_SHARABLE_DEVICE "Enable sharable device by multiple threads" OFF)
if (ENABLE_SHARABLE_DEVICE)
set(OCCA_THREAD_SHARABLE_ENABLED 1)
message("-- OCCA sharable by multi-threads : Enabled")
Expand All @@ -73,11 +74,6 @@ else()
set(OCCA_OS "OCCA_WINDOWS_OS")
endif()

# INFO: order is important, deps should not apply compiler flags
if (OCCA_CLANG_BASED_TRANSPILER)
find_package(oklt REQUIRED)
endif()

include(SetCompilerFlags)

string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPER)
Expand All @@ -99,32 +95,32 @@ set(namespace "${PROJECT_NAME}::")
#---[ libocca.so ]----------------------
add_library(libocca SHARED)
add_library(${namespace}libocca ALIAS libocca)
target_include_directories(libocca
PUBLIC
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${OCCA_BUILD_DIR}/include>
$<INSTALL_INTERFACE:include>
)

# Without this, CMake will create liblibocca.so
set_target_properties(libocca PROPERTIES
OUTPUT_NAME occa
LIBRARY_OUTPUT_DIRECTORY ${OCCA_BUILD_DIR}/lib)
set_target_properties(libocca
PROPERTIES
OUTPUT_NAME
occa
LIBRARY_OUTPUT_DIRECTORY
${OCCA_BUILD_DIR}/lib
)

# Find needed and requested packages
find_package(Threads REQUIRED)

# Use the provided imported target Threads::Threads, to make our package relocatable
target_link_libraries(libocca PRIVATE
Threads::Threads ${CMAKE_DL_LIBS})

target_include_directories(libocca PUBLIC
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${OCCA_BUILD_DIR}/include>
$<INSTALL_INTERFACE:include>)

target_include_directories(libocca PRIVATE
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>)

if (OCCA_CLANG_BASED_TRANSPILER)
target_link_libraries(libocca PRIVATE occa::occa-transpiler)
target_compile_definitions(libocca PRIVATE -DBUILD_WITH_CLANG_BASED_TRANSPILER)
endif()

target_link_libraries(libocca
PRIVATE
Threads::Threads
${CMAKE_DL_LIBS}
)
#=======================================

#---[ OpenMP ]--------------------------
Expand Down Expand Up @@ -157,7 +153,7 @@ if(OCCA_ENABLE_CUDA)
message("-- CUDA driver library: ${CUDAToolkit_LIBRARY_DIR}")

# Use the provided imported target CUDA::cuda_driver, to make our package relocatable
target_link_libraries(libocca PUBLIC CUDA::cuda_driver)
target_link_libraries(libocca PRIVATE CUDA::cuda_driver)
else()
set(OCCA_CUDA_ENABLED 0)
endif()
Expand Down Expand Up @@ -244,10 +240,18 @@ if(OCCA_ENABLE_METAL AND APPLE)
endif()
#=======================================

#---[ Clang Transpiler ]---------------------------
# INFO: order is important, deps should not apply compiler flags
if (OCCA_CLANG_BASED_TRANSPILER)
find_package(oklt REQUIRED)
target_link_libraries(libocca PRIVATE occa::occa-transpiler)
target_compile_definitions(libocca PRIVATE -DBUILD_WITH_CLANG_BASED_TRANSPILER)
endif()

include(CheckRequiredCompilerFeatures)

if(NOT OCCA_IS_TOP_LEVEL)
# OCCA is being built as a subdirectory in another project
# OCCA is being built as a subdirectory in another project
set(OCCA_OPENMP_ENABLED ${OCCA_OPENMP_ENABLED} PARENT_SCOPE)
set(OCCA_CUDA_ENABLED ${OCCA_CUDA_ENABLED} PARENT_SCOPE)
set(OCCA_HIP_ENABLED ${OCCA_HIP_ENABLED} PARENT_SCOPE)
Expand Down Expand Up @@ -287,7 +291,26 @@ if(OCCA_ENABLE_TESTS)
add_subdirectory(tests)
endif()

install(TARGETS libocca EXPORT occaExport DESTINATION lib)
if (OCCA_ENABLE_FORTRAN)
install(TARGETS
libocca
c_api
fortran_api
EXPORT
occaExport
DESTINATION
lib
)
else()
install(TARGETS
libocca
c_api
EXPORT
occaExport
DESTINATION
lib
)
endif()
install(DIRECTORY include/ DESTINATION include)

# Create a package config and associated files.
Expand Down
23 changes: 21 additions & 2 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,23 @@ endmacro()

macro(compile_example target file mode)
add_executable(${target} ${file})
target_link_libraries(${target} OCCA::libocca)
target_include_directories(${target} PRIVATE $<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>)

target_link_libraries(${target}
PRIVATE
OCCA::c_api
OCCA::libocca
)
if (OCCA_ENABLE_FORTRAN)
target_link_libraries(${target}
PRIVATE
OCCA::fortran_api
)
endif()

target_include_directories(${target}
PRIVATE
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>
)

file(RELATIVE_PATH install_dir ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_LIST_DIR})
file(GLOB_RECURSE OKLS "${CMAKE_CURRENT_LIST_DIR}/*.okl")
Expand All @@ -63,6 +78,10 @@ endmacro()

macro(compile_c_example target file)
compile_example(examples_c_${target} ${file} TRUE)
target_link_libraries(examples_c_${target}
PRIVATE
OCCA::c_api
)
endmacro()

macro(compile_cpp_example target file)
Expand Down
23 changes: 20 additions & 3 deletions src/c/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,21 @@
target_sources(libocca PRIVATE base.cpp device.cpp dtype.cpp
experimental io.cpp json.cpp kernel.cpp kernel_fortran_interface.cpp
memory.cpp memoryPool.cpp scope.cpp stream.cpp)
add_library(c_api SHARED)
add_library(${namespace}c_api ALIAS c_api)
target_sources(c_api
PRIVATE
base.cpp
device.cpp
dtype.cpp
io.cpp
json.cpp
kernel.cpp
memory.cpp
memoryPool.cpp
scope.cpp
stream.cpp
)
add_subdirectory(experimental)

target_link_libraries(c_api
PRIVATE
libocca
)
5 changes: 4 additions & 1 deletion src/c/experimental/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
target_sources(libocca PRIVATE kernelBuilder.cpp)
target_sources(c_api
PRIVATE
kernelBuilder.cpp
)
13 changes: 11 additions & 2 deletions src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
target_sources(libocca PRIVATE base.cpp device.cpp kernelArg.cpp
kernel.cpp memory.cpp memoryPool.cpp stream.cpp streamTag.cpp)
target_sources(libocca
PRIVATE
base.cpp
device.cpp
kernelArg.cpp
kernel.cpp
memory.cpp
memoryPool.cpp
stream.cpp
streamTag.cpp
)
6 changes: 5 additions & 1 deletion src/dtype/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
target_sources(libocca PRIVATE builtins.cpp dtype.cpp)
target_sources(libocca
PRIVATE
builtins.cpp
dtype.cpp
)
5 changes: 4 additions & 1 deletion src/experimental/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
target_sources(libocca PRIVATE kernelBuilder.cpp)
target_sources(libocca
PRIVATE
kernelBuilder.cpp
)
30 changes: 25 additions & 5 deletions src/fortran/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
target_sources(libocca PRIVATE fc_string_m.f90 occa_base_m.f90
occa_device_m.f90 occa_dtype_m.f90 occa_json_m.f90
occa_kernelBuilder_m.f90 occa_kernel_m.f90 occa_memory_m.f90
occa_m.f90 occa_scope_m.f90 occa_stream_m.f90 occa_typedefs_m.f90
occa_types_m.f90)
add_library(fortran_api SHARED)
add_library(${namespace}fortran_api ALIAS fortran_api)
target_sources(fortran_api
PRIVATE
fc_string_m.f90
occa_base_m.f90
occa_device_m.f90
occa_dtype_m.f90
occa_json_m.f90
occa_kernelBuilder_m.f90
occa_kernel_m.f90
occa_memory_m.f90
occa_m.f90
occa_scope_m.f90
occa_stream_m.f90
occa_typedefs_m.f90
occa_types_m.f90
kernel_fortran_interface.cpp
)

target_link_libraries(fortran_api
PRIVATE
c_api
libocca
)
10 changes: 8 additions & 2 deletions src/functional/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,8 @@
target_sources(libocca PRIVATE baseFunction.cpp functionDefinition.cpp
range.cpp scope.cpp utils.cpp)
target_sources(libocca
PRIVATE
baseFunction.cpp
functionDefinition.cpp
range.cpp
scope.cpp
utils.cpp
)
15 changes: 13 additions & 2 deletions src/loops/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,13 @@
target_sources(libocca PRIVATE forLoop.cpp iteration.cpp
typelessForLoop.cpp)
target_sources(libocca
PRIVATE
forLoop.cpp
iteration.cpp
typelessForLoop.cpp
)

target_include_directories(libocca
PRIVATE
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${OCCA_BUILD_DIR}/include>
)
1 change: 1 addition & 0 deletions src/occa/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
add_subdirectory(internal)

5 changes: 4 additions & 1 deletion src/occa/internal/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
target_sources(libocca PRIVATE modes.cpp)
target_sources(libocca
PRIVATE
modes.cpp
)

add_subdirectory(api)
add_subdirectory(bin)
Expand Down
6 changes: 5 additions & 1 deletion src/occa/internal/api/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
if (OCCA_METAL_ENABLED)
target_sources(libocca PRIVATE metal.mm)
target_sources(libocca
PRIVATE
metal.mm
)
endif()

add_subdirectory(metal)
16 changes: 13 additions & 3 deletions src/occa/internal/api/metal/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
if (OCCA_METAL_ENABLED)
target_sources(libocca PRIVATE buffer.mm commandQueue.mm device.mm
event.mm function.mm)
target_sources(libocca
PRIVATE
buffer.mm
commandQueue.mm
device.mm
event.mm
function.mm
)
endif()
target_sources(libocca PRIVATE polyfill.cpp)

target_sources(libocca
PRIVATE
polyfill.cpp
)
5 changes: 4 additions & 1 deletion src/occa/internal/bin/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
target_sources(libocca PRIVATE occa.cpp)
target_sources(libocca
PRIVATE
occa.cpp
)
Loading