xref: /aosp_15_r20/external/OpenCL-Headers/CMakeLists.txt (revision 3cc257528f335c5672e46865a03b8ee020e5fe2d)
1cmake_minimum_required(VERSION 3.0)
2cmake_policy(VERSION 3.0...3.22)
3
4# Include guard for including this project multiple times
5if(TARGET Headers)
6  return()
7endif()
8
9project(OpenCLHeaders
10  VERSION 2.2
11  LANGUAGES C # Ideally should be NONE, but GNUInstallDirs detects platform arch using try_compile
12  # https://stackoverflow.com/questions/43379311/why-does-project-affect-cmakes-opinion-on-cmake-sizeof-void-p
13)
14
15option(OPENCL_HEADERS_BUILD_TESTING "Enable support for OpenCL C headers testing." OFF)
16option(OPENCL_HEADERS_BUILD_CXX_TESTS "Enable support for OpenCL C headers testing in C++ mode." ON)
17
18set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
19include(JoinPaths)
20
21include(GNUInstallDirs)
22
23add_library(Headers INTERFACE)
24add_library(OpenCL::Headers ALIAS Headers)
25
26if(CMAKE_SYSTEM_NAME MATCHES Darwin)
27  execute_process(
28    COMMAND ln -snf ${CMAKE_CURRENT_SOURCE_DIR}/CL ${CMAKE_CURRENT_BINARY_DIR}/CL
29    COMMAND ln -snf ${CMAKE_CURRENT_SOURCE_DIR}/CL ${CMAKE_CURRENT_BINARY_DIR}/OpenCL
30  )
31  target_include_directories(Headers
32    INTERFACE
33      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
34      $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
35  )
36  install(CODE "
37    file(MAKE_DIRECTORY  ${CMAKE_INSTALL_FULL_INCLUDEDIR}/CL)
38    execute_process(
39      COMMAND ln -snf CL ${CMAKE_INSTALL_FULL_INCLUDEDIR}/OpenCL
40    )"
41  )
42else()
43  target_include_directories(Headers
44    INTERFACE
45      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
46      $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
47  )
48endif()
49
50install(
51  TARGETS Headers
52  EXPORT OpenCLHeadersTargets
53)
54install(
55  DIRECTORY CL
56  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
57)
58
59export(
60  EXPORT OpenCLHeadersTargets
61  FILE ${PROJECT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersTargets.cmake
62  NAMESPACE OpenCL::
63)
64file(
65  WRITE ${PROJECT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfig.cmake
66  "include(\"\${CMAKE_CURRENT_LIST_DIR}/OpenCLHeadersTargets.cmake\")"
67)
68
69set(config_package_location ${CMAKE_INSTALL_DATADIR}/cmake/OpenCLHeaders)
70install(
71  EXPORT OpenCLHeadersTargets
72  FILE OpenCLHeadersTargets.cmake
73  NAMESPACE OpenCL::
74  DESTINATION ${config_package_location}
75)
76install(
77  FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfig.cmake
78  DESTINATION ${config_package_location}
79)
80
81unset(CMAKE_SIZEOF_VOID_P)
82include(CMakePackageConfigHelpers)
83write_basic_package_version_file(
84  ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfigVersion.cmake
85  VERSION ${PROJECT_VERSION}
86  COMPATIBILITY AnyNewerVersion
87)
88install(
89  FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfigVersion.cmake
90  DESTINATION ${config_package_location}
91)
92
93if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_HEADERS_BUILD_TESTING)
94  include(CTest)
95endif()
96if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_HEADERS_BUILD_TESTING) AND BUILD_TESTING)
97  add_subdirectory(tests)
98endif()
99
100if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
101    find_package(Python3 COMPONENTS Interpreter)
102    set(OPENCL_HEADERS_XML_PATH CACHE FILEPATH "Path to cl.xml for OpenCL Header genereration")
103    set(OPENCL_HEADERS_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated)
104    add_custom_target(headers_generate
105        COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENCL_HEADERS_OUTPUT_DIRECTORY}
106        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR}/scripts
107            ${Python3_EXECUTABLE} gen_headers.py
108            -registry ${OPENCL_HEADERS_XML_PATH}
109            -o ${OPENCL_HEADERS_OUTPUT_DIRECTORY}
110    )
111    add_custom_target(headers_copy
112        COMMAND ${CMAKE_COMMAND} -E copy
113            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_d3d10.h
114            ${CMAKE_CURRENT_SOURCE_DIR}/CL
115        COMMAND ${CMAKE_COMMAND} -E copy
116            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_d3d11.h
117            ${CMAKE_CURRENT_SOURCE_DIR}/CL
118        COMMAND ${CMAKE_COMMAND} -E copy
119            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_dx9_media_sharing.h
120            ${CMAKE_CURRENT_SOURCE_DIR}/CL
121        COMMAND ${CMAKE_COMMAND} -E copy
122            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_egl.h
123            ${CMAKE_CURRENT_SOURCE_DIR}/CL
124        COMMAND ${CMAKE_COMMAND} -E copy
125            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_ext.h
126            ${CMAKE_CURRENT_SOURCE_DIR}/CL
127        COMMAND ${CMAKE_COMMAND} -E copy
128            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_gl.h
129            ${CMAKE_CURRENT_SOURCE_DIR}/CL
130        COMMAND ${CMAKE_COMMAND} -E copy
131            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_layer.h
132            ${CMAKE_CURRENT_SOURCE_DIR}/CL
133        COMMAND ${CMAKE_COMMAND} -E copy
134            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_va_api_media_sharing_intel.h
135            ${CMAKE_CURRENT_SOURCE_DIR}/CL
136        COMMAND ${CMAKE_COMMAND} -E copy
137            ${OPENCL_HEADERS_OUTPUT_DIRECTORY}/cl_function_types.h
138            ${CMAKE_CURRENT_SOURCE_DIR}/CL
139    )
140    set_target_properties(headers_generate PROPERTIES FOLDER "Generation")
141    set_target_properties(headers_copy PROPERTIES FOLDER "Generation")
142endif()
143
144join_paths(OPENCL_INCLUDEDIR_PC "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
145
146configure_file(OpenCL-Headers.pc.in OpenCL-Headers.pc @ONLY)
147set(pkg_config_location ${CMAKE_INSTALL_DATADIR}/pkgconfig)
148install(
149  FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCL-Headers.pc
150  DESTINATION ${pkg_config_location})
151