diff --git a/lldb/packages/Python/lldbsuite/test/configuration.py b/lldb/packages/Python/lldbsuite/test/configuration.py --- a/lldb/packages/Python/lldbsuite/test/configuration.py +++ b/lldb/packages/Python/lldbsuite/test/configuration.py @@ -107,7 +107,9 @@ test_build_dir = None # The clang module cache directory used by lldb. -module_cache_dir = None +lldb_module_cache_dir = None +# The clang module cache directory used by clang. +clang_module_cache_dir = None # The only directory to scan for tests. If multiple test directories are # specified, and an exclusive test subdirectory is specified, the latter option diff --git a/lldb/packages/Python/lldbsuite/test/dotest.py b/lldb/packages/Python/lldbsuite/test/dotest.py --- a/lldb/packages/Python/lldbsuite/test/dotest.py +++ b/lldb/packages/Python/lldbsuite/test/dotest.py @@ -426,11 +426,18 @@ configuration.lldb_platform_working_dir = args.lldb_platform_working_dir if args.test_build_dir: configuration.test_build_dir = args.test_build_dir - if args.module_cache_dir: - configuration.module_cache_dir = args.module_cache_dir + if args.lldb_module_cache_dir: + configuration.lldb_module_cache_dir = args.lldb_module_cache_dir else: - configuration.module_cache_dir = os.path.join(configuration.test_build_dir, - 'module-cache-lldb') + configuration.lldb_module_cache_dir = os.path.join( + configuration.test_build_dir, 'module-cache-lldb') + if args.clang_module_cache_dir: + configuration.clang_module_cache_dir = args.clang_module_cache_dir + else: + configuration.clang_module_cache_dir = os.path.join( + configuration.test_build_dir, 'module-cache-clang') + + os.environ['CLANG_MODULE_CACHE_DIR'] = configuration.clang_module_cache_dir # Gather all the dirs passed on the command line. if len(args.args) > 0: diff --git a/lldb/packages/Python/lldbsuite/test/dotest_args.py b/lldb/packages/Python/lldbsuite/test/dotest_args.py --- a/lldb/packages/Python/lldbsuite/test/dotest_args.py +++ b/lldb/packages/Python/lldbsuite/test/dotest_args.py @@ -150,10 +150,15 @@ default='lldb-test-build.noindex', help='The root build directory for the tests. It will be removed before running.') group.add_argument( - '--module-cache-dir', - dest='module_cache_dir', + '--lldb-module-cache-dir', + dest='lldb_module_cache_dir', metavar='The clang module cache directory used by LLDB', - help='The clang module cache directory used by LLDB. This is not the one used by the makefiles. Defaults to /module-cache-lldb.') + help='The clang module cache directory used by LLDB. Defaults to /module-cache-lldb.') + group.add_argument( + '--clang-module-cache-dir', + dest='clang_module_cache_dir', + metavar='The clang module cache directory used by Clang', + help='The clang module cache directory used in the Make files by Clang while building tests. Defaults to /module-cache-clang.') # Configuration options group = parser.add_argument_group('Remote platform options') diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -696,7 +696,7 @@ "settings set plugin.process.gdb-remote.packet-timeout 60", 'settings set symbols.clang-modules-cache-path "{}"'.format( - configuration.module_cache_dir), + configuration.lldb_module_cache_dir), "settings set use-color false", ] # Make sure that a sanitizer LLDB's environment doesn't get passed on. diff --git a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules --- a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules +++ b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules @@ -313,14 +313,6 @@ CFLAGS += -gsplit-dwarf endif -# Use a shared module cache when building in the default test build directory. -CLANG_MODULE_CACHE_DIR := $(shell echo "$(BUILDDIR)" | sed $(QUOTE)s/lldb-test-build.noindex.*/lldb-test-build.noindex\/module-cache-clang/$(QUOTE)) - -ifeq "$(findstring lldb-test-build.noindex, $(BUILDDIR))" "" -CLANG_MODULE_CACHE_DIR := $(BUILDDIR)/module-cache -$(warning failed to set the shared clang module cache dir) -endif - MODULE_BASE_FLAGS := -fmodules -gmodules -fmodules-cache-path=$(CLANG_MODULE_CACHE_DIR) MANDATORY_MODULE_BUILD_CFLAGS := $(MODULE_BASE_FLAGS) -gmodules # Build flags for building with C++ modules. diff --git a/lldb/packages/Python/lldbsuite/test/plugins/builder_base.py b/lldb/packages/Python/lldbsuite/test/plugins/builder_base.py --- a/lldb/packages/Python/lldbsuite/test/plugins/builder_base.py +++ b/lldb/packages/Python/lldbsuite/test/plugins/builder_base.py @@ -122,6 +122,16 @@ return "SDKROOT={}".format(os.environ["SDKROOT"]) return ""; +def getModuleCacheSpec(): + """ + Helper function to return the key-value string to specify the clang + module cache used for the make system. + """ + if "CLANG_MODULE_CACHE_DIR" in os.environ: + return "CLANG_MODULE_CACHE_DIR={}".format( + os.environ["CLANG_MODULE_CACHE_DIR"]) + return ""; + def getCmdLine(d): """ Helper function to return a properly formatted command line argument(s) @@ -168,6 +178,7 @@ getCCSpec(compiler), getDsymutilSpec(), getSDKRootSpec(), + getModuleCacheSpec(), getCmdLine(dictionary)]) runBuildCommands(commands, sender=sender) @@ -191,6 +202,7 @@ getCCSpec(compiler), getDsymutilSpec(), getSDKRootSpec(), + getModuleCacheSpec(), getCmdLine(dictionary)]) runBuildCommands(commands, sender=sender) @@ -214,6 +226,7 @@ getCCSpec(compiler), getDsymutilSpec(), getSDKRootSpec(), + getModuleCacheSpec(), getCmdLine(dictionary)]) runBuildCommands(commands, sender=sender) @@ -237,6 +250,7 @@ getCCSpec(compiler), getDsymutilSpec(), getSDKRootSpec(), + getModuleCacheSpec(), getCmdLine(dictionary)]) lldbtest.system(commands, sender=sender) diff --git a/lldb/test/API/lit.cfg b/lldb/test/API/lit.cfg --- a/lldb/test/API/lit.cfg +++ b/lldb/test/API/lit.cfg @@ -5,6 +5,7 @@ import os import platform import shlex +import shutil import lit.formats @@ -52,6 +53,14 @@ lit_config.warning("unable to inject shared library path on '{}'".format( platform.system())) +# Clean the module caches in the test build directory. This is necessary in an +# incremental build whenever clang changes underneath, so doing it once per +# lit.py invocation is close enough. +for cachedir in [config.clang_module_cache, config.lldb_module_cache]: + if os.path.isdir(cachedir): + print("Deleting module cache at %s."%cachedir) + shutil.rmtree(cachedir) + # Build dotest command. dotest_cmd = [config.dotest_path] dotest_cmd.extend(config.dotest_args_str.split(';')) @@ -70,7 +79,10 @@ dotest_cmd += ['--build-dir', config.lldb_build_directory] if config.lldb_module_cache: - dotest_cmd += ['--module-cache-dir', config.lldb_module_cache] + dotest_cmd += ['--lldb-module-cache-dir', config.lldb_module_cache] + +if config.clang_module_cache: + dotest_cmd += ['--clang-module-cache-dir', config.clang_module_cache] # Load LLDB test format. sys.path.append(os.path.join(config.lldb_src_root, "test", "API")) diff --git a/lldb/test/API/lit.site.cfg.in b/lldb/test/API/lit.site.cfg.in --- a/lldb/test/API/lit.site.cfg.in +++ b/lldb/test/API/lit.site.cfg.in @@ -17,13 +17,14 @@ config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@" config.target_triple = "@TARGET_TRIPLE@" config.lldb_build_directory = "@LLDB_TEST_BUILD_DIRECTORY@" -config.lldb_module_cache = "@LLDB_TEST_MODULE_CACHE_LLDB@" -config.clang_module_cache = "@LLDB_TEST_MODULE_CACHE_CLANG@" config.python_executable = "@PYTHON_EXECUTABLE@" config.dotest_path = "@LLDB_SOURCE_DIR@/test/API/dotest.py" config.dotest_args_str = "@LLDB_DOTEST_ARGS@" config.lldb_disable_python = @LLDB_DISABLE_PYTHON@ config.dotest_lit_args_str = None +# The API tests use their own module caches. +config.lldb_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_LLDB@", "lldb-api") +config.clang_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_CLANG@", "lldb-api") # Additional dotest arguments can be passed to lit by providing a # semicolon-separates list: --param dotest-args="arg;arg". diff --git a/lldb/test/CMakeLists.txt b/lldb/test/CMakeLists.txt --- a/lldb/test/CMakeLists.txt +++ b/lldb/test/CMakeLists.txt @@ -3,6 +3,12 @@ add_subdirectory(API) +# Configure and create module cache directories. +set(LLDB_TEST_MODULE_CACHE_LLDB "${LLDB_TEST_BUILD_DIRECTORY}/module-cache-lldb" CACHE PATH "The Clang module cache used by the Clang embedded in LLDB while running tests.") +set(LLDB_TEST_MODULE_CACHE_CLANG "${LLDB_TEST_BUILD_DIRECTORY}/module-cache-clang" CACHE PATH "The Clang module cache used by the Clang while building tests.") +file(MAKE_DIRECTORY ${LLDB_TEST_MODULE_CACHE_LLDB}) +file(MAKE_DIRECTORY ${LLDB_TEST_MODULE_CACHE_CLANG}) + # LLVM_BUILD_MODE is used in lit.site.cfg if (CMAKE_CFG_INTDIR STREQUAL ".") set(LLVM_BUILD_MODE ".") @@ -17,8 +23,6 @@ get_property(LLDB_DOTEST_ARGS GLOBAL PROPERTY LLDB_DOTEST_ARGS_PROPERTY) set(dotest_args_replacement ${LLVM_BUILD_MODE}) -set(LLDB_TEST_MODULE_CACHE_LLDB "${LLDB_TEST_BUILD_DIRECTORY}/module-cache-lldb" CACHE PATH "The Clang module cache used by the Clang embedded in LLDB while running tests.") -set(LLDB_TEST_MODULE_CACHE_CLANG "${LLDB_TEST_BUILD_DIRECTORY}/module-cache-clang" CACHE PATH "The Clang module cache used by the Clang while building tests.") if(LLDB_BUILT_STANDALONE) # In paths to our build-tree, replace CMAKE_CFG_INTDIR with our configuration name placeholder. diff --git a/lldb/test/Shell/lit.cfg.py b/lldb/test/Shell/lit.cfg.py --- a/lldb/test/Shell/lit.cfg.py +++ b/lldb/test/Shell/lit.cfg.py @@ -69,9 +69,9 @@ # incremental build whenever clang changes underneath, so doing it once per # lit.py invocation is close enough. for cachedir in [config.clang_module_cache, config.lldb_module_cache]: - if os.path.isdir(cachedir): - print("Deleting module cache at %s."%cachedir) - shutil.rmtree(cachedir) + if os.path.isdir(cachedir): + print("Deleting module cache at %s."%cachedir) + shutil.rmtree(cachedir) # Set a default per-test timeout of 10 minutes. Setting a timeout per test # requires that killProcessAndChildren() is supported on the platform and diff --git a/lldb/test/Shell/lit.site.cfg.py.in b/lldb/test/Shell/lit.site.cfg.py.in --- a/lldb/test/Shell/lit.site.cfg.py.in +++ b/lldb/test/Shell/lit.site.cfg.py.in @@ -20,8 +20,9 @@ config.lldb_bitness = 64 if @LLDB_IS_64_BITS@ else 32 config.lldb_disable_python = @LLDB_DISABLE_PYTHON@ config.lldb_build_directory = "@LLDB_TEST_BUILD_DIRECTORY@" -config.lldb_module_cache = "@LLDB_TEST_MODULE_CACHE_LLDB@" -config.clang_module_cache = "@LLDB_TEST_MODULE_CACHE_CLANG@" +# The shell tests use their own module caches. +config.lldb_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_LLDB@", "lldb-shell") +config.clang_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_CLANG@", "lldb-shell") # Support substitution of the tools and libs dirs with user parameters. This is # used when we can't determine the tool dir at configuration time. @@ -32,7 +33,6 @@ config.lldb_libs_dir = config.lldb_libs_dir % lit_config.params config.lldb_tools_dir = config.lldb_tools_dir % lit_config.params config.lldb_lit_tools_dir = config.lldb_lit_tools_dir % lit_config.params - except KeyError as e: key, = e.args lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key))