[test-suite] r251431 - [test-suite] Introduce a new CMake+LIT based harness

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 27 12:09:59 PDT 2015


On Tue, Oct 27, 2015 at 11:15 AM, James Molloy via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: jamesm
> Date: Tue Oct 27 13:15:37 2015
> New Revision: 251431
>
> URL: http://llvm.org/viewvc/llvm-project?rev=251431&view=rev
> Log:
> [test-suite] Introduce a new CMake+LIT based harness
>

We have a lot of layers, alternatives, etc, in the test-suite already - do
you have a plan/timeline for removing all that cruft once this solution is
baked?


>
> This introduces a replacement for the Makefile based build system. This
> replacement build system uses CMake for configuring and compiling the
> tests, and LIT for running them. LIT will report both compile and execution
> times as metrics, available by using the '-o' option to output JSON or '-v'
> (without '-s').
>
> The advantages of this setup are:
>   * Use of the same technologies used in LLVM itself means there's more
> expertise available to debug, fix and extend, and fewer disparate command
> line flags to remember.
>   * A common-off-the-shelf solution means there's much less custom code to
> maintain, only glue.
>   * More readable output by default, more debuggable by far.
>   * The ability to run just one test, quickly and easily.
>   * The ability to perform test repeats without cleaning and recompiling
> first.
>   * Because the command line is simple, LNT is not required to run a test.
>
> The disadvantages are:
>   * Not all of the features in the Makefile system are supported or are
> going to be. For example, llvm-gcc support, compiling with opt & llc. Clang
> is stable and expected now - we don't need these workarounds.
>
> This commit introduces the CMake and LIT glue and a python script that can
> parse all the Makefiles in SingleSource & MultiSource and can generate
> equivalent CMakeLists.txt. The intention is that this is run once and the
> resulting files checked in then never used again.
>
> With this script run, the entire test-suite builds and runs. Example
> command lines:
>
>   $ mkdir build; cd build
>   $ cmake -DCMAKE_C_COMPILER=/path/to/my/clang .. # CMake finds clang++
> and introspects the target OS/arch/endianness
>   $ make -j12
>   $ llvm-lit -sv .
>
> Ninja also works, but the way the ninja makefiles are generated means
> there is no way to build all tests in an arbitrary subtree (as LNT's
> --only-test does). With ninja you can build all tests or a single test.
>
> All feedback welcome!
>
> Added:
>     test-suite/trunk/CMakeLists.txt
>     test-suite/trunk/cmake/
>     test-suite/trunk/cmake/lit-test-template.in
>     test-suite/trunk/cmake/modules/
>     test-suite/trunk/cmake/modules/DetectArchitecture.c
>     test-suite/trunk/cmake/modules/DetectArchitecture.cmake
>     test-suite/trunk/cmake/modules/FindYACC.cmake
>     test-suite/trunk/cmake/modules/MakefileFunctions.cmake
>     test-suite/trunk/cmake/modules/SingleMultiSource.cmake
>     test-suite/trunk/lit.cfg
>     test-suite/trunk/tools/CMakeLists.txt
>
> Added: test-suite/trunk/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/CMakeLists.txt?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/CMakeLists.txt (added)
> +++ test-suite/trunk/CMakeLists.txt Tue Oct 27 13:15:37 2015
> @@ -0,0 +1,72 @@
> +cmake_minimum_required(VERSION 3.2)
> +
> +# The test-suite is designed to be built in release mode anyway and
> +# falls over unless -DNDEBUG is set.
> +if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
> +  message(STATUS "No build type selected, defaulting to Release")
> +  set(CMAKE_BUILD_TYPE "Release")
> +endif()
> +
> +add_definitions(-DNDEBUG)
> +
> +# Let's make sure lit output is pretty.
> +if(CMAKE_VERSION VERSION_LESS 3.1.20141117)
> +  set(cmake_3_2_USES_TERMINAL)
> +else()
> +  set(cmake_3_2_USES_TERMINAL USES_TERMINAL)
> +endif()
> +
> +project(test-suite C CXX)
> +
> +# Add path for custom modules
> +set(CMAKE_MODULE_PATH
> +  ${CMAKE_MODULE_PATH}
> +  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
> +  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
> +  )
> +
> +# Sanity check our source directory to make sure that we are not trying to
> +# generate an in-tree build (unless on MSVC_IDE, where it is ok), and to
> make
> +# sure that we don't have any stray generated files lying around in the
> tree
> +# (which would end up getting picked up by header search, instead of the
> correct
> +# versions).
> +if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
> +  message(FATAL_ERROR "In-source builds are not allowed.
> +CMake would overwrite the makefiles distributed with LLVM.
> +Please create a directory and run cmake from there, passing the path
> +to this source directory as the last argument.
> +This process created the file `CMakeCache.txt' and the directory
> `CMakeFiles'.
> +Please delete them.")
> +endif()
> +
> +include(MakefileFunctions)
> +include(SingleMultiSource)
> +find_package(YACC)
> +find_package(TCL)
> +
> +if(NOT DEFINED TARGET_OS)
> +  message(STATUS "Check target operating system - ${CMAKE_SYSTEM_NAME}")
> +  set(TARGET_OS ${CMAKE_SYSTEM_NAME})
> +endif()
> +if(NOT DEFINED ARCH)
> +  include(DetectArchitecture)
> +  detect_architecture(ARCH)
> +endif()
> +if(NOT DEFINED ENDIAN)
> +  include(TestBigEndian)
> +  test_big_endian(IS_BIGENDIAN)
> +  if(IS_BIGENDIAN)
> +    set(ENDIAN "big")
> +  else()
> +    set(ENDIAN "little")
> +  endif()
> +endif()
> +
> +add_subdirectory(tools)
> +
> +# Now that the tools have been created, use tools/timeit to time all
> other compilations.
> +set(CMAKE_C_COMPILE_OBJECT "${CMAKE_BINARY_DIR}/tools/timeit --summary
> <OBJECT>.time ${CMAKE_C_COMPILE_OBJECT}")
> +set(CMAKE_CXX_COMPILE_OBJECT "${CMAKE_BINARY_DIR}/tools/timeit --summary
> <OBJECT>.time ${CMAKE_CXX_COMPILE_OBJECT}")
> +
> +add_subdirectory(SingleSource)
> +add_subdirectory(MultiSource)
>
> Added: test-suite/trunk/cmake/lit-test-template.in
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/cmake/lit-test-template.in?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/cmake/lit-test-template.in (added)
> +++ test-suite/trunk/cmake/lit-test-template.in Tue Oct 27 13:15:37 2015
> @@ -0,0 +1,3 @@
> +; RUN: ${RUNUNDER} ${CMAKE_SOURCE_DIR}/RunSafely.sh -t ${TIMEIT} 7200
> ${STDIN_FILENAME} %t ${CMAKE_CURRENT_BINARY_DIR}/${exename} ${RUN_OPTIONS}
> +; RUN: ${PROGRAM_OUTPUT_FILTER} %t
> +; RUN: ${DIFFPROG} %t ${REFERENCE_OUTPUT}
>
> Added: test-suite/trunk/cmake/modules/DetectArchitecture.c
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/cmake/modules/DetectArchitecture.c?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/cmake/modules/DetectArchitecture.c (added)
> +++ test-suite/trunk/cmake/modules/DetectArchitecture.c Tue Oct 27
> 13:15:37 2015
> @@ -0,0 +1,23 @@
> +#if defined(__aarch64__)
> +const char *str = "ARCHITECTURE IS AArch64";
> +#elif defined(__arm__)
> +const char *str = "ARCHITECTURE IS ARM";
> +#elif defined(__alpha__)
> +const char *str = "ARCHITECTURE IS Alpha";
> +#elif defined(__mips__)
> +const char *str = "ARCHITECTURE IS Mips";
> +#elif defined(__powerpc__) || defined(__ppc__) || defined(__power__)
> +const char *str = "ARCHITECTURE IS PowerPC";
> +#elif defined(__sparc__)
> +const char *str = "ARCHITECTURE IS Sparc";
> +#elif defined(__xcore__)
> +const char *str = "ARCHITECTURE IS XCore";
> +#elif defined(__i386__) || defined(__x86_64__)
> +const char *str = "ARCHITECTURE IS x86";
> +#endif
> +
> +int main(int argc, char **argv) {
> +    int require = str[argc];
> +    (void)argv;
> +    return require;
> +}
>
> Added: test-suite/trunk/cmake/modules/DetectArchitecture.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/cmake/modules/DetectArchitecture.cmake?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/cmake/modules/DetectArchitecture.cmake (added)
> +++ test-suite/trunk/cmake/modules/DetectArchitecture.cmake Tue Oct 27
> 13:15:37 2015
> @@ -0,0 +1,35 @@
> +##===- DetectArchitecture.cmake
> -------------------------------------------===##
> +#
> +# Performs a try_compile to determine the architecture of the target.
> +#
>
> +##===----------------------------------------------------------------------===##
> +
> +macro(detect_architecture variable)
> +  try_compile(HAVE_${variable}
> +    ${CMAKE_BINARY_DIR}
> +    ${CMAKE_SOURCE_DIR}/cmake/modules/DetectArchitecture.c
> +    OUTPUT_VARIABLE OUTPUT
> +    COPY_FILE
> ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DetectArchitecture.bin)
> +
> +  if(HAVE_${variable})
> +    file(STRINGS
> ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DetectArchitecture.bin
> +      DETECT_ARCH_STRING LIMIT_COUNT 1 REGEX "ARCHITECTURE IS")
> +    if(DETECT_ARCH_STRING)
> +      string(REGEX MATCH "[^ ]*$" DETECT_ARCH_MATCH ${DETECT_ARCH_STRING})
> +      if(DETECT_ARCH_MATCH)
> +        message(STATUS "Check target system architecture:
> ${DETECT_ARCH_MATCH}")
> +        set(${variable} ${DETECT_ARCH_MATCH})
> +      else()
> +        message(SEND_ERROR "Could not detect target system architecture!")
> +      endif()
> +    else()
> +      message(SEND_ERROR "Could not detect target system architecture!")
> +    endif()
> +  else()
> +    message(STATUS "Determine the system architecture - failed")
> +    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
> +      "Determining the system architecture fialed with the following
> output:\n${OUTPUT}")
> +    set(${variable})
> +  endif()
> +
> +endmacro(detect_architecture)
> \ No newline at end of file
>
> Added: test-suite/trunk/cmake/modules/FindYACC.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/cmake/modules/FindYACC.cmake?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/cmake/modules/FindYACC.cmake (added)
> +++ test-suite/trunk/cmake/modules/FindYACC.cmake Tue Oct 27 13:15:37 2015
> @@ -0,0 +1,24 @@
> +##===- FindYACC.cmake
> -----------------------------------------------------===##
> +#
> +# Defines custom rules for building a YACC parser. Based on
> FindBISON.cmake.
> +#
>
> +##===----------------------------------------------------------------------===##
> +
> +find_program(YACC_EXECUTABLE yacc DOC "Path to the YACC executable")
> +mark_as_advanced(YACC_EXECUTABLE)
> +
> +if(YACC_EXECUTABLE)
> +
> +  macro(add_yacc_parser target_name input_grammar output_c output_h)
> +    add_custom_command(OUTPUT ${output_c} ${output_h}
> +      COMMAND ${YACC_EXECUTABLE}
> +      ARGS -d -o ${output_c} ${input_grammar}
> +      DEPENDS ${input_grammar}
> +      COMMENT "Building YACC parser ${output_c}"
> +      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
> +  endmacro(add_yacc_parser)
> +
> +endif(YACC_EXECUTABLE)
> +
> +include(FindPackageHandleStandardArgs)
> +find_package_handle_standard_args(YACC DEFAULT_MSG YACC_EXECUTABLE)
>
> Added: test-suite/trunk/cmake/modules/MakefileFunctions.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/cmake/modules/MakefileFunctions.cmake?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/cmake/modules/MakefileFunctions.cmake (added)
> +++ test-suite/trunk/cmake/modules/MakefileFunctions.cmake Tue Oct 27
> 13:15:37 2015
> @@ -0,0 +1,46 @@
> +##===- MakefileFunctions.cmake
> --------------------------------------------===##
> +#
> +# Defines functions used within subdirectory CMakeLists.txt, that look a
> bit
> +# like standard GNU Make functions. These support the auto-generation of
> +# CMakeLists.txt from Makefiles, although any use of these should
> probably be
> +# looked at and manually translated into more idiomatic CMake.
> +#
>
> +##===----------------------------------------------------------------------===##
> +
> +# llvm_add_subdirectories - wrapper around add_subdirectory that can take
> +# multiple items.
> +macro(llvm_add_subdirectories)
> +  foreach(V ${ARGV})
> +    add_subdirectory(${V})
> +  endforeach(V)
> +endmacro()
> +
> +# llvm_prepend - equivalent to $(addprefix var,prefix). Modifies var in
> place.
> +function(llvm_prepend var prefix)
> +  set(listVar "")
> +  foreach(f ${ARGN})
> +    list(APPEND listVar "${prefix}${f}")
> +  endforeach(f)
> +  set(${var} "${listVar}" PARENT_SCOPE)
> +endfunction()
> +
> +# llvm_filter - equivalent to $(filter needle,haystack). Returns a list
> containing
> +# all of the items in ${ARGN} (after needle) that match needle.
> +macro(llvm_filter output needle)
> +  set(${output})
> +  foreach(haystack_item ${ARGN})
> +    foreach(needle_item ${needle})
> +      if("${haystack_item}" STREQUAL "${needle_item}")
> +        list(APPEND ${output} ${haystack_item})
> +      endif()
> +    endforeach()
> +  endforeach()
> +endmacro()
> +
> +# llvm_filter_out - equivalent to $(filter-out needle,haystack). Inverse
> of
> +# llvm_filter.
> +macro(llvm_filter_out output needle)
> +  set(${output} "${ARGN}")
> +  llvm_filter(tmp_output ${needle} ${ARGN})
> +  list(REMOVE_ITEM ${output} ${tmp_output})
> +endmacro()
>
> Added: test-suite/trunk/cmake/modules/SingleMultiSource.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/cmake/modules/SingleMultiSource.cmake?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/cmake/modules/SingleMultiSource.cmake (added)
> +++ test-suite/trunk/cmake/modules/SingleMultiSource.cmake Tue Oct 27
> 13:15:37 2015
> @@ -0,0 +1,194 @@
> +##===- SingleMultiSource.cmake
> --------------------------------------------===##
> +#
> +# Defines helpers to add executables and tests. The entry points to this
> +# file are:
> +#   `llvm_singlesource()` and
> +#   `llvm_multisource()`
> +#
> +# Each is a macro that uses the environment it was called in to determine
> +# what to build and how, and generates a test file that can be given to
> LIT.
> +# The test file is generated at configure time.
> +#
>
> +##===----------------------------------------------------------------------===##
> +
> +# get_unique_exe_name - Given a source file name after which a test
> should be
> +# named, create a unique name for the test. Usually this is just the
> source file
> +# with the suffix stripped, but in some cases this ends up causing
> duplicates
> +# so attempt to make each unique (by adding pathname segments until they
> become
> +# unique).
> +#
> +# FIXME: Swap this with a simpler procedure to just append a numeral
> +set_property(GLOBAL PROPERTY registered_executables)
> +function(get_unique_exe_name new_name main_src)
> +  get_property(registered_executables GLOBAL PROPERTY
> registered_executables)
> +
> +  string(REGEX REPLACE ".[cp]+$" "" path ${main_src})
> +  string(REGEX REPLACE ".*/" "" name ${path})
> +  list(FIND registered_executables ${name} name_idx)
> +
> +  if(${name_idx} EQUAL -1)
> +    set(${new_name} ${name} PARENT_SCOPE)
> +    set_property(GLOBAL APPEND PROPERTY registered_executables ${name})
> +    return()
> +  endif()
> +
> +  # There is a clash. Rename the target. Each time around the loop pull in
> +  # a new path component.
> +  foreach(n RANGE 1 4)
> +    string(REGEX REPLACE ".*/([^/]+/${name})" "\\1" name ${path})
> +    string(REGEX REPLACE "/" "-" safe_name ${name})
> +
> +    list(FIND registered_executables ${safe_name} name_idx)
> +    if(${name_idx} EQUAL -1)
> +      set(${new_name} ${safe_name} PARENT_SCOPE)
> +      set_property(GLOBAL APPEND PROPERTY registered_executables
> ${safe_name})
> +      return()
> +    endif()
> +  endforeach()
> +  message(FATAL_ERROR "Failed to uniquify executable name!")
> +endfunction()
> +
> +# append_cflags - add flags to the CFLAGS for target.
> +macro(append_cflags target flags)
> +  if(NOT "${${flags}}" STREQUAL "")
> +    get_target_property(old_cflags ${target} COMPILE_FLAGS)
> +    if(${old_cflags} STREQUAL "old_cflags-NOTFOUND")
> +      set(old_cflags)
> +    endif()
> +    string(REPLACE ";" " " s "${old_cflags};${${flags}}")
> +    set_target_properties(${target} PROPERTIES COMPILE_FLAGS ${s})
> +  endif()
> +endmacro()
> +
> +# append_ldflags - add flags to the LDFLAGS for target.
> +macro(append_ldflags target flags)
> +  if(NOT "${${flags}}" STREQUAL "")
> +    get_target_property(old_ldflags ${target} LINK_FLAGS)
> +    if(${old_ldflags} STREQUAL "old_ldflags-NOTFOUND")
> +      set(old_ldflags)
> +    endif()
> +    string(REPLACE ";" " " s "${old_ldflags};${${flags}}")
> +    set_target_properties(${target} PROPERTIES LINK_FLAGS ${s})
> +  endif()
> +endmacro()
> +
> +# llvm_add_test - Create a .test driver file suitable for LIT.
> +#
> +# The test template lives in cmake/lit-test-template.in and is
> configured by this function.
> +function(llvm_add_test name exename)
> +  if(NOT DEFINED STDIN_FILENAME)
> +    set(STDIN_FILENAME /dev/null)
> +  endif()
> +
> +  # Hash if we've been asked to, otherwise just use "touch" as an
> identity function.
> +  if(HASH_PROGRAM_OUTPUT)
> +    set(PROGRAM_OUTPUT_FILTER ${CMAKE_SOURCE_DIR}/HashProgramOutput.sh)
> +  else()
> +    set(PROGRAM_OUTPUT_FILTER touch)
> +  endif()
> +
> +  # Find the reference output file key name.
> +  if(SMALL_PROBLEM_SIZE)
> +    set(KEY small)
> +  elseif(LARGE_PROBLEM_SIZE)
> +    set(KEY large)
> +  else()
> +    set(KEY)
> +  endif()
> +
> +  # Pick the best reference output based on
> "programname.reference_output".
> +  if(EXISTS
> ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${ENDIAN}-endian.${KEY})
> +    set(REFERENCE_OUTPUT
> ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${ENDIAN}-endian.${KEY})
> +  elseif(EXISTS
> ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${KEY})
> +    set(REFERENCE_OUTPUT
> ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${KEY})
> +  elseif(EXISTS
> ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${ENDIAN}-endian)
> +    set(REFERENCE_OUTPUT
> ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output.${ENDIAN}-endian)
> +  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output)
> +    set(REFERENCE_OUTPUT
> ${CMAKE_CURRENT_SOURCE_DIR}/${name}.reference_output)
> +  else()
> +    # Just compare to its own output. This will always succeed, but
> here's hoping the
> +    # test in question uses its exit value to determine status, so it'll
> be caught by
> +    # the previous RUN line.
> +    set(REFERENCE_OUTPUT "%t")
> +    message("-- No reference output found for test ${name}")
> +  endif()
> +
> +  # If the program is nondeterministic, don't bother diffing and use
> "touch" again as an identity.
> +  if(DEFINED PROGRAM_IS_NONDETERMINISTIC)
> +    set(DIFFPROG touch)
> +  else()
> +    set(DIFFPROG ${CMAKE_BINARY_DIR}/tools/fpcmp)
> +    if(DEFINED FP_TOLERANCE)
> +      set(DIFFPROG "${DIFFPROG} -r ${FP_TOLERANCE}")
> +    endif()
> +    if(DEFINED FP_ABSTOLERANCE)
> +      set(DIFFPROG "${DIFFPROG} -a ${FP_ABSTOLERANCE}")
> +    endif()
> +  endif()
> +
> +  if(DEFINED RUN_OPTIONS)
> +    # RUN_OPTIONS is a semicolon-separated list. Change it into a
> whitespace-separated string.
> +    string(REPLACE ";" " " RUN_OPTIONS "${RUN_OPTIONS}")
> +  endif()
> +
> +  # FIXME: Sort out how to call timeit, or timeit.sh.
> +  set(TIMEIT ${CMAKE_BINARY_DIR}/tools/timeit)
> +  # FIXME: Add runtimelimit support.
> +
> +  # Now do the actual configuration.
> +  configure_file(${CMAKE_SOURCE_DIR}/cmake/lit-test-template.in
> +    ${CMAKE_CURRENT_BINARY_DIR}/${exename}.test)
> +endfunction()
> +
> +# llvm_singlesource - configure the current directory as a SingleSource
> subdirectory -
> +# i.e. every file in *.{c,cpp,cc} is treated as its own test.
> +macro(llvm_singlesource)
> +  file(GLOB sources *.c *.cpp *.cc)
> +  foreach(source ${sources})
> +    # Find the pure name of the test
> +    string(REGEX REPLACE ".[cp]+$" "" path ${source})
> +    string(REGEX REPLACE ".*/" "" name ${path})
> +
> +    # Should we skip this?
> +    list(FIND PROGRAMS_TO_SKIP ${name} name_idx)
> +    if(${name_idx} EQUAL -1)
> +      get_unique_exe_name(source_exename ${source})
> +      add_executable(${source_exename} ${source})
> +      append_cflags(${source_exename} CFLAGS)
> +      append_cflags(${source_exename} CPPFLAGS)
> +      append_cflags(${source_exename} CXXFLAGS)
> +      append_ldflags(${source_exename} LDFLAGS)
> +      llvm_add_test(${name} ${source_exename})
> +      add_dependencies(${source_exename} timeit fpcmp)
> +    endif()
> +  endforeach()
> +endmacro()
> +
> +# llvm_multisource - 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).
> +macro(llvm_multisource)
> +  if(DEFINED Source)
> +    set(sources ${Source})
> +  else()
> +    file(GLOB sources *.c *.cpp *.cc)
> +  endif()
> +  list(LENGTH sources sources_len)
> +
> +  if(sources_len GREATER 0 AND DEFINED PROG)
> +  # Should we skip this?
> +  list(FIND PROGRAMS_TO_SKIP ${PROG} name_idx)
> +  if(${name_idx} EQUAL -1)
> +    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
> +    include_directories(${CMAKE_CURRENT_BINARY_DIR})
> +    get_unique_exe_name(source_exename "${PROG}.c")
> +    add_executable(${source_exename} ${sources})
> +    append_cflags(${source_exename} CFLAGS)
> +    append_cflags(${source_exename} CPPFLAGS)
> +    append_cflags(${source_exename} CXXFLAGS)
> +    append_ldflags(${source_exename} LDFLAGS)
> +    llvm_add_test(${PROG} ${source_exename})
> +    add_dependencies(${source_exename} timeit fpcmp)
> +  endif()
> +endif()
> +endmacro()
>
> Added: test-suite/trunk/lit.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/lit.cfg?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/lit.cfg (added)
> +++ test-suite/trunk/lit.cfg Tue Oct 27 13:15:37 2015
> @@ -0,0 +1,46 @@
> +import lit.formats
> +import lit
> +import os, glob, re
> +
> +def getUserTimeFromTimeOutput(f):
> +    with open(f) as fd:
> +        l = [l for l in fd.readlines()
> +             if l.startswith('user')]
> +    assert len(l) == 1
> +
> +    m = re.match(r'user\s+([0-9.]+)', l[0])
> +    return float(m.group(1))
> +
> +class TestSuiteTest(lit.formats.ShTest):
> +    def __init__(self):
> +        lit.formats.ShTest.__init__(self, False)
> +
> +    def execute(self, test, litConfig):
> +        result = lit.formats.ShTest.execute(self, test, litConfig)
> +        basepath = os.path.dirname(test.getFilePath())
> +
> +        if not result.code.isFailure:
> +            # Collect the timing information.
> +            timeglob = os.path.join(basepath, 'Output', '*.time')
> +            times = glob.glob(timeglob)
> +            assert len(times) == 1
> +            time = getUserTimeFromTimeOutput(times[0])
> +
> +            result.addMetric('exec_time', lit.Test.toMetricValue(time))
> +
> +        # For completeness, attempt to find compile time information too.
> +        compile_time = 0.0
> +        for path, subdirs, files in os.walk(basepath):
> +            for file in files:
> +                if file.endswith('.o.time'):
> +                    compile_time +=
> getUserTimeFromTimeOutput(os.path.join(path, file))
> +        result.addMetric('compile_time',
> lit.Test.toMetricValue(compile_time))
> +
> +        return result
> +
> +config.name = 'test-suite'
> +
> +config.test_format = TestSuiteTest()
> +config.suffixes = ['.test']
> +config.test_source_root = os.path.dirname(__file__)
> +config.excludes = ['ABI-Testsuite']
>
> Added: test-suite/trunk/tools/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/test-suite/trunk/tools/CMakeLists.txt?rev=251431&view=auto
>
> ==============================================================================
> --- test-suite/trunk/tools/CMakeLists.txt (added)
> +++ test-suite/trunk/tools/CMakeLists.txt Tue Oct 27 13:15:37 2015
> @@ -0,0 +1,5 @@
> +
> +# FIXME: These need to be host-compiled, if we're cross compiling.
> +# FIXME: Replicate Makefile.tools's logic for determining whether to use
> fpcmp/fpcmp.sh
> +add_executable(fpcmp fpcmp.c)
> +add_executable(timeit timeit.c)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151027/0ec6599d/attachment.html>


More information about the llvm-commits mailing list