diff --git a/llvm/docs/CommandGuide/lit.rst b/llvm/docs/CommandGuide/lit.rst index bcaa5c66c8c3..7bb499b971d0 100644 --- a/llvm/docs/CommandGuide/lit.rst +++ b/llvm/docs/CommandGuide/lit.rst @@ -38,6 +38,11 @@ Finally, :program:`lit` also supports additional options for only running a subset of the options specified on the command line, see :ref:`selection-options` for more information. +:program:`lit` parses options from the environment variable ``LIT_OPTS`` after +parsing options from the command line. ``LIT_OPTS`` is primarily useful for +supplementing or overriding the command-line options supplied to :program:`lit` +by ``check`` targets defined by a project's build system. + Users interested in the :program:`lit` architecture or designing a :program:`lit` testing implementation should see :ref:`lit-infrastructure`. diff --git a/llvm/utils/lit/lit/main.py b/llvm/utils/lit/lit/main.py index bae6d91174d4..49aaf638a221 100755 --- a/llvm/utils/lit/lit/main.py +++ b/llvm/utils/lit/lit/main.py @@ -11,6 +11,7 @@ import os import platform import random import re +import shlex import sys import time import argparse @@ -322,7 +323,8 @@ def main_with_tmp(builtinParameters): help="Show all discovered tests", action="store_true", default=False) - opts = parser.parse_args() + opts = parser.parse_args(sys.argv[1:] + + shlex.split(os.environ.get("LIT_OPTS", ""))) args = opts.test_paths if opts.show_version: diff --git a/llvm/utils/lit/tests/Inputs/lit-opts/lit.cfg b/llvm/utils/lit/tests/Inputs/lit-opts/lit.cfg new file mode 100644 index 000000000000..d8dccdb6f4e9 --- /dev/null +++ b/llvm/utils/lit/tests/Inputs/lit-opts/lit.cfg @@ -0,0 +1,7 @@ +import lit.formats +config.name = 'lit-opts' +config.suffixes = ['.txt'] +config.test_format = lit.formats.ShTest() +config.test_source_root = None +config.test_exec_root = None +config.substitutions.append(('%var', lit_config.params.get('var', ''))) diff --git a/llvm/utils/lit/tests/Inputs/lit-opts/test.txt b/llvm/utils/lit/tests/Inputs/lit-opts/test.txt new file mode 100644 index 000000000000..0ddee88ac0bf --- /dev/null +++ b/llvm/utils/lit/tests/Inputs/lit-opts/test.txt @@ -0,0 +1 @@ +# RUN: echo %var diff --git a/llvm/utils/lit/tests/lit-opts.py b/llvm/utils/lit/tests/lit-opts.py new file mode 100644 index 000000000000..4c068dd8ac2b --- /dev/null +++ b/llvm/utils/lit/tests/lit-opts.py @@ -0,0 +1,33 @@ +# Check cases where LIT_OPTS has no effect. +# +# RUN: %{lit} -j 1 -s %{inputs}/lit-opts | FileCheck %s +# RUN: env LIT_OPTS= %{lit} -j 1 -s %{inputs}/lit-opts | FileCheck %s +# RUN: env LIT_OPTS=-s %{lit} -j 1 -s %{inputs}/lit-opts | FileCheck %s + +# Check that LIT_OPTS can override command-line options. +# +# RUN: env LIT_OPTS=-a \ +# RUN: %{lit} -j 1 -s %{inputs}/lit-opts \ +# RUN: | FileCheck -check-prefix=SHOW-ALL -DVAR= %s + +# Check that LIT_OPTS understands multiple options with arbitrary spacing. +# +# RUN: env LIT_OPTS='-a -v -Dvar=foobar' \ +# RUN: %{lit} -j 1 -s %{inputs}/lit-opts \ +# RUN: | FileCheck -check-prefix=SHOW-ALL -DVAR=foobar %s + +# Check that LIT_OPTS parses shell-like quotes and escapes. +# +# RUN: env LIT_OPTS='-a -v -Dvar="foo bar"\ baz' \ +# RUN: %{lit} -j 1 -s %{inputs}/lit-opts \ +# RUN: | FileCheck -check-prefix=SHOW-ALL -DVAR="foo bar baz" %s + +# CHECK: Testing: 1 tests +# CHECK-NOT: PASS +# CHECK: Expected Passes : 1 + +# SHOW-ALL: Testing: 1 tests +# SHOW-ALL: PASS: lit-opts :: test.txt (1 of 1) +# SHOW-ALL: {{^}}[[VAR]] +# SHOW-ALL-NOT: PASS +# SHOW-ALL: Expected Passes : 1