Index: docs/CommandGuide/lit.rst =================================================================== --- docs/CommandGuide/lit.rst +++ docs/CommandGuide/lit.rst @@ -395,17 +395,18 @@ :program:`lit` provides various patterns that can be used with the RUN command. These are defined in TestRunner.py. The base set of substitutions are: - ========== ============== - Macro Substitution - ========== ============== - %s source path (path to the file currently being run) - %S source dir (directory of the file currently being run) - %p same as %S - %{pathsep} path separator - %t temporary file name unique to the test - %T temporary directory unique to the test - %% % - ========== ============== + ======================= ============== + Macro Substitution + ======================= ============== + %s source path (path to the file currently being run) + %S source dir (directory of the file currently being run) + %p same as %S + %{pathsep} path separator + %t temporary file name unique to the test + %T temporary directory unique to the test + %{shared_output(LABEL)} temporary file name, identified by "LABEL", shared across all tests + %% % + ======================= ============== Other substitutions are provided that are variations on this base set and further substitution patterns can be defined by each test module. See the Index: docs/TestingGuide.rst =================================================================== --- docs/TestingGuide.rst +++ docs/TestingGuide.rst @@ -464,6 +464,12 @@ Example: ``/home/user/llvm.build/test/MC/ELF/Output`` +``%{shared_output(LABEL)}`` + File path to a temporary file name shared across all tests, identified by + LABEL. This is useful as a cache for generated resources. + + Example: ``/home/user/llvm.build/test/Output/Shared/LABEL.tmp`` + ``%{pathsep}`` Expands to the path separator, i.e. ``:`` (or ``;`` on Windows). Index: utils/lit/lit/TestRunner.py =================================================================== --- utils/lit/lit/TestRunner.py +++ utils/lit/lit/TestRunner.py @@ -829,6 +829,9 @@ sourcepath = test.getSourcePath() sourcedir = os.path.dirname(sourcepath) + sharedOutputDir = os.path.join(test.suite.exec_root, 'Output', 'Shared') + sharedOutputDir += os.path.sep + # Normalize slashes, if requested. if normalize_slashes: sourcepath = sourcepath.replace('\\', '/') @@ -849,6 +852,8 @@ ('%t', tmpName), ('%basename_t', baseName), ('%T', tmpDir), + ('%{shared_output\(([-+=._a-zA-Z0-9]+)\)}', + '%s\\1.tmp' % (sharedOutputDir,)), ('#_MARKER_#', '%')]) # "%/[STpst]" should be normalized. Index: utils/lit/lit/run.py =================================================================== --- utils/lit/lit/run.py +++ utils/lit/lit/run.py @@ -1,4 +1,5 @@ import os +import shutil import sys import threading import time @@ -136,6 +137,15 @@ return True win32api.SetConsoleCtrlHandler(console_ctrl_handler, True) + # Make fresh shared output directories. + suites = set(test.suite for test in self.tests) + print(suites) + for suite in suites: + shared_dir = os.path.join(suite.exec_root, 'Output', 'Shared') + shutil.rmtree(shared_dir, ignore_errors=True) + lit.util.mkdir_p(shared_dir) + print(shared_dir) + # Save the display object on the runner so that we can update it from # our task completion callback. self.display = display Index: utils/lit/tests/Inputs/shared-output/lit.cfg =================================================================== --- /dev/null +++ utils/lit/tests/Inputs/shared-output/lit.cfg @@ -0,0 +1,6 @@ +import lit.formats +config.name = 'shared-output' +config.suffixes = ['.txt'] +config.test_format = lit.formats.ShTest() +config.test_source_root = os.path.dirname(os.path.realpath(__file__)) + Index: utils/lit/tests/Inputs/shared-output/primary.txt =================================================================== --- /dev/null +++ utils/lit/tests/Inputs/shared-output/primary.txt @@ -0,0 +1,2 @@ +RUN: echo "primary" >> %{shared_output(SHARED)} +RUN: echo "other" >> %{shared_output(OTHER)} Index: utils/lit/tests/Inputs/shared-output/secondary.txt =================================================================== --- /dev/null +++ utils/lit/tests/Inputs/shared-output/secondary.txt @@ -0,0 +1 @@ +RUN: echo "secondary" >> %{shared_output(SHARED)} Index: utils/lit/tests/Inputs/shared-output/sub/sub.txt =================================================================== --- /dev/null +++ utils/lit/tests/Inputs/shared-output/sub/sub.txt @@ -0,0 +1 @@ +RUN: echo "sub" >> %{shared_output(SHARED)} Index: utils/lit/tests/shared-output.py =================================================================== --- /dev/null +++ utils/lit/tests/shared-output.py @@ -0,0 +1,13 @@ +# RUN: rm -rf %t && mkdir -p %t +# RUN: echo 'lit_config.load_config(config, "%{inputs}/shared-output/lit.cfg")' > %t/lit.site.cfg +# RUN: %{lit} %t +# RUN: FileCheck %s < %t/Output/Shared/SHARED.tmp +# RUN: FileCheck -check-prefix=NEGATIVE %s < %t/Output/Shared/SHARED.tmp +# RUN: FileCheck -check-prefix=OTHER %s < %t/Output/Shared/OTHER.tmp + +# CHECK-DAG: primary +# CHECK-DAG: secondary +# CHECK-DAG: sub + +# NEGATIVE-NOT: other +# OTHER: other