1*6fee86a4SJeremy Kempcmake_minimum_required(VERSION 3.1) 2*6fee86a4SJeremy Kemp 3*6fee86a4SJeremy Kempproject(OpenCLHeadersCpp 4*6fee86a4SJeremy Kemp VERSION 3.0 5*6fee86a4SJeremy Kemp LANGUAGES CXX # Ideally should be NONE, but GNUInstallDirs detects platform arch using try_compile 6*6fee86a4SJeremy Kemp # https://stackoverflow.com/questions/43379311/why-does-project-affect-cmakes-opinion-on-cmake-sizeof-void-p 7*6fee86a4SJeremy Kemp) 8*6fee86a4SJeremy Kempenable_testing() 9*6fee86a4SJeremy Kemp 10*6fee86a4SJeremy Kempset(CMAKE_CXX_STANDARD 11) 11*6fee86a4SJeremy Kempset(CMAKE_CXX_STANDARD_REQUIRED ON) 12*6fee86a4SJeremy Kemp 13*6fee86a4SJeremy Kempoption(BUILD_DOCS "Build Documentation" ON) 14*6fee86a4SJeremy Kempoption(BUILD_EXAMPLES "Build Examples" ON) 15*6fee86a4SJeremy Kempoption(OPENCL_CLHPP_BUILD_TESTING "Enable support for OpenCL C++ headers testing." OFF) 16*6fee86a4SJeremy Kempset(THREADS_PREFER_PTHREAD_FLAG ON CACHE BOOL 17*6fee86a4SJeremy Kemp "find_package(Threads) preference. Recommendation is to keep default value." 18*6fee86a4SJeremy Kemp) 19*6fee86a4SJeremy Kemp# Legacy helper variables, see later at finding headers and ICD Loader 20*6fee86a4SJeremy Kempset(OPENCL_DIST_DIR "" CACHE PATH "OpenCL source dir (legacy helper var)") 21*6fee86a4SJeremy Kempset(OPENCL_LIB_DIR "${OPENCL_DIST_DIR}/lib" CACHE PATH "OpenCL library dir (legacy helper var)" ) 22*6fee86a4SJeremy Kempset(OPENCL_INCLUDE_DIR "${OPENCL_DIST_DIR}/include" CACHE PATH "OpenCL source dir (legacy helper var)") 23*6fee86a4SJeremy Kemp# Helper vars with names consistent with OpenCL-ICD-Loader's OPENCL_ICD_LOADER_HEADERS_DIR 24*6fee86a4SJeremy Kemp# Default values taken from legacy defaults 25*6fee86a4SJeremy Kempset(OPENCL_CLHPP_HEADERS_DIR "${OPENCL_INCLUDE_DIR}" CACHE PATH "OpenCL headers dir") 26*6fee86a4SJeremy Kempset(OPENCL_CLHPP_LOADER_DIR "${OPENCL_LIB_DIR}" CACHE PATH "OpenCL library dir") 27*6fee86a4SJeremy Kemp 28*6fee86a4SJeremy Kempadd_library(HeadersCpp INTERFACE) 29*6fee86a4SJeremy Kempadd_library(OpenCL::HeadersCpp ALIAS HeadersCpp) 30*6fee86a4SJeremy Kemp 31*6fee86a4SJeremy Kempif(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_CLHPP_BUILD_TESTING) 32*6fee86a4SJeremy Kemp include(CTest) 33*6fee86a4SJeremy Kempendif() 34*6fee86a4SJeremy Kempif((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_CLHPP_BUILD_TESTING) AND BUILD_TESTING) 35*6fee86a4SJeremy Kemp set(CLHPP_BUILD_TESTS ON) 36*6fee86a4SJeremy Kempendif() 37*6fee86a4SJeremy Kemp 38*6fee86a4SJeremy Kemp# In the spirit of backward compatibility, to not break existing build automation 39*6fee86a4SJeremy Kemp# we first check if the helper vars refer to existing files. If yes, use them. 40*6fee86a4SJeremy Kemp# Otherwise search using 3.0 installed CMake Package Configs. 41*6fee86a4SJeremy Kempif(EXISTS "${OPENCL_CLHPP_HEADERS_DIR}/CL/cl.h") 42*6fee86a4SJeremy Kemp if(NOT TARGET OpenCL::Headers) 43*6fee86a4SJeremy Kemp message(STATUS "Defining OpenCL::Headers through OPENCL_INCLUDE_DIR") 44*6fee86a4SJeremy Kemp add_library(OpenCLHeaders INTERFACE) 45*6fee86a4SJeremy Kemp add_library(OpenCL::Headers ALIAS OpenCLHeaders) 46*6fee86a4SJeremy Kemp target_include_directories(OpenCLHeaders INTERFACE ${OPENCL_INCLUDE_DIR}) 47*6fee86a4SJeremy Kemp endif() 48*6fee86a4SJeremy Kempelse() 49*6fee86a4SJeremy Kemp if(NOT TARGET OpenCL::Headers) 50*6fee86a4SJeremy Kemp find_package(OpenCLHeaders REQUIRED) 51*6fee86a4SJeremy Kemp endif() 52*6fee86a4SJeremy Kempendif() 53*6fee86a4SJeremy Kempif(BUILD_EXAMPLES OR CLHPP_BUILD_TESTS) 54*6fee86a4SJeremy Kemp enable_language(C) 55*6fee86a4SJeremy Kemp find_package(Threads REQUIRED) 56*6fee86a4SJeremy Kempendif() 57*6fee86a4SJeremy Kempif(CLHPP_BUILD_TESTS) 58*6fee86a4SJeremy Kemp find_program(RUBY_EXECUTABLE ruby REQUIRED) 59*6fee86a4SJeremy Kempendif() 60*6fee86a4SJeremy Kemp 61*6fee86a4SJeremy Kemptarget_include_directories(HeadersCpp 62*6fee86a4SJeremy Kemp INTERFACE 63*6fee86a4SJeremy Kemp $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> 64*6fee86a4SJeremy Kemp $<INSTALL_INTERFACE:include> 65*6fee86a4SJeremy Kemp) 66*6fee86a4SJeremy Kemptarget_link_libraries(HeadersCpp 67*6fee86a4SJeremy Kemp INTERFACE 68*6fee86a4SJeremy Kemp OpenCL::Headers 69*6fee86a4SJeremy Kemp) 70*6fee86a4SJeremy Kemp 71*6fee86a4SJeremy Kempinstall( 72*6fee86a4SJeremy Kemp TARGETS HeadersCpp 73*6fee86a4SJeremy Kemp EXPORT OpenCLHeadersCppTargets 74*6fee86a4SJeremy Kemp) 75*6fee86a4SJeremy Kemp 76*6fee86a4SJeremy Kempset (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 77*6fee86a4SJeremy Kempinclude(JoinPaths) 78*6fee86a4SJeremy Kemp 79*6fee86a4SJeremy Kempinclude(GNUInstallDirs) 80*6fee86a4SJeremy Kemp 81*6fee86a4SJeremy Kempinstall( 82*6fee86a4SJeremy Kemp DIRECTORY include/CL 83*6fee86a4SJeremy Kemp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 84*6fee86a4SJeremy Kemp) 85*6fee86a4SJeremy Kempexport( 86*6fee86a4SJeremy Kemp EXPORT OpenCLHeadersCppTargets 87*6fee86a4SJeremy Kemp FILE ${PROJECT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppTargets.cmake 88*6fee86a4SJeremy Kemp NAMESPACE OpenCL:: 89*6fee86a4SJeremy Kemp) 90*6fee86a4SJeremy Kempfile( 91*6fee86a4SJeremy Kemp WRITE ${PROJECT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfig.cmake 92*6fee86a4SJeremy Kemp "include(\"\${CMAKE_CURRENT_LIST_DIR}/OpenCLHeadersCppTargets.cmake\")" 93*6fee86a4SJeremy Kemp) 94*6fee86a4SJeremy Kemp 95*6fee86a4SJeremy Kempset(config_package_location ${CMAKE_INSTALL_DATADIR}/cmake/OpenCLHeadersCpp) 96*6fee86a4SJeremy Kempinstall( 97*6fee86a4SJeremy Kemp EXPORT OpenCLHeadersCppTargets 98*6fee86a4SJeremy Kemp FILE OpenCLHeadersCppTargets.cmake 99*6fee86a4SJeremy Kemp NAMESPACE OpenCL:: 100*6fee86a4SJeremy Kemp DESTINATION ${config_package_location} 101*6fee86a4SJeremy Kemp) 102*6fee86a4SJeremy Kempinstall( 103*6fee86a4SJeremy Kemp FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfig.cmake 104*6fee86a4SJeremy Kemp DESTINATION ${config_package_location} 105*6fee86a4SJeremy Kemp) 106*6fee86a4SJeremy Kemp 107*6fee86a4SJeremy Kempunset(CMAKE_SIZEOF_VOID_P) 108*6fee86a4SJeremy Kempinclude(CMakePackageConfigHelpers) 109*6fee86a4SJeremy Kempwrite_basic_package_version_file( 110*6fee86a4SJeremy Kemp ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfigVersion.cmake 111*6fee86a4SJeremy Kemp VERSION ${PROJECT_VERSION} 112*6fee86a4SJeremy Kemp COMPATIBILITY AnyNewerVersion 113*6fee86a4SJeremy Kemp) 114*6fee86a4SJeremy Kempinstall( 115*6fee86a4SJeremy Kemp FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeadersCpp/OpenCLHeadersCppConfigVersion.cmake 116*6fee86a4SJeremy Kemp DESTINATION ${config_package_location} 117*6fee86a4SJeremy Kemp) 118*6fee86a4SJeremy Kemp 119*6fee86a4SJeremy Kempset(UNITY_DIR ${PROJECT_SOURCE_DIR}/external/CMock/vendor/unity CACHE PATH "Unity dir") 120*6fee86a4SJeremy Kempset(CMOCK_DIR ${PROJECT_SOURCE_DIR}/external/CMock CACHE PATH "CMock dir") 121*6fee86a4SJeremy Kemp 122*6fee86a4SJeremy Kempif(BUILD_DOCS) 123*6fee86a4SJeremy Kemp add_subdirectory(docs) 124*6fee86a4SJeremy Kempendif(BUILD_DOCS) 125*6fee86a4SJeremy Kemp 126*6fee86a4SJeremy Kempif(BUILD_EXAMPLES) 127*6fee86a4SJeremy Kemp add_subdirectory(examples) 128*6fee86a4SJeremy Kempendif(BUILD_EXAMPLES) 129*6fee86a4SJeremy Kemp 130*6fee86a4SJeremy Kempif(CLHPP_BUILD_TESTS) 131*6fee86a4SJeremy Kemp add_subdirectory(tests) 132*6fee86a4SJeremy Kempendif(CLHPP_BUILD_TESTS) 133*6fee86a4SJeremy Kemp 134*6fee86a4SJeremy Kempjoin_paths(OPENCLHPP_INCLUDEDIR_PC "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") 135*6fee86a4SJeremy Kemp 136*6fee86a4SJeremy Kempconfigure_file(OpenCL-CLHPP.pc.in OpenCL-CLHPP.pc @ONLY) 137*6fee86a4SJeremy Kempset(pkg_config_location ${CMAKE_INSTALL_DATADIR}/pkgconfig) 138*6fee86a4SJeremy Kempinstall( 139*6fee86a4SJeremy Kemp FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCL-CLHPP.pc 140*6fee86a4SJeremy Kemp DESTINATION ${pkg_config_location}) 141