Skip to content

Commit 591e45b

Browse files
authored
Split libocca target (#805)
* Build C and Fortran APIs as separate targets
1 parent 1e3ca0d commit 591e45b

40 files changed

+538
-152
lines changed

CMakeLists.txt

Lines changed: 73 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
cmake_minimum_required (VERSION 3.21 FATAL_ERROR)
22

3-
# See here: https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling
4-
set(CMAKE_SKIP_BUILD_RPATH FALSE)
5-
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
6-
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
7-
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
8-
93
#---[ CMake Config ]--------------------
104
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
11-
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
5+
# See here: https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling
6+
set(CMAKE_SKIP_BUILD_RPATH FALSE)
7+
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
8+
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )
9+
10+
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" )
11+
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
1212

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

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

2526
if(NOT CMAKE_BUILD_TYPE)
2627
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
2728
endif()
2829

2930
# CMake will decay to a previous C++ standard if a compiler does not support C++17
30-
set(CMAKE_CXX_STANDARD 17)
31-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
32-
set(CMAKE_CXX_EXTENSIONS OFF)
31+
set(CMAKE_CXX_STANDARD 17)
32+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
33+
set(CMAKE_CXX_EXTENSIONS OFF)
3334
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
3435

35-
option(OCCA_ENABLE_OPENMP "Build with OpenMP if available" ON)
36-
option(OCCA_ENABLE_CUDA "Build with CUDA if available" ON)
37-
option(OCCA_ENABLE_OPENCL "Build with OpenCL if available" ON)
38-
option(OCCA_ENABLE_HIP "Build with HIP if available" ON)
39-
option(OCCA_ENABLE_METAL "Build with Metal if available" ON)
40-
option(OCCA_ENABLE_DPCPP "Build with SYCL/DPCPP if available" ON)
36+
option(OCCA_ENABLE_OPENMP "Build with OpenMP if available" ON)
37+
option(OCCA_ENABLE_CUDA "Build with CUDA if available" ON)
38+
option(OCCA_ENABLE_OPENCL "Build with OpenCL if available" ON)
39+
option(OCCA_ENABLE_HIP "Build with HIP if available" ON)
40+
option(OCCA_ENABLE_METAL "Build with Metal if available" ON)
41+
option(OCCA_ENABLE_DPCPP "Build with SYCL/DPCPP if available" ON)
4142

42-
option(OCCA_ENABLE_TESTS "Build tests" OFF)
43-
option(OCCA_ENABLE_EXAMPLES "Build simple examples" OFF)
44-
option(OCCA_ENABLE_FORTRAN "Enable Fortran interface" OFF)
45-
option(OCCA_CLANG_BASED_TRANSPILER "Build with occa-transpiler dependecy" OFF)
43+
option(OCCA_ENABLE_TESTS "Build tests" OFF)
44+
option(OCCA_ENABLE_EXAMPLES "Build simple examples" OFF)
45+
option(OCCA_ENABLE_FORTRAN "Enable Fortran interface" OFF)
46+
option(OCCA_CLANG_BASED_TRANSPILER "Build with occa-transpiler dependecy" OFF)
4647

4748
if(OCCA_ENABLE_FORTRAN)
4849
enable_language(Fortran)
4950
endif()
5051

51-
option(ENABLE_SHARABLE_DEVICE "Enable sharable device by multiple threads" OFF)
52+
option(ENABLE_SHARABLE_DEVICE "Enable sharable device by multiple threads" OFF)
5253
if (ENABLE_SHARABLE_DEVICE)
5354
set(OCCA_THREAD_SHARABLE_ENABLED 1)
5455
message("-- OCCA sharable by multi-threads : Enabled")
@@ -73,11 +74,6 @@ else()
7374
set(OCCA_OS "OCCA_WINDOWS_OS")
7475
endif()
7576

76-
# INFO: order is important, deps should not apply compiler flags
77-
if (OCCA_CLANG_BASED_TRANSPILER)
78-
find_package(oklt REQUIRED)
79-
endif()
80-
8177
include(SetCompilerFlags)
8278

8379
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPER)
@@ -99,32 +95,32 @@ set(namespace "${PROJECT_NAME}::")
9995
#---[ libocca.so ]----------------------
10096
add_library(libocca SHARED)
10197
add_library(${namespace}libocca ALIAS libocca)
98+
target_include_directories(libocca
99+
PUBLIC
100+
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/include>
101+
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>
102+
$<BUILD_INTERFACE:${OCCA_BUILD_DIR}/include>
103+
$<INSTALL_INTERFACE:include>
104+
)
102105

