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