#
#//===----------------------------------------------------------------------===//
#//
#// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
#// See https://llvm.org/LICENSE.txt for license information.
#// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#//
#//===----------------------------------------------------------------------===//
#

# The following micro-tests are small tests to perform on the library just created.
# There are currently five micro-tests:
# (1) test-touch
#  - Compile and run a small program using newly created libomp library
#  - Fails if test-touch.c does not compile or if test-touch.c does not run after compilation
#  - Program dependencies: gcc or g++, grep, bourne shell
#  - Available for all Unix,Mac,Windows builds.  Not available on Intel(R) MIC Architecture builds.
# (2) test-relo
#  - Tests dynamic libraries for position-dependent code (can not have any position dependent code)
#  - Fails if TEXTREL is in output of readelf -d libomp.so command
#  - Program dependencies: readelf, grep, bourne shell
#  - Available for Unix, Intel(R) MIC Architecture dynamic library builds. Not available otherwise.
# (3) test-execstack
#  - Tests if stack is executable
#  - Fails if stack is executable. Should only be readable and writable. Not executable.
#  - Program dependencies: perl, readelf
#  - Available for Unix dynamic library builds. Not available otherwise.
# (4) test-deps
#  - Tests newly created libomp for library dependencies
#  - Fails if sees a dependence not listed in td_exp variable below
#  - Program dependencies: perl, (unix)readelf, (mac)otool[64], (windows)link.exe
#  - Available for Unix,Mac,Windows, Intel(R) MIC Architecture dynamic builds and Windows
#    static builds. Not available otherwise.

