#
# Copyright(c) 2021 ZettaScale Technology and others
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
# v. 1.0 which is available at
# http://www.eclipse.org/org/documents/edl-v10.php.
#
# SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
#
set(_c_compiler "$ENV{CC}")
set(_idl_compiler "$ENV{IDLC}")
if(NOT _c_compiler)
message(FATAL_ERROR "C compiler not set")
endif()
if(NOT _idl_compiler)
message(FATAL_ERROR "IDL compiler not set")
endif()
if(WIN32)
set(_separator ";")
else()
set(_separator ":")
endif()
foreach(_path $ENV{TEST_INCLUDE_PATHS})
if(_include_paths)
set(_include_paths "${_include_paths}${_separator}${_path}")
else()
set(_include_paths "${_path}")
endif()
endforeach()
# set compiler specific values
if(_c_compiler MATCHES "cl\\.exe$")
set(ENV{INCLUDE} "${_include_paths}")
set(ENV{PATH} "$ENV{PATH};$ENV{CDDS_BIN_PATH}")
set(_output_flag "/Fe")
set(_lib_path "/link /LIBPATH:\"$ENV{CDDS_LIB_PATH}\"")
foreach(_path $ENV{TEST_LIB_PATHS})
set(_lib_path "${_lib_path} /LIBPATH:\"${_path}\"")
endforeach()
set(_lib "ddsc.lib")
set(_fdbg "/Zi")
set(_fwarn "/W3")
set(_fwerr "/WX")
else()
set(ENV{C_INCLUDE_PATH} "${_include_paths}")
set(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}:$ENV{CDDS_LIB_PATH}")
set(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}:$ENV{CDDS_LIB_PATH}")
set(_output_flag "-o")
set(_lib_path "")
if(APPLE)
list(APPEND _lib_path "-rpath" "$ENV{CDDS_LIB_PATH}")
endif()
set(_lib "-lddsc")
set(_fdbg "-g")
set(_fwarn "-Wall")
set(_fwerr "-Werror")
if(APPLE)
set(_fsysroot "-isysroot$ENV{OSX_SYSROOT}") # no space after isysroot because option in placed in quotes
endif()
foreach(san $ENV{SANITIZER})
if(san STREQUAL "address")
set(_fnofp "-fno-omit-frame-pointer")
endif()
if(san AND NOT san STREQUAL "none")
set(_fsan "-fsanitize=${san}")
endif()
endforeach()
endif()
# get list of sources from argument list
set(_skip_next FALSE)
foreach(_argno RANGE 1 ${CMAKE_ARGC}) # skip executable
if(_skip_next)
set(_skip_next FALSE)
continue()
endif()
set(_arg "${CMAKE_ARGV${_argno}}")
if(_arg MATCHES "^-P")
set(_skip_next TRUE)
else()
list(APPEND _sources "${_arg}")
endif()
endforeach()
if(NOT _sources)
message(FATAL_ERROR "no source files specified")
endif()
foreach(_source ${_sources})
get_filename_component(_base ${_source} NAME_WE)
set(_main $ENV{MAINC})
set(_base_dir ${CMAKE_CURRENT_BINARY_DIR}/${_base})
set(_type ${_base_dir}/${_base}.fn.c)
set(_c ${_base_dir}/${_base}.c)
file(MAKE_DIRECTORY ${_base_dir})
configure_file(${_source} ${_type})
# idl compile the idl file
# FIXME: temporary disable leak checking for tests with recursive types
if (${_source} MATCHES ".*_r[.]idl")
set(ENV{ASAN_OPTIONS} "detect_leaks=0")
endif()
if($ENV{HAS_TYPE_META})
set(_disable_type_meta_option "-t")
endif()
execute_process(
COMMAND ${_idl_compiler} ${_disable_type_meta_option} ${_source} # FIXME: generating type meta-data disabled because recursive types are not supported yet
COMMAND_ECHO STDOUT
WORKING_DIRECTORY ${_base_dir}
RESULT_VARIABLE _result)
if(NOT _result EQUAL "0")
message(FATAL_ERROR "Cannot transpile ${_source} to source code")
endif()
# FIXME: re-enable leak checking
if (${_source} MATCHES ".*_r[.]idl")
unset(ENV{ASAN_OPTIONS})
endif()
# compile and link c files
execute_process(
COMMAND ${_c_compiler} ${_fdbg} ${_fwarn} ${_fwerr} ${_fnofp} ${_fsan} ${_fsysroot} ${_output_flag}${_base} ${_main} ${_type} ${_c} ${_lib} ${_lib_path}
COMMAND_ECHO STDOUT
WORKING_DIRECTORY ${_base_dir}
RESULT_VARIABLE _result)
if(NOT _result EQUAL "0")
message(FATAL_ERROR "Cannot compile ${_source}")
endif()
# execute test process
execute_process(
COMMAND ${_base_dir}/${_base}
COMMAND_ECHO STDOUT
RESULT_VARIABLE _result
ERROR_VARIABLE _error)
if(NOT _result EQUAL "0")
message(FATAL_ERROR "Test failed ${_source}: ${_result} ${_error}")
endif()
endforeach()