xref: /aosp_15_r20/external/OpenCL-CLHPP/tests/CMakeLists.txt (revision 6fee86a4f833e4f32f25770a262884407554133d)
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()