1*6fee86a4SJeremy Kempset(OPENCL_HEADERS_INCLUDE_DIR_GENEXPR $<TARGET_PROPERTY:OpenCL::Headers,INTERFACE_INCLUDE_DIRECTORIES>) 2*6fee86a4SJeremy Kemp############################### 3*6fee86a4SJeremy Kemp### ### 4*6fee86a4SJeremy Kemp### Workaround to CMake bug ### 5*6fee86a4SJeremy Kemp### ### 6*6fee86a4SJeremy Kemp############################### 7*6fee86a4SJeremy Kemp# 8*6fee86a4SJeremy Kemp# The generated mocks\Mockcl.h include the OpenCL headers as 9*6fee86a4SJeremy Kemp# 10*6fee86a4SJeremy Kemp# #include "CL/cl_platform.h" 11*6fee86a4SJeremy Kemp# #include "cl.h" 12*6fee86a4SJeremy Kemp# 13*6fee86a4SJeremy Kemp# which requires the tests to not only inherit the INTERFACE_INCLUDE_DIRECTORIES, but also the same dir with 14*6fee86a4SJeremy Kemp# /CL appended at the end. There seems to be a bug in CMake (3.19 even) where if a target has the same genexpr 15*6fee86a4SJeremy Kemp# predicate twice, the second time it always fails. Having both 16*6fee86a4SJeremy Kemp# 17*6fee86a4SJeremy Kemp# $<TARGET_PROPERTY:Headers,INTERFACE_INCLUDE_DIRECTORIES> (invisbly via linking to OpenCL::Headers) 18*6fee86a4SJeremy Kemp# $<TARGET_PROPERTY:Headers,INTERFACE_INCLUDE_DIRECTORIES>/CL 19*6fee86a4SJeremy Kemp# 20*6fee86a4SJeremy Kemp# means we can only get one of these switches. We forcibly go around it by extracting the value manually. 21*6fee86a4SJeremy Kemp# 22*6fee86a4SJeremy Kemp# Bug ticket: https://gitlab.kitware.com/cmake/cmake/-/issues/22735 23*6fee86a4SJeremy Kemp# 24*6fee86a4SJeremy Kemp# ticket closed with by-design. We should find a way to fix the Mock tests to not consume the public API using 25*6fee86a4SJeremy Kemp# mixed style includes. 26*6fee86a4SJeremy Kempget_target_property(OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES OpenCL::Headers INTERFACE_INCLUDE_DIRECTORIES) 27*6fee86a4SJeremy Kemp 28*6fee86a4SJeremy Kempif(OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES MATCHES "BUILD_INTERFACE") 29*6fee86a4SJeremy Kemp # When building OpenCL::Headers is part of this build (OpenCL-SDK), we have a property like for eg. 30*6fee86a4SJeremy Kemp # $<BUILD_INTERFACE:C:/OpenCL-SDK/external/OpenCL-Headers>;$<INSTALL_INTERFACE:include> 31*6fee86a4SJeremy Kemp # and need to touch up this property. We want the BUILD_INTERFACE part only. 32*6fee86a4SJeremy Kemp # When OpenCL::Headers is consumed through a Package Config file (OpenCL-CLHPP), this property 33*6fee86a4SJeremy Kemp # no longer holds unevaluated generator expressions. 34*6fee86a4SJeremy Kemp string(REGEX MATCHALL 35*6fee86a4SJeremy Kemp [[\$<BUILD_INTERFACE:(.*)>;]] 36*6fee86a4SJeremy Kemp OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES 37*6fee86a4SJeremy Kemp "${OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES}") 38*6fee86a4SJeremy Kemp set(OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_MATCH_1}") 39*6fee86a4SJeremy Kempendif() 40*6fee86a4SJeremy Kemp# End of workaround 41*6fee86a4SJeremy Kemp 42*6fee86a4SJeremy Kempadd_custom_command( 43*6fee86a4SJeremy Kemp OUTPUT stripped/cl.h stripped/cl_ext.h stripped/cl_gl.h 44*6fee86a4SJeremy Kemp COMMAND ${CMAKE_COMMAND} -E make_directory stripped 45*6fee86a4SJeremy Kemp COMMAND ${CMAKE_COMMAND} -E make_directory mocks 46*6fee86a4SJeremy Kemp COMMAND ${CMAKE_COMMAND} -D INPUT="${OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES}/CL/cl.h" -D OUTPUT="stripped/cl.h" -P ${CMAKE_CURRENT_SOURCE_DIR}/strip_defines.cmake 47*6fee86a4SJeremy Kemp COMMAND ${CMAKE_COMMAND} -D INPUT="${OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES}/CL/cl_ext.h" -D OUTPUT="stripped/cl_ext.h" -P ${CMAKE_CURRENT_SOURCE_DIR}/strip_defines.cmake 48*6fee86a4SJeremy Kemp COMMAND ${CMAKE_COMMAND} -D INPUT="${OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES}/CL/cl_gl.h" -D OUTPUT="stripped/cl_gl.h" -P ${CMAKE_CURRENT_SOURCE_DIR}/strip_defines.cmake 49*6fee86a4SJeremy Kemp COMMENT "Stripping defines from cl.h, cl_ext.h and cl_gl.h" 50*6fee86a4SJeremy Kemp DEPENDS ${OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES}/CL/cl.h strip_defines.cmake) 51*6fee86a4SJeremy Kemp 52*6fee86a4SJeremy Kempadd_custom_target( 53*6fee86a4SJeremy Kemp strip_cl_defines ALL 54*6fee86a4SJeremy Kemp DEPENDS stripped/cl.h 55*6fee86a4SJeremy Kemp DEPENDS stripped/cl_ext.h 56*6fee86a4SJeremy Kemp DEPENDS stripped/cl_gl.h 57*6fee86a4SJeremy Kemp SOURCES strip_defines.cmake) 58*6fee86a4SJeremy Kemp 59*6fee86a4SJeremy Kempadd_custom_command( 60*6fee86a4SJeremy Kemp OUTPUT mocks/Mockcl.c mocks/Mockcl.h mocks/Mockcl_ext.c mocks/Mockcl_ext.h mocks/Mockcl_gl.c mocks/Mockcl_gl.h 61*6fee86a4SJeremy Kemp COMMAND ${RUBY_EXECUTABLE} ${CMOCK_DIR}/lib/cmock.rb -o${CMAKE_CURRENT_SOURCE_DIR}/cmock.yml stripped/cl.h 62*6fee86a4SJeremy Kemp COMMAND ${RUBY_EXECUTABLE} ${CMOCK_DIR}/lib/cmock.rb -o${CMAKE_CURRENT_SOURCE_DIR}/cmock.yml stripped/cl_ext.h 63*6fee86a4SJeremy Kemp COMMAND ${RUBY_EXECUTABLE} ${CMOCK_DIR}/lib/cmock.rb -o${CMAKE_CURRENT_SOURCE_DIR}/cmock.yml stripped/cl_gl.h 64*6fee86a4SJeremy Kemp COMMENT "Generating mocks" 65*6fee86a4SJeremy Kemp DEPENDS stripped/cl.h stripped/cl_ext.h stripped/cl_gl.h cmock.yml) 66*6fee86a4SJeremy Kemp 67*6fee86a4SJeremy Kempadd_custom_target( 68*6fee86a4SJeremy Kemp mock_cl_header ALL 69*6fee86a4SJeremy Kemp DEPENDS mocks/Mockcl.c mocks/Mockcl.h 70*6fee86a4SJeremy Kemp DEPENDS mocks/Mockcl_ext.c mocks/Mockcl_ext.h 71*6fee86a4SJeremy Kemp DEPENDS mocks/Mockcl_gl.c mocks/Mockcl_gl.h 72*6fee86a4SJeremy Kemp SOURCES cmock.yml) 73*6fee86a4SJeremy Kemp 74*6fee86a4SJeremy Kempadd_dependencies(mock_cl_header strip_cl_defines) 75*6fee86a4SJeremy Kemp 76*6fee86a4SJeremy Kempadd_custom_command( 77*6fee86a4SJeremy Kemp OUTPUT test_openclhpp_Runner.c 78*6fee86a4SJeremy Kemp COMMAND ${RUBY_EXECUTABLE} ${UNITY_DIR}/auto/generate_test_runner.rb test_openclhpp.cpp cmock.yml ${CMAKE_CURRENT_BINARY_DIR}/test_openclhpp_Runner.c 79*6fee86a4SJeremy Kemp WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 80*6fee86a4SJeremy Kemp COMMENT "Generating test runner" 81*6fee86a4SJeremy Kemp DEPENDS test_openclhpp.cpp cmock.yml) 82*6fee86a4SJeremy Kemp 83*6fee86a4SJeremy Kempadd_custom_target( 84*6fee86a4SJeremy Kemp openclhpp_runner ALL 85*6fee86a4SJeremy Kemp DEPENDS test_openclhpp_Runner.c 86*6fee86a4SJeremy Kemp SOURCES test_openclhpp.cpp) 87*6fee86a4SJeremy Kemp 88*6fee86a4SJeremy Kempif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?Clang") 89*6fee86a4SJeremy Kemp add_compile_options(-Wno-deprecated-declarations) 90*6fee86a4SJeremy Kempelseif(MSVC) 91*6fee86a4SJeremy Kemp add_compile_options(/wd4996) 92*6fee86a4SJeremy Kempendif() 93*6fee86a4SJeremy Kemp 94*6fee86a4SJeremy Kempadd_definitions(-DCL_TARGET_OPENCL_VERSION=300) 95*6fee86a4SJeremy Kempadd_definitions(-DCL_EXPERIMENTAL) 96*6fee86a4SJeremy Kemp 97*6fee86a4SJeremy Kempadd_definitions(-DUNITY_SUPPORT_64) 98*6fee86a4SJeremy Kempif( CMAKE_SIZEOF_VOID_P EQUAL 8 ) 99*6fee86a4SJeremy Kemp add_definitions(-DUNITY_POINTER_WIDTH=64) 100*6fee86a4SJeremy Kemp add_definitions("-DCMOCK_MEM_PTR_AS_INT=unsigned long long") 101*6fee86a4SJeremy Kemp add_definitions(-DCMOCK_MEM_ALIGN=3) 102*6fee86a4SJeremy Kempendif() 103*6fee86a4SJeremy Kempif( CMAKE_SIZEOF_LONG EQUAL 8 ) 104*6fee86a4SJeremy Kemp add_definitions(-DUNITY_LONG_WIDTH=64) 105*6fee86a4SJeremy Kempendif() 106*6fee86a4SJeremy Kemp 107*6fee86a4SJeremy Kempset(TEST_HEADERS 108*6fee86a4SJeremy Kemp ${PROJECT_SOURCE_DIR}/include/CL/opencl.hpp 109*6fee86a4SJeremy Kemp mocks/Mockcl.h 110*6fee86a4SJeremy Kemp mocks/Mockcl_ext.h 111*6fee86a4SJeremy Kemp mocks/Mockcl_gl.h) 112*6fee86a4SJeremy Kemp 113*6fee86a4SJeremy Kempset(TEST_SOURCES 114*6fee86a4SJeremy Kemp ${CMAKE_CURRENT_BINARY_DIR}/test_openclhpp_Runner.c 115*6fee86a4SJeremy Kemp test_openclhpp.cpp 116*6fee86a4SJeremy Kemp ${CMAKE_CURRENT_BINARY_DIR}/mocks/Mockcl.c 117*6fee86a4SJeremy Kemp ${CMAKE_CURRENT_BINARY_DIR}/mocks/Mockcl_ext.c 118*6fee86a4SJeremy Kemp ${CMAKE_CURRENT_BINARY_DIR}/mocks/Mockcl_gl.c 119*6fee86a4SJeremy Kemp ${CMOCK_DIR}/src/cmock.c 120*6fee86a4SJeremy Kemp ${UNITY_DIR}/src/unity.c) 121*6fee86a4SJeremy Kemp 122*6fee86a4SJeremy Kemp# TODO enable testing for OpenCL 1.0 and 1.1 123*6fee86a4SJeremy Kempforeach(VERSION 120 200 210 220 300) 124*6fee86a4SJeremy Kemp foreach(OPTION "" CL_HPP_ENABLE_EXCEPTIONS CL_HPP_ENABLE_SIZE_T_COMPATIBILITY CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY CL_HPP_CL_1_2_DEFAULT_BUILD CL_HPP_USE_CL_SUB_GROUPS_KHR CL_HPP_USE_IL_KHR) 125*6fee86a4SJeremy Kemp if(OPTION STREQUAL "") 126*6fee86a4SJeremy Kemp # The empty string means we're not setting any special option. 127*6fee86a4SJeremy Kemp set(UNDERSCORE_OPTION "${OPTION}") 128*6fee86a4SJeremy Kemp set(DEFINE_OPTION "") 129*6fee86a4SJeremy Kemp else() 130*6fee86a4SJeremy Kemp set(UNDERSCORE_OPTION "_${OPTION}") 131*6fee86a4SJeremy Kemp set(DEFINE_OPTION "-D${OPTION}") 132*6fee86a4SJeremy Kemp endif() 133*6fee86a4SJeremy Kemp 134*6fee86a4SJeremy Kemp set(TEST_EXE test_openclhpp_${VERSION}${UNDERSCORE_OPTION}) 135*6fee86a4SJeremy Kemp add_executable(${TEST_EXE} ${TEST_SOURCES}) #${TEST_HEADERS}) 136*6fee86a4SJeremy Kemp target_link_libraries(${TEST_EXE} 137*6fee86a4SJeremy Kemp PRIVATE 138*6fee86a4SJeremy Kemp OpenCL::HeadersCpp 139*6fee86a4SJeremy Kemp OpenCL::Headers 140*6fee86a4SJeremy Kemp Threads::Threads 141*6fee86a4SJeremy Kemp ) 142*6fee86a4SJeremy Kemp target_include_directories(${TEST_EXE} 143*6fee86a4SJeremy Kemp PRIVATE 144*6fee86a4SJeremy Kemp ${CMAKE_CURRENT_BINARY_DIR}/mocks 145*6fee86a4SJeremy Kemp 146*6fee86a4SJeremy Kemp ${OPENCL_HEADERS_INTERFACE_INCLUDE_DIRECTORIES}/CL 147*6fee86a4SJeremy Kemp #${OPENCL_HEADERS_INCLUDE_DIR_GENEXPR}/CL 148*6fee86a4SJeremy Kemp 149*6fee86a4SJeremy Kemp ${UNITY_DIR}/src 150*6fee86a4SJeremy Kemp ${CMOCK_DIR}/src 151*6fee86a4SJeremy Kemp ) 152*6fee86a4SJeremy Kemp target_compile_definitions(${TEST_EXE} 153*6fee86a4SJeremy Kemp PUBLIC -DCL_HPP_TARGET_OPENCL_VERSION=${VERSION} ${DEFINE_OPTION} 154*6fee86a4SJeremy Kemp ) 155*6fee86a4SJeremy Kemp add_dependencies(${TEST_EXE} 156*6fee86a4SJeremy Kemp strip_cl_defines 157*6fee86a4SJeremy Kemp mock_cl_header 158*6fee86a4SJeremy Kemp openclhpp_runner 159*6fee86a4SJeremy Kemp ) 160*6fee86a4SJeremy Kemp add_test(NAME ${TEST_EXE} COMMAND ${TEST_EXE}) 161*6fee86a4SJeremy Kemp endforeach(OPTION) 162*6fee86a4SJeremy Kempendforeach(VERSION) 163*6fee86a4SJeremy Kemp 164*6fee86a4SJeremy Kempif(NOT TARGET OpenCL::openCL) 165*6fee86a4SJeremy Kemp find_package(OpenCLICDLoader) 166*6fee86a4SJeremy Kempendif() 167*6fee86a4SJeremy Kempif(TARGET OpenCL::OpenCL) 168*6fee86a4SJeremy Kemp # TODO enable testing for OpenCL 1.0 and 1.1 169*6fee86a4SJeremy Kemp foreach(MINVERSION 120 200 210 220 300) 170*6fee86a4SJeremy Kemp foreach(TARGETVERSION 120 200 210 220 300) 171*6fee86a4SJeremy Kemp if(NOT (${MINVERSION} GREATER ${TARGETVERSION})) 172*6fee86a4SJeremy Kemp set(TEST_EXE test_openclhpp_version_min_${MINVERSION}_target_${TARGETVERSION}) 173*6fee86a4SJeremy Kemp add_executable(${TEST_EXE} test_versions.cpp) 174*6fee86a4SJeremy Kemp target_compile_definitions(${TEST_EXE} PUBLIC 175*6fee86a4SJeremy Kemp CL_HPP_MINIMUM_OPENCL_VERSION=${MINVERSION} 176*6fee86a4SJeremy Kemp CL_HPP_TARGET_OPENCL_VERSION=${TARGETVERSION}) 177*6fee86a4SJeremy Kemp target_link_libraries(${TEST_EXE} PRIVATE 178*6fee86a4SJeremy Kemp OpenCL::HeadersCpp 179*6fee86a4SJeremy Kemp OpenCL::Headers 180*6fee86a4SJeremy Kemp OpenCL::OpenCL) 181*6fee86a4SJeremy Kemp add_test(NAME ${TEST_EXE} COMMAND ${TEST_EXE}) 182*6fee86a4SJeremy Kemp endif() 183*6fee86a4SJeremy Kemp endforeach() 184*6fee86a4SJeremy Kemp endforeach() 185*6fee86a4SJeremy Kempendif()