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