| ##===- SingleMultiSource.cmake --------------------------------------------===## |
| # |
| # This defines functions to be used by the SingleSource and MultiSource |
| # directories. This style of defining benchmarks is considered obsolete now |
| # and it is recommended to only use the functions in TestSuite.cmake and |
| # TestFile.cmake instead. |
| # |
| # Defines helpers to add executables and tests. The entry points to this |
| # file are: |
| # `llvm_singlesource([PREFIX p])`, and |
| # `llvm_multisource()` |
| # |
| # Following convenience functions provide shortcuts for common test cases: |
| # |
| # llvm_singlesource([PREFIX p]) |
| # |
| # Invokes llvm_test_executable() for each c/c++ source file. If |
| # 'sources is emptyno sources are specified, creates test executables |
| # for all C/C++ files in current directory. |
| # Passes optional PREFIX parameter to llvm_test_executable(). |
| # |
| # llvm_multisource(target) |
| # Invokes llvm_test_executable(${target} [sources...]) |
| # |
| ##===----------------------------------------------------------------------===## |
| |
| include(TestSuite) |
| |
| # Configure the current directory as a SingleSource subdirectory - i.e. every |
| # file in *.{c,cpp,cc} is treated as its own test. |
| function(llvm_singlesource) |
| cmake_parse_arguments(_LSARG "" "PREFIX" "" ${ARGN}) |
| if(DEFINED Source) |
| set(sources ${Source}) |
| else() |
| file(GLOB sources *.c *.cpp *.cc *.f *.F *.f90 *.F90) |
| endif() |
| foreach(source ${sources}) |
| basename(name ${source}) |
| set(_target ${_LSARG_PREFIX}${name}) |
| llvm_test_executable_no_test(${_target} ${source}) |
| set_property(TARGET ${_target} PROPERTY TEST_NAME ${name}) |
| llvm_test_traditional(${_target}) |
| llvm_add_test_for_target(${_target}) |
| endforeach() |
| endfunction() |
| |
| # Configure the current directory as a MultiSource subdirectory - i.e. there is |
| # one test and it consists of all sources in the directory (or a curated list, |
| # if Source is defined). |
| function(llvm_multisource target) |
| set(sources ${ARGN}) |
| if(NOT sources) |
| file(GLOB sources *.c *.cpp *.cc *.f *.F *.f90 *.F90) |
| endif() |
| |
| llvm_test_executable_no_test(${target} ${sources}) |
| llvm_test_traditional(${target}) |
| llvm_add_test_for_target(${target}) |
| endfunction() |
| |
| macro(llvm_test_verify_hash_program_output _file) |
| llvm_test_verify(WORKDIR ${CMAKE_CURRENT_BINARY_DIR} |
| ${CMAKE_BINARY_DIR}/tools/HashProgramOutput.sh ${_file} |
| ) |
| endmacro() |
| |
| # Sets Var to ${name} with directory and shortest extension removed. |
| macro(basename Var name) |
| # strip directory name |
| get_filename_component(_filename ${name} NAME) |
| # remove shortest extension. |
| string(REGEX REPLACE "\\.[^.]*$" "" ${Var} ${_filename}) |
| endmacro() |
| |
| # Traditionally CMakeLists.txt files would set RUN_OPTIONS, SMALL_PROBLEM_SIZE, |
| # HASH_PROGRAM_OUTPUT, etc. |
| # Create llvm_test_run() and llvm_test_verify() invocation for that. |
| function(llvm_test_traditional target) |
| get_property(name TARGET ${target} PROPERTY TEST_NAME) |
| if(NOT name) |
| set(name ${target}) |
| endif() |
| |
| # Always run in the same directory as the executable |
| list(INSERT RUN_OPTIONS 0 WORKDIR ${CMAKE_CURRENT_BINARY_DIR}) |
| llvm_test_run(${RUN_OPTIONS}) |
| |
| # Hash if we've been asked to. |
| if(HASH_PROGRAM_OUTPUT) |
| llvm_test_verify_hash_program_output(%o) |
| endif() |
| |
| # Find the reference output file key name. |
| if(NOT NO_REFERENCE_OUTPUT) |
| if(SMALL_PROBLEM_SIZE) |
| set(SIZE_SUFFIX small) |
| elseif(LARGE_PROBLEM_SIZE) |
| set(SIZE_SUFFIX large) |
| else() |
| set(SIZE_SUFFIX) |
| endif() |
| |
| if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${ENDIAN}-endian.${SIZE_SUFFIX}) |
| set(REFERENCE_OUTPUT ${name}.reference_output.${ENDIAN}-endian.${SIZE_SUFFIX}) |
| elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${SIZE_SUFFIX}) |
| set(REFERENCE_OUTPUT ${name}.reference_output.${SIZE_SUFFIX}) |
| elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${ENDIAN}-endian) |
| set(REFERENCE_OUTPUT ${name}.reference_output.${ENDIAN}-endian) |
| elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output) |
| set(REFERENCE_OUTPUT ${name}.reference_output) |
| else() |
| message("-- No reference output found for test ${name}") |
| endif() |
| endif() |
| |
| if(REFERENCE_OUTPUT) |
| set(DIFFPROG ${FPCMP}) |
| if(FP_TOLERANCE) |
| set(DIFFPROG "${DIFFPROG} -r ${FP_TOLERANCE}") |
| endif() |
| if(FP_ABSTOLERANCE) |
| set(DIFFPROG "${DIFFPROG} -a ${FP_ABSTOLERANCE}") |
| endif() |
| llvm_test_verify(WORKDIR ${CMAKE_CURRENT_BINARY_DIR} |
| ${DIFFPROG} %o ${REFERENCE_OUTPUT} |
| ) |
| llvm_test_data(${target} ${REFERENCE_OUTPUT}) |
| endif() |
| set(TESTSCRIPT "${TESTSCRIPT}" PARENT_SCOPE) |
| endfunction() |