1# Add a test for a given source file for each version of OpenCL
2function(add_header_test NAME SOURCE)
3  # Some headers include system files which require anonymous structs
4  # so we cannot test them with /Za:
5  set(TEST_SKIP_ANSI_TESTING
6    cl_d3d10_h cl_d3d11_h cl_dx9_media_sharing_h cl_dx9_media_sharing_intel_h cl_icd_h cl_layer_h)
7  get_filename_component(LANG_DIR "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
8  if(LANG_DIR MATCHES cpp)
9    set(CPP_SOURCE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE}pp")
10    file(RELATIVE_PATH REL_SOURCE_PATH "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../${SOURCE}")
11    file(TO_NATIVE_PATH "${REL_SOURCE_PATH}" NATIVE_SOURCE_PATH)
12    file(WRITE
13      "${CPP_SOURCE_PATH}"
14      "#include \"${NATIVE_SOURCE_PATH}\"\n"
15    )
16    set(SOURCE_PATH "${CPP_SOURCE_PATH}")
17    set(LANG cpp)
18  else()
19    set(SOURCE_PATH "../${SOURCE}")
20    set(LANG c)
21  endif()
22  foreach(VERSION 100 110 120 200 210 220 300)
23    set(TEST_EXE ${NAME}_${LANG}_${VERSION})
24    list(FIND TEST_SKIP_ANSI_TESTING ${NAME} TEST_SKIP_INDEX)
25    if(NOT (${TEST_SKIP_INDEX} GREATER -1 AND MSVC AND CMAKE_C_FLAGS MATCHES "/Za"))
26      add_executable(${TEST_EXE} "${SOURCE_PATH}")
27      target_compile_definitions(${TEST_EXE}
28        PUBLIC -DCL_TARGET_OPENCL_VERSION=${VERSION}
29      )
30      target_include_directories(${TEST_EXE}
31        PUBLIC ${PROJECT_SOURCE_DIR}
32      )
33      add_test(NAME ${TEST_EXE} COMMAND ${TEST_EXE})
34    endif()
35  endforeach(VERSION)
36endfunction(add_header_test)
37
38add_subdirectory(lang_c)
39if(OPENCL_HEADERS_BUILD_CXX_TESTS)
40  enable_language(CXX)
41  add_subdirectory(lang_cpp)
42endif()
43