xref: /aosp_15_r20/external/OpenCL-CLHPP/CMakeLists.txt (revision 6fee86a4f833e4f32f25770a262884407554133d)
1cmake_minimum_required(VERSION 3.1)
2
3project(OpenCLHeadersCpp
4  VERSION 3.0
5  LANGUAGES CXX # Ideally should be NONE, but GNUInstallDirs detects platform arch using try_compile
6  # https://stackoverflow.com/questions/43379311/why-does-project-affect-cmakes-opinion-on-cmake-sizeof-void-p
7)
8enable_testing()
9
10set(CMAKE_CXX_STANDARD 11)
11set(CMAKE_CXX_STANDARD_REQUIRED ON)
12
13option(BUILD_DOCS "Build Documentation" ON)
14option(BUILD_EXAMPLES "Build Examples" ON)
15option(OPENCL_CLHPP_BUILD_TESTING "Enable support for OpenCL C++ headers testing." OFF)
16set(THREADS_PREFER_PTHREAD_FLAG ON CACHE BOOL
17  "find_package(Threads) preference. Recommendation is to keep default value."
18)
19# Legacy helper variables, see later at finding headers and ICD Loader
20set(OPENCL_DIST_DIR "" CACHE PATH "OpenCL source dir (legacy helper var)")
21set(OPENCL_LIB_DIR "${OPENCL_DIST_DIR}/lib" CACHE PATH "OpenCL library dir (legacy helper var)" )
22set(OPENCL_INCLUDE_DIR "${OPENCL_DIST_DIR}/include" CACHE PATH "OpenCL source dir (legacy helper var)")
23# Helper vars with names consistent with OpenCL-ICD-Loader's OPENCL_ICD_LOADER_HEADERS_DIR
24# Default values taken from legacy defaults
25set(OPENCL_CLHPP_HEADERS_DIR "${OPENCL_INCLUDE_DIR}" CACHE PATH "OpenCL headers dir")
26set(OPENCL_CLHPP_LOADER_DIR "${OPENCL_LIB_DIR}" CACHE PATH "OpenCL library dir")
27
28add_library(HeadersCpp INTERFACE)
29add_library(OpenCL::HeadersCpp ALIAS HeadersCpp)
30
31if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_CLHPP_BUILD_TESTING)
32  include(CTest)
33endif()
34if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_CLHPP_BUILD_TESTING) AND BUILD_TESTING)
35  set(CLHPP_BUILD_TESTS ON)
36endif()
37
38# In the spirit of backward compatibility, to not break existing build automation
39# we first check if the helper vars refer to existing files. If yes, use them.
40# Otherwise search using 3.0 installed CMake Package Configs.
41if(EXISTS "${OPENCL_CLHPP_HEADERS_DIR}/CL/cl.h")
42  if(NOT TARGET OpenCL::Headers)
43    message(STATUS "Defining OpenCL::Headers through OPENCL_INCLUDE_DIR")
44    add_library(OpenCLHeaders INTERFACE)
45    add_library(OpenCL::Headers ALIAS OpenCLHeaders)
46    target_include_directories(OpenCLHeaders INTERFACE ${OPENCL_INCLUDE_DIR})
47  endif()
48else()
49  if(NOT TARGET OpenCL::Headers)
50    find_package(OpenCLHeaders REQUIRED)
51  endif()
52endif()
53if(BUILD_EXAMPLES OR CLHPP_BUILD_TESTS)
54  enable_language(C)
55  find_package(Threads REQUIRED)
56endif()
57if(CLHPP_BUILD_TESTS)
58  find_program(RUBY_EXECUTABLE ruby REQUIRED)
59endif()
60
61target_include_directories(HeadersCpp
62  INTERFACE
63    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
64    $<INSTALL_INTERFACE:include>
65)
66target_link_libraries(HeadersCpp
67  INTERFACE
68    OpenCL::Headers
69)
70
71install(
72  TARGETS HeadersCpp
73  EXPORT OpenCLHeadersCppTargets
74)
75
76set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
77include(JoinPaths)
78
79include(GNUInstallDirs)
80
81install(
82  DIRECTORY include/CL
83  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
84)
85export(
86  EXPORT OpenCLHeadersCppTargets
87  FILE ${PROJECT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppTargets.cmake
88  NAMESPACE OpenCL::
89)
90file(
91  WRITE ${PROJECT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfig.cmake
92  "include(\"\${CMAKE_CURRENT_LIST_DIR}/OpenCLHeadersCppTargets.cmake\")"
93)
94
95set(config_package_location ${CMAKE_INSTALL_DATADIR}/cmake/OpenCLHeadersCpp)
96install(
97  EXPORT OpenCLHeadersCppTargets
98  FILE OpenCLHeadersCppTargets.cmake
99  NAMESPACE OpenCL::
100  DESTINATION ${config_package_location}
101)
102install(
103  FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfig.cmake
104  DESTINATION ${config_package_location}
105)
106
107unset(CMAKE_SIZEOF_VOID_P)
108include(CMakePackageConfigHelpers)
109write_basic_package_version_file(
110  ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfigVersion.cmake
111  VERSION ${PROJECT_VERSION}
112  COMPATIBILITY AnyNewerVersion
113)
114install(
115  FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfigVersion.cmake
116  DESTINATION ${config_package_location}
117)
118
119set(UNITY_DIR ${PROJECT_SOURCE_DIR}/external/CMock/vendor/unity CACHE PATH "Unity dir")
120set(CMOCK_DIR ${PROJECT_SOURCE_DIR}/external/CMock CACHE PATH "CMock dir")
121
122if(BUILD_DOCS)
123  add_subdirectory(docs)
124endif(BUILD_DOCS)
125
126if(BUILD_EXAMPLES)
127  add_subdirectory(examples)
128endif(BUILD_EXAMPLES)
129
130if(CLHPP_BUILD_TESTS)
131  add_subdirectory(tests)
132endif(CLHPP_BUILD_TESTS)
133
134join_paths(OPENCLHPP_INCLUDEDIR_PC "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
135
136configure_file(OpenCL-CLHPP.pc.in OpenCL-CLHPP.pc @ONLY)
137set(pkg_config_location ${CMAKE_INSTALL_DATADIR}/pkgconfig)
138install(
139  FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCL-CLHPP.pc
140  DESTINATION ${pkg_config_location})
141