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