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