# get library location
if(WIN32)
  get_target_property(LIBOMP_OUTPUT_DIRECTORY omp RUNTIME_OUTPUT_DIRECTORY)
  get_target_property(LIBOMPIMP_OUTPUT_DIRECTORY ${LIBOMP_IMP_LIB_TARGET} ARCHIVE_OUTPUT_DIRECTORY)
  if(NOT LIBOMPIMP_OUTPUT_DIRECTORY)
    set(LIBOMPIMP_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  endif()
else()
  get_target_property(LIBOMP_OUTPUT_DIRECTORY omp LIBRARY_OUTPUT_DIRECTORY)
endif()
if(NOT LIBOMP_OUTPUT_DIRECTORY)
  set(LIBOMP_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
endif()

# test-touch
find_program(LIBOMP_SHELL sh)
if(WIN32)
  if(LIBOMP_SHELL)
    set(libomp_test_touch_targets test-touch-md/.success test-touch-mt/.success)
  endif()
  # pick test-touch compiler
  set(libomp_test_touch_compiler ${CMAKE_C_COMPILER})
  # test-touch compilation flags
  libomp_append(libomp_test_touch_cflags /nologo)
  libomp_append(libomp_test_touch_libs ${LIBOMPIMP_OUTPUT_DIRECTORY}/${LIBOMP_IMP_LIB_FILE})
  if(${IA32})
    libomp_append(libomp_test_touch_ldflags /safeseh)
  endif()
else() # (Unix based systems, Intel(R) MIC Architecture, and Mac)
  if(LIBOMP_SHELL)
    set(libomp_test_touch_targets test-touch-rt/.success)
  endif()
  # pick test-touch compiler
  if(${LIBOMP_USE_STDCPPLIB})
    set(libomp_test_touch_compiler ${CMAKE_CXX_COMPILER})
  else()
    set(libomp_test_touch_compiler ${CMAKE_C_COMPILER})
  endif()
  # test-touch compilation flags
  libomp_append(libomp_test_touch_libs "${CMAKE_THREAD_LIBS_INIT}")
  if(${IA32})
    libomp_append(libomp_test_touch_cflags -m32 LIBOMP_HAVE_M32_FLAG)
  endif()
  libomp_append(libomp_test_touch_libs ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE})
  libomp_append(libomp_test_touch_libs "${LIBOMP_HWLOC_LIBRARY}" LIBOMP_USE_HWLOC)
  if(APPLE)
    set(libomp_test_touch_env "DYLD_LIBRARY_PATH=.:${LIBOMP_OUTPUT_DIRECTORY}:$ENV{DYLD_LIBRARY_PATH}")
    libomp_append(libomp_test_touch_ldflags "-Wl,-rpath,${LIBOMP_HWLOC_LIBRARY_DIR}" LIBOMP_USE_HWLOC)
  else()
    set(libomp_test_touch_env "LD_LIBRARY_PATH=.:${LIBOMP_OUTPUT_DIRECTORY}:$ENV{LD_LIBRARY_PATH}")
    libomp_append(libomp_test_touch_ldflags "-Wl,-rpath=${LIBOMP_HWLOC_LIBRARY_DIR}" LIBOMP_USE_HWLOC)
  endif()
endif()
macro(libomp_test_touch_recipe test_touch_dir)
  set(libomp_test_touch_dependencies ${LIBOMP_SRC_DIR}/test-touch.c omp)
  set(libomp_test_touch_exe ${test_touch_dir}/test-touch${CMAKE_EXECUTABLE_SUFFIX})
  if(WIN32)
    if(${RELEASE_BUILD} OR ${RELWITHDEBINFO_BUILD})
      if(${test_touch_dir} MATCHES "test-touch-mt")
        libomp_append(libomp_test_touch_cflags /MT)
      else()
        libomp_append(libomp_test_touch_cflags /MD)
      endif()
    else()
      if(${test_touch_dir} MATCHES "test-touch-mt")
        libomp_append(libomp_test_touch_cflags /MTd)
      else()
        libomp_append(libomp_test_touch_cflags /MDd)
      endif()
    endif()
    set(libomp_test_touch_out_flags -Fe${libomp_test_touch_exe})
    list(APPEND libomp_test_touch_dependencies ompimp)
  else()
    set(libomp_test_touch_out_flags -o ${libomp_test_touch_exe})
  endif()
  add_custom_command(
    OUTPUT  ${test_touch_dir}/.success ${libomp_test_touch_exe}
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_touch_dir}
    COMMAND ${CMAKE_COMMAND} -E remove -f ${test_touch_dir}/*
    COMMAND ${libomp_test_touch_compiler} ${libomp_test_touch_out_flags} ${libomp_test_touch_cflags}
      ${LIBOMP_SRC_DIR}/test-touch.c ${libomp_test_touch_ldflags} ${libomp_test_touch_libs}
    COMMAND ${LIBOMP_SHELL} -c \"${libomp_test_touch_env} ${libomp_test_touch_exe}\"
    COMMAND ${CMAKE_COMMAND} -E touch ${test_touch_dir}/.success
    DEPENDS ${libomp_test_touch_dependencies}
  )
endmacro()
libomp_append(libomp_test_touch_env "KMP_VERSION=1")
add_custom_target(libomp-test-touch DEPENDS ${libomp_test_touch_targets})
set_target_properties(libomp-test-touch PROPERTIES FOLDER "OpenMP/Tests")
if(WIN32)
  libomp_test_touch_recipe(test-touch-mt)
  libomp_test_touch_recipe(test-touch-md)
else()
  libomp_test_touch_recipe(test-touch-rt)
endif()

# test-relo
add_custom_target(libomp-test-relo DEPENDS test-relo/.success)
set_target_properties(libomp-test-relo PROPERTIES FOLDER "OpenMP/Tests")
add_custom_command(
  OUTPUT  test-relo/.success test-relo/readelf.log
  COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-relo
  COMMAND readelf -d ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE} > test-relo/readelf.log
  COMMAND grep -e TEXTREL test-relo/readelf.log \; test $$? -eq 1
  COMMAND ${CMAKE_COMMAND} -E touch test-relo/.success
  DEPENDS omp
)

# test-execstack
add_custom_target(libomp-test-execstack DEPENDS test-execstack/.success)
set_target_properties(libomp-test-execstack PROPERTIES FOLDER "OpenMP/Tests")
add_custom_command(
  OUTPUT  test-execstack/.success
  COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-execstack
  COMMAND ${Python3_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/check-execstack.py
          ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE}
  COMMAND ${CMAKE_COMMAND} -E touch test-execstack/.success
  DEPENDS omp ${LIBOMP_TOOLS_DIR}/check-execstack.py
)

# test-deps
add_custom_target(libomp-test-deps DEPENDS test-deps/.success)
set_target_properties(libomp-test-deps PROPERTIES FOLDER "OpenMP/Tests")
set(libomp_expected_library_deps)
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  set(libomp_expected_library_deps libc.so.7 libthr.so.3 libm.so.5)
  libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC)
elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
  set(libomp_expected_library_deps libc.so.12 libpthread.so.1 libm.so.0)
  libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC)
elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly")
  set(libomp_expected_library_deps libc.so.8 libpthread.so.0 libm.so.4)
  libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC)
elseif(APPLE)
  set(libomp_expected_library_deps /usr/lib/libSystem.B.dylib)
elseif(WIN32)
  set(libomp_expected_library_deps kernel32.dll)
  libomp_append(libomp_expected_library_deps api-ms-win-crt-convert-l1-1-0.dll)
  libomp_append(libomp_expected_library_deps api-ms-win-crt-environment-l1-1-0.dll)
  libomp_append(libomp_expected_library_deps api-ms-win-crt-heap-l1-1-0.dll)
  libomp_append(libomp_expected_library_deps api-ms-win-crt-runtime-l1-1-0.dll)
  libomp_append(libomp_expected_library_deps api-ms-win-crt-stdio-l1-1-0.dll)
  libomp_append(libomp_expected_library_deps api-ms-win-crt-string-l1-1-0.dll)
  libomp_append(libomp_expected_library_deps api-ms-win-crt-utility-l1-1-0.dll)
  libomp_append(libomp_expected_library_deps vcruntime140.dll)
  libomp_append(libomp_expected_library_deps psapi.dll)
else()
  if(${MIC})
    set(libomp_expected_library_deps libc.so.6 libpthread.so.0 libdl.so.2)
    if("${LIBOMP_MIC_ARCH}" STREQUAL "knf")
      libomp_append(libomp_expected_library_deps ld-linux-l1om.so.2)
      libomp_append(libomp_expected_library_deps libgcc_s.so.1)
    elseif("${LIBOMP_MIC_ARCH}" STREQUAL "knc")
      libomp_append(libomp_expected_library_deps ld-linux-k1om.so.2)
    endif()
  else()
    set(libomp_expected_library_deps libdl.so.2 libgcc_s.so.1)
    if(${IA32})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps ld-linux.so.2)
      libomp_append(libomp_expected_library_deps librt.so.1)
    elseif(${INTEL64})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps ld-linux-x86-64.so.2)
      libomp_append(libomp_expected_library_deps librt.so.1)
    elseif(${ARM})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps libffi.so.6)
      libomp_append(libomp_expected_library_deps libffi.so.5)
      libomp_append(libomp_expected_library_deps ld-linux-armhf.so.3)
    elseif(${PPC64})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps ld64.so.1)
    elseif(${MIPS} OR ${MIPS64})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps ld.so.1)
    elseif(${RISCV64})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps ld.so.1)
    elseif(${LOONGARCH64})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps ld.so.1)
    elseif(${S390X})
      libomp_append(libomp_expected_library_deps libc.so.6)
      libomp_append(libomp_expected_library_deps ld.so.1)
    endif()
    libomp_append(libomp_expected_library_deps libpthread.so.0 IF_FALSE STUBS_LIBRARY)
    libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC)
  endif()
  libomp_append(libomp_expected_library_deps libstdc++.so.6 LIBOMP_USE_STDCPPLIB)
  libomp_append(libomp_expected_library_deps libm.so.6 LIBOMP_STATS)
endif()
# Check depends script expects comma separated list
string(REPLACE ";" "," libomp_expected_library_deps "${libomp_expected_library_deps}")
add_custom_command(
  OUTPUT  test-deps/.success
  COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-deps
  COMMAND ${Python3_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/check-depends.py
          --expected="${libomp_expected_library_deps}"
          ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE}
  COMMAND ${CMAKE_COMMAND} -E touch test-deps/.success
  DEPENDS omp ${LIBOMP_TOOLS_DIR}/check-depends.py
)