103106
# Without this, CMake will create liblibocca.so
104-
set_target_properties(libocca PROPERTIES
105-
OUTPUT_NAME occa
106-
LIBRARY_OUTPUT_DIRECTORY ${OCCA_BUILD_DIR}/lib)
107+
set_target_properties(libocca
108+
PROPERTIES
109+
OUTPUT_NAME
110+
occa
111+
LIBRARY_OUTPUT_DIRECTORY
112+
${OCCA_BUILD_DIR}/lib
113+
)
107114

108115
# Find needed and requested packages
109116
find_package(Threads REQUIRED)
110117

111118
# Use the provided imported target Threads::Threads, to make our package relocatable
112-
target_link_libraries(libocca PRIVATE
113-
Threads::Threads ${CMAKE_DL_LIBS})
114-
115-
target_include_directories(libocca PUBLIC
116-
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/include>
117-
$<BUILD_INTERFACE:${OCCA_BUILD_DIR}/include>
118-
$<INSTALL_INTERFACE:include>)
119-
120-
target_include_directories(libocca PRIVATE
121-
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>)
122-
123-
if (OCCA_CLANG_BASED_TRANSPILER)
124-
target_link_libraries(libocca PRIVATE occa::occa-transpiler)
125-
target_compile_definitions(libocca PRIVATE -DBUILD_WITH_CLANG_BASED_TRANSPILER)
126-
endif()
127-
119+
target_link_libraries(libocca
120+
PRIVATE
121+
Threads::Threads
122+
${CMAKE_DL_LIBS}
123+
)
128124
#=======================================
129125

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

159155
# Use the provided imported target CUDA::cuda_driver, to make our package relocatable
160-
target_link_libraries(libocca PUBLIC CUDA::cuda_driver)
156+
target_link_libraries(libocca PRIVATE CUDA::cuda_driver)
161157
else()
162158
set(OCCA_CUDA_ENABLED 0)
163159
endif()
@@ -244,10 +240,18 @@ if(OCCA_ENABLE_METAL AND APPLE)
244240
endif()
245241
#=======================================
246242

243+
#---[ Clang Transpiler ]---------------------------
244+
# INFO: order is important, deps should not apply compiler flags
245+
if (OCCA_CLANG_BASED_TRANSPILER)
246+
find_package(oklt REQUIRED)
247+
target_link_libraries(libocca PRIVATE occa::occa-transpiler)
248+
target_compile_definitions(libocca PRIVATE -DBUILD_WITH_CLANG_BASED_TRANSPILER)
249+
endif()
250+
247251
include(CheckRequiredCompilerFeatures)
248252

249253
if(NOT OCCA_IS_TOP_LEVEL)
250-
# OCCA is being built as a subdirectory in another project
254+
# OCCA is being built as a subdirectory in another project
251255
set(OCCA_OPENMP_ENABLED ${OCCA_OPENMP_ENABLED} PARENT_SCOPE)
252256
set(OCCA_CUDA_ENABLED ${OCCA_CUDA_ENABLED} PARENT_SCOPE)
253257
set(OCCA_HIP_ENABLED ${OCCA_HIP_ENABLED} PARENT_SCOPE)
@@ -287,7 +291,26 @@ if(OCCA_ENABLE_TESTS)
287291
add_subdirectory(tests)
288292
endif()
289293

290-
install(TARGETS libocca EXPORT occaExport DESTINATION lib)
294+
if (OCCA_ENABLE_FORTRAN)
295+
install(TARGETS
296+
libocca
297+
c_api
298+
fortran_api
299+
EXPORT
300+
occaExport
301+
DESTINATION
302+
lib
303+
)
304+
else()
305+
install(TARGETS
306+
libocca
307+
c_api
308+
EXPORT
309+
occaExport
310+
DESTINATION
311+
lib
312+
)
313+
endif()
291314
install(DIRECTORY include/ DESTINATION include)
292315

293316
# Create a package config and associated files.

examples/CMakeLists.txt

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,23 @@ endmacro()
4343

4444
macro(compile_example target file mode)
4545
add_executable(${target} ${file})
46-
target_link_libraries(${target} OCCA::libocca)
47-
target_include_directories(${target} PRIVATE $<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>)
46+
47+
target_link_libraries(${target}
48+
PRIVATE
49+
OCCA::c_api
50+
OCCA::libocca
51+
)
52+
if (OCCA_ENABLE_FORTRAN)
53+
target_link_libraries(${target}
54+
PRIVATE
55+
OCCA::fortran_api
56+
)
57+
endif()
58+
59+
target_include_directories(${target}
60+
PRIVATE
61+
$<BUILD_INTERFACE:${OCCA_SOURCE_DIR}/src>
62+
)
4863

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

6479
macro(compile_c_example target file)
6580
compile_example(examples_c_${target} ${file} TRUE)
81+
target_link_libraries(examples_c_${target}
82+
PRIVATE
83+
OCCA::c_api
84+
)
6685
endmacro()
6786

6887
macro(compile_cpp_example target file)

src/c/CMakeLists.txt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
1-
target_sources(libocca PRIVATE base.cpp device.cpp dtype.cpp
2-
experimental io.cpp json.cpp kernel.cpp kernel_fortran_interface.cpp
3-
memory.cpp memoryPool.cpp scope.cpp stream.cpp)
1+
add_library(c_api SHARED)
2+
add_library(${namespace}c_api ALIAS c_api)
3+
target_sources(c_api
4+
PRIVATE
5+
base.cpp
6+
device.cpp
7+
dtype.cpp
8+
io.cpp
9+
json.cpp
10+
kernel.cpp
11+
memory.cpp
12+
memoryPool.cpp
13+
scope.cpp
14+
stream.cpp
15+
)
416
add_subdirectory(experimental)
17+
18+
target_link_libraries(c_api
19+
PRIVATE
20+
libocca
21+
)

src/c/experimental/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
target_sources(libocca PRIVATE kernelBuilder.cpp)
1+
target_sources(c_api
2+
PRIVATE
3+
kernelBuilder.cpp
4+
)

src/core/CMakeLists.txt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
1-
target_sources(libocca PRIVATE base.cpp device.cpp kernelArg.cpp
2-
kernel.cpp memory.cpp memoryPool.cpp stream.cpp streamTag.cpp)
1+
target_sources(libocca
2+
PRIVATE
3+
base.cpp
4+
device.cpp
5+
kernelArg.cpp
6+
kernel.cpp
7+
memory.cpp
8+
memoryPool.cpp
9+
stream.cpp
10+
streamTag.cpp
11+
)

src/dtype/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
target_sources(libocca PRIVATE builtins.cpp dtype.cpp)
1+
target_sources(libocca
2+
PRIVATE
3+
builtins.cpp
4+
dtype.cpp
5+
)

src/experimental/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
target_sources(libocca PRIVATE kernelBuilder.cpp)
1+
target_sources(libocca
2+
PRIVATE
3+
kernelBuilder.cpp
4+
)

src/fortran/CMakeLists.txt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
1-
target_sources(libocca PRIVATE fc_string_m.f90 occa_base_m.f90
2-
occa_device_m.f90 occa_dtype_m.f90 occa_json_m.f90
3-
occa_kernelBuilder_m.f90 occa_kernel_m.f90 occa_memory_m.f90
4-
occa_m.f90 occa_scope_m.f90 occa_stream_m.f90 occa_typedefs_m.f90
5-
occa_types_m.f90)
1+
add_library(fortran_api SHARED)
2+
add_library(${namespace}fortran_api ALIAS fortran_api)
3+
target_sources(fortran_api
4+
PRIVATE
5+
fc_string_m.f90
6+
occa_base_m.f90
7+
occa_device_m.f90
8+
occa_dtype_m.f90
9+
occa_json_m.f90
10+
occa_kernelBuilder_m.f90
11+
occa_kernel_m.f90
12+
occa_memory_m.f90
13+
occa_m.f90
14+
occa_scope_m.f90
15+
occa_stream_m.f90
16+
occa_typedefs_m.f90
17+
occa_types_m.f90
18+
kernel_fortran_interface.cpp
19+
)
20+
21+
target_link_libraries(fortran_api
22+
PRIVATE
23+
c_api
24+
libocca
25+
)
File renamed without changes.

src/functional/CMakeLists.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,8 @@
1-
target_sources(libocca PRIVATE baseFunction.cpp functionDefinition.cpp
2-
range.cpp scope.cpp utils.cpp)
1+
target_sources(libocca
2+
PRIVATE
3+
baseFunction.cpp
4+
functionDefinition.cpp
5+
range.cpp
6+
scope.cpp
7+
utils.cpp
8+
)

0 commit comments

Comments
 (0)