Fix legacy crosstool fields in unit-tests that depend on C++ rules

This big cl does many things, most of which would take much more effort to do in smaller steps (and that's the reason why nobody did this yet, even though we seriously suffer from the dept accumulated there):

* Bazel and Blaze unit tests now use the same MOCK_CROSSTOOL.
* Bazel and Blaze unit tests now use the same BUILD file generator (crosstool.java).
* We now default to --cpu=k8 and --host_cpu=k8 in unit tests and analysis tests. I will followup and use mock values for these in a separate cl. If a cpu-specific logic is to be tested, explicitly set the cpu in using `useConfiguration(...)`. As a result, unit tests behave the same on linux, mac, and windows.
* MOCK_CROSSTOOL is really a mock now, it doesn't contain any real flags.
* MOCK_CROSSTOOL now doesn't contain random toolchains that random tests need. If you need to extend the toolchain in there, use:

      getAnalysisMock()
        .ccSupport()
        .setupCrosstool(mockToolsConfig, ...);

  If you need to add more toolchains, use:

      getAnalysisMock()
        .ccSupport()
        .setupCrosstool(
            mockToolsConfig,
            /* appendToCurrentToolchain= */ false,
            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));

* Added few useful features to MockCcSupport, prefer using them to inlining features in the test setup.
* Toolchain in MOCK_CROSSTOOL doesn't support any advanced features, all these have to be explicitly added. This is good, because your tests now declare what parts of C++ toolchain they depend on.

RELNOTES: None.
PiperOrigin-RevId: 235492653
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
index 128929c..c974978 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -147,11 +147,11 @@
     scratch.file(
         "conflict/BUILD",
         "cc_library(name='x', srcs=['foo.cc'])",
-        "cc_binary(name='_objs/x/foo.pic.o', srcs=['bar.cc'])",
-        "cc_binary(name='foo', deps=['x'], data=['_objs/x/foo.pic.o'])");
+        "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])",
+        "cc_binary(name='foo', deps=['x'], data=['_objs/x/foo.o'])");
     reporter.removeHandler(failFastHandler); // expect errors
     update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:foo");
-    assertContainsEvent("file 'conflict/_objs/x/foo.pic.o' " + CONFLICT_MSG);
+    assertContainsEvent("file 'conflict/_objs/x/foo.o' " + CONFLICT_MSG);
     assertThat(getAnalysisResult().getTargetsToBuild()).isEmpty();
   }
 
@@ -173,17 +173,16 @@
         "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])");
     update("//conflict:x");
     ConfiguredTarget conflict = getConfiguredTarget("//conflict:x");
-    Action oldAction = getGeneratingAction(getBinArtifact("_objs/x/foo.pic.o", conflict));
+    Action oldAction = getGeneratingAction(getBinArtifact("_objs/x/foo.o", conflict));
     assertThat(oldAction.getOwner().getLabel().toString()).isEqualTo("//conflict:x");
     scratch.overwriteFile(
         "conflict/BUILD",
         "cc_library(name='newx', srcs=['foo.cc'])", // Rename target.
-        "cc_binary(name='_objs/x/foo.pic.o', srcs=['bar.cc'])");
-    update(defaultFlags(), "//conflict:_objs/x/foo.pic.o");
-    ConfiguredTarget objsConflict = getConfiguredTarget("//conflict:_objs/x/foo.pic.o");
-    Action newAction = getGeneratingAction(getBinArtifact("_objs/x/foo.pic.o", objsConflict));
-    assertThat(newAction.getOwner().getLabel().toString())
-        .isEqualTo("//conflict:_objs/x/foo.pic.o");
+        "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])");
+    update(defaultFlags(), "//conflict:_objs/x/foo.o");
+    ConfiguredTarget objsConflict = getConfiguredTarget("//conflict:_objs/x/foo.o");
+    Action newAction = getGeneratingAction(getBinArtifact("_objs/x/foo.o", objsConflict));
+    assertThat(newAction.getOwner().getLabel().toString()).isEqualTo("//conflict:_objs/x/foo.o");
   }
 
   /** Generating the same output from multiple actions is causing an error. */
@@ -197,10 +196,10 @@
     scratch.file(
         "conflict/BUILD",
         "cc_library(name='x', srcs=['foo.cc'])",
-        "cc_binary(name='_objs/x/foo.pic.o', srcs=['bar.cc'])");
+        "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])");
     reporter.removeHandler(failFastHandler); // expect errors
-    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.pic.o");
-    assertContainsEvent("file 'conflict/_objs/x/foo.pic.o' " + CONFLICT_MSG);
+    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.o");
+    assertContainsEvent("file 'conflict/_objs/x/foo.o' " + CONFLICT_MSG);
   }
 
   @Test
@@ -213,20 +212,20 @@
     scratch.file(
         "conflict/BUILD",
         "cc_library(name='x', srcs=['foo.cc'])",
-        "cc_binary(name='_objs/x/foo.pic.o', srcs=['bar.cc'])");
+        "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])");
     reporter.removeHandler(failFastHandler); // expect errors
-    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.pic.o");
+    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.o");
     // We want to force a "dropConfiguredTargetsNow" operation, which won't inform the
     // invalidation receiver about the dropped configured targets.
     skyframeExecutor.clearAnalysisCache(
         ImmutableList.<ConfiguredTarget>of(), ImmutableSet.<AspectValue>of());
-    assertContainsEvent("file 'conflict/_objs/x/foo.pic.o' " + CONFLICT_MSG);
+    assertContainsEvent("file 'conflict/_objs/x/foo.o' " + CONFLICT_MSG);
     eventCollector.clear();
     scratch.overwriteFile(
         "conflict/BUILD",
         "cc_library(name='x', srcs=['baz.cc'])",
-        "cc_binary(name='_objs/x/foo.pic.o', srcs=['bar.cc'])");
-    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.pic.o");
+        "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])");
+    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.o");
     assertNoEvents();
   }
 
@@ -244,11 +243,11 @@
     scratch.file(
         "conflict/BUILD",
         "cc_library(name='x', srcs=['foo.cc'])",
-        "cc_binary(name='_objs/x/foo.pic.o', srcs=['bar.cc'])");
+        "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])");
     reporter.removeHandler(failFastHandler); // expect errors
-    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.pic.o");
+    update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:_objs/x/foo.o");
 
-    assertContainsEvent("file 'conflict/_objs/x/foo.pic.o' " + CONFLICT_MSG);
+    assertContainsEvent("file 'conflict/_objs/x/foo.o' " + CONFLICT_MSG);
     assertDoesNotContainEvent("MandatoryInputs");
     assertDoesNotContainEvent("Outputs");
   }
@@ -268,12 +267,12 @@
         "conflict/BUILD",
         "cc_library(name='x', srcs=['foo1.cc', 'foo2.cc', 'foo3.cc', 'foo4.cc', 'foo5.cc'"
             + ", 'foo6.cc'])",
-        "genrule(name = 'foo', outs=['_objs/x/foo1.pic.o'], srcs=['foo1.cc', 'foo2.cc', "
+        "genrule(name = 'foo', outs=['_objs/x/foo1.o'], srcs=['foo1.cc', 'foo2.cc', "
             + "'foo3.cc', 'foo4.cc', 'foo5.cc', 'foo6.cc'], cmd='', output_to_bindir=1)");
     reporter.removeHandler(failFastHandler); // expect errors
     update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:x", "//conflict:foo");
 
-    Event event = assertContainsEvent("file 'conflict/_objs/x/foo1.pic.o' " + CONFLICT_MSG);
+    Event event = assertContainsEvent("file 'conflict/_objs/x/foo1.o' " + CONFLICT_MSG);
     assertContainsEvent("MandatoryInputs");
     assertContainsEvent("Outputs");
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
index 2d17f19..331fb45 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
@@ -934,14 +934,12 @@
         "conflict/BUILD",
         "config_setting(name = 'a', values = {'test_arg': 'a'})",
         "cc_library(name='x', srcs=select({':a': ['a.cc'], '//conditions:default': ['foo.cc']}))",
-        "cc_binary(name='_objs/x/foo.pic.o', srcs=['bar.cc'])");
+        "cc_binary(name='_objs/x/foo.o', srcs=['bar.cc'])");
     AnalysisResult result =
-        update(
-            defaultFlags().with(Flag.KEEP_GOING), "//conflict:_objs/x/foo.pic.o", "//conflict:x");
+        update(defaultFlags().with(Flag.KEEP_GOING), "//conflict:_objs/x/foo.o", "//conflict:x");
     assertThat(result.hasError()).isTrue();
     // Expect to reach this line without a Precondition-triggered NullPointerException.
-    assertContainsEvent(
-        "file 'conflict/_objs/x/foo.pic.o' is generated by these conflicting actions");
+    assertContainsEvent("file 'conflict/_objs/x/foo.o' is generated by these conflicting actions");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
index ecfd958..7bcb052 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.packages.License;
 import com.google.devtools.build.lib.packages.License.DistributionType;
 import com.google.devtools.build.lib.packages.License.LicenseParsingException;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.HashMap;
@@ -470,7 +471,7 @@
         "    all_files = ':every-file',",
         "    dynamic_runtime_lib = 'dynamic-runtime-libs-cherry',",
         "    static_runtime_lib = 'static-runtime-libs-cherry')");
-    scratch.file("c/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
+    scratch.file("c/CROSSTOOL", MockCcSupport.EMPTY_CROSSTOOL);
 
     ConfiguredTarget target = getConfiguredTarget("//c:c");
     Map<Label, License> expected = licenses("//c:c", "notice");
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
index 77b82a1..25f87c1 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import java.util.List;
 import java.util.Map;
 import org.junit.Test;
@@ -48,7 +49,12 @@
   private void writeBasicTestFiles() throws Exception {
     setSkylarkSemanticsOptions("--experimental_starlark_config_transitions=true");
     writeWhitelistFile();
-
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain= */ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
     scratch.file(
         "test/skylark/my_rule.bzl",
         "def transition_func(settings, attr):",
@@ -241,6 +247,12 @@
     //   "k8": ConfiguredTarget,
     //   "armeabi-v7a": ConfiguredTarget,
     // }
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain= */ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
     writeReadSettingsTestFiles();
 
     useConfiguration("--fat_apk_cpu=k8,armeabi-v7a");
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
index b7ca89c..acc651b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
@@ -1,537 +1,7 @@
-major_version: "1"
-minor_version: "42"
+major_version: "13"
+minor_version: "0"
 toolchain {
-  toolchain_identifier: "toolchain-identifier-local"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "local"
-  target_libc: "local"
-  compiler: "compiler"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "/usr/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/lib/gcc/"
-  cxx_builtin_include_directory: "/usr/local/include"
-  cxx_builtin_include_directory: "/usr/include"
-  builtin_sysroot: "/test/"
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-U_FORTIFY_SOURCE"
-        flag: "-D_FORTIFY_SOURCE=1"
-        flag: "-fstack-protector"
-        flag: "-Wall"
-        flag: "-Wunused-but-set-parameter"
-        flag: "-Wno-free-nonheap-object"
-        flag: "-fno-omit-frame-pointer"
-      }
-    }
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-g"
-      }
-      with_feature {
-        feature: "dbg"
-      }
-    }
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-g0"
-        flag: "-O2"
-        flag: "-DNDEBUG"
-        flag: "-ffunction-sections"
-        flag: "-fdata-sections"
-      }
-      with_feature {
-        feature: "opt"
-      }
-    }
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-        flag: "-Wl,-z,relro,-z,now"
-        flag: "-no-canonical-prefixes"
-        flag: "-pass-exit-codes"
-      }
-    }
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-Wl,--gc-sections"
-      }
-      with_feature {
-        feature: "opt"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_pic"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "opt"
-  }
-  feature {
-    name: "dbg"
-  }
-  feature {
-    name: "user_compile_flags"
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "%{user_compile_flags}"
-        iterate_over: "user_compile_flags"
-        expand_if_all_available: "user_compile_flags"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "sysroot"
-    flag_set {
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "--sysroot=%{sysroot}"
-        expand_if_all_available: "sysroot"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "unfiltered_compile_flags"
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-no-canonical-prefixes"
-        flag: "-fno-canonical-system-headers"
-        flag: "-Wno-builtin-macro-redefined"
-        flag: "-D__DATE__=\"redacted\""
-        flag: "-D__TIMESTAMP__=\"redacted\""
-        flag: "-D__TIME__=\"redacted\""
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "toolchain-identifier-ppc"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "ppc"
-  target_libc: "local"
-  compiler: "compiler"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "/usr/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/lib/gcc/"
-  cxx_builtin_include_directory: "/usr/local/include"
-  cxx_builtin_include_directory: "/usr/include"
-  builtin_sysroot: "/test/"
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-U_FORTIFY_SOURCE"
-        flag: "-D_FORTIFY_SOURCE=1"
-        flag: "-fstack-protector"
-        flag: "-Wall"
-        flag: "-Wunused-but-set-parameter"
-        flag: "-Wno-free-nonheap-object"
-        flag: "-fno-omit-frame-pointer"
-      }
-    }
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-g"
-      }
-      with_feature {
-        feature: "dbg"
-      }
-    }
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-g0"
-        flag: "-O2"
-        flag: "-DNDEBUG"
-        flag: "-ffunction-sections"
-        flag: "-fdata-sections"
-      }
-      with_feature {
-        feature: "opt"
-      }
-    }
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-        flag: "-Wl,-z,relro,-z,now"
-        flag: "-no-canonical-prefixes"
-        flag: "-pass-exit-codes"
-      }
-    }
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-Wl,--gc-sections"
-      }
-      with_feature {
-        feature: "opt"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_pic"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "opt"
-  }
-  feature {
-    name: "dbg"
-  }
-  feature {
-    name: "user_compile_flags"
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "%{user_compile_flags}"
-        iterate_over: "user_compile_flags"
-        expand_if_all_available: "user_compile_flags"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "sysroot"
-    flag_set {
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "--sysroot=%{sysroot}"
-        expand_if_all_available: "sysroot"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "unfiltered_compile_flags"
-    flag_set {
-      action: "assemble"
-      action: "preprocess-assemble"
-      action: "linkstamp-compile"
-      action: "c-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-no-canonical-prefixes"
-        flag: "-fno-canonical-system-headers"
-        flag: "-Wno-builtin-macro-redefined"
-        flag: "-D__DATE__=\"redacted\""
-        flag: "-D__TIMESTAMP__=\"redacted\""
-        flag: "-D__TIME__=\"redacted\""
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "toolchain-identifier-k8"
+  toolchain_identifier: "mock-llvm-toolchain-k8"
   host_system_name: "local"
   target_system_name: "local"
   target_cpu: "k8"
@@ -541,51 +11,51 @@
   abi_libc_version: "local"
   tool_path {
     name: "ar"
-    path: "/usr/bin/ar"
+    path: "/usr/bin/mock-ar"
   }
   tool_path {
     name: "compat-ld"
-    path: "/usr/bin/ld"
+    path: "/usr/bin/mock-compat-ld"
   }
   tool_path {
     name: "cpp"
-    path: "/usr/bin/cpp"
+    path: "/usr/bin/mock-cpp"
   }
   tool_path {
     name: "dwp"
-    path: "/usr/bin/dwp"
+    path: "/usr/bin/mock-dwp"
   }
   tool_path {
     name: "gcc"
-    path: "/usr/bin/gcc"
+    path: "/usr/bin/mock-gcc"
   }
   tool_path {
     name: "gcov"
-    path: "/usr/bin/gcov"
+    path: "/usr/bin/mock-gcov"
   }
   tool_path {
     name: "ld"
-    path: "/usr/bin/ld"
+    path: "/usr/bin/mock-ld"
   }
   tool_path {
     name: "nm"
-    path: "/usr/bin/nm"
+    path: "/usr/bin/mock-nm"
   }
   tool_path {
     name: "objcopy"
-    path: "/usr/bin/objcopy"
+    path: "/usr/bin/mock-objcopy"
   }
   tool_path {
     name: "objdump"
-    path: "/usr/bin/objdump"
+    path: "/usr/bin/mock-objdump"
   }
   tool_path {
     name: "strip"
-    path: "/usr/bin/strip"
+    path: "/usr/bin/mock-strip"
   }
   tool_path {
     name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
+    path: "/usr/bin/mock-llvm-profdata"
   }
   cxx_builtin_include_directory: "/usr/lib/gcc/"
   cxx_builtin_include_directory: "/usr/local/include"
@@ -602,7 +72,7 @@
       action: "lto-backend"
       action: "clif-match"
       flag_group {
-        flag: "-std=c++0x"
+        flag: "--default-compile-flag"
       }
     }
     enabled: true
@@ -614,1234 +84,9 @@
       action: "c++-link-dynamic-library"
       action: "c++-link-nodeps-dynamic-library"
       flag_group {
-        flag: "-lstdc++"
+        flag: "-ldefault-link-flag"
       }
     }
     enabled: true
   }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "supports_pic"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "k8-no-dyn-linker"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "k8"
-  target_libc: "local"
-  compiler: "compiler_no_dyn_linker"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "/usr/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/lib/gcc/"
-  cxx_builtin_include_directory: "/usr/local/include"
-  cxx_builtin_include_directory: "/usr/include"
-  builtin_sysroot: ""
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "supports_pic"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "piii"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "piii"
-  target_libc: "local"
-  compiler: "compiler"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "/usr/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/lib/gcc/"
-  cxx_builtin_include_directory: "/usr/local/include"
-  cxx_builtin_include_directory: "/usr/include"
-  builtin_sysroot: ""
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "local_darwin"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "darwin"
-  target_libc: "macosx"
-  compiler: "compiler"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "/usr/bin/libtool"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/include"
-  cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
-  cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"
-  cxx_builtin_include_directory: "/opt/local/include"
-  cxx_builtin_include_directory: "/Library/Developer/CommandLineTools"
-  builtin_sysroot: "/usr/grte/v1"
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "darwin-no-dyn-linker"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "darwin"
-  target_libc: "macosx"
-  compiler: "compiler_no_dyn_linker"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "/usr/bin/libtool"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/include"
-  cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
-  cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"
-  cxx_builtin_include_directory: "/opt/local/include"
-  cxx_builtin_include_directory: "/Library/Developer/CommandLineTools"
-  builtin_sysroot: ""
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "local_ios"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "ios_x86_64"
-  target_libc: "ios"
-  compiler: "compiler"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "/usr/bin/libtool"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/include"
-  cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
-  cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"
-  cxx_builtin_include_directory: "/opt/local/include"
-  cxx_builtin_include_directory: "/Library/Developer/CommandLineTools"
-  builtin_sysroot: ""
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "local_windows_mingw"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "k8"
-  target_libc: "local"
-  compiler: "windows_mingw"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "C:/mingw/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "C:/mingw/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "C:/mingw/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "C:/mingw/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "C:/mingw/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "C:/mingw/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "C:/mingw/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "C:/mingw/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "C:/mingw/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "C:/mingw/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "C:/mingw/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "C:/mingw/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "C:/mingw/include"
-  cxx_builtin_include_directory: "C:/mingw/lib/gcc"
-  builtin_sysroot: ""
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "C:/mingw/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "local_windows_msys64_mingw64"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "k8"
-  target_libc: "local"
-  compiler: "windows_msys64_mingw64"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "C:/msys64/mingw64/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "C:/msys64/mingw64/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "C:/msys64/mingw64/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "C:/msys64/mingw64/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "C:/msys64/mingw64/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "C:/msys64/mingw64/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "C:/msys64/mingw64/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "C:/msys64/mingw64/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "C:/msys64/mingw64/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "C:/msys64/mingw64/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "C:/msys64/mingw64/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "C:/msys64/mingw64/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "C:/msys64/mingw64/x86_64-w64-mingw32/include"
-  builtin_sysroot: "/usr/grte/v1"
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "C:/msys64/mingw64/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "local_windows_clang"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "k8"
-  target_libc: "local"
-  compiler: "windows_clang"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "C:/mingw/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "C:/Program Files (x86)/LLVM/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "C:/Program Files (x86)/LLVM/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "C:/Program Files (x86)/LLVM/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "C:/Program Files (x86)/LLVM/bin/clang"
-  }
-  tool_path {
-    name: "gcov"
-    path: "C:/Program Files (x86)/LLVM/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "C:/Program Files (x86)/LLVM/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "C:/Program Files (x86)/LLVM/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "C:/Program Files (x86)/LLVM/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "C:/Program Files (x86)/LLVM/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "C:/Program Files (x86)/LLVM/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "C:/Program Files (x86)/LLVM/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "/usr/lib/gcc/"
-  cxx_builtin_include_directory: "/usr/local/include"
-  cxx_builtin_include_directory: "/usr/include"
-  builtin_sysroot: ""
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=c++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "C:/Program Files (x86)/LLVM/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "stub_armeabi-v7a"
-  host_system_name: "armeabi-v7a"
-  target_system_name: "armeabi-v7a"
-  target_cpu: "armeabi-v7a"
-  target_libc: "armeabi-v7a"
-  compiler: "compiler"
-  abi_version: "armeabi-v7a"
-  abi_libc_version: "armeabi-v7a"
-  tool_path {
-    name: "ar"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "cpp"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "dwp"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "gcc"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "gcov"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "ld"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "nm"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "objdump"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "strip"
-    path: "/bin/false"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "/bin/false"
-  }
-  builtin_sysroot: ""
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "supports_pic"
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "local_windows_msys64"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "x64_windows"
-  target_libc: "local"
-  compiler: "windows_msys64"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "C:/tools/msys64/usr/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "C:/tools/msys64/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "C:/tools/msys64/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "C:/tools/msys64/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "C:/tools/msys64/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "C:/tools/msys64/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "C:/tools/msys64/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "C:/tools/msys64/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "C:/tools/msys64/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "C:/tools/msys64/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "C:/tools/msys64/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "C:/tools/msys64/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "C:/tools/msys64/"
-  cxx_builtin_include_directory: "/usr/"
-  builtin_sysroot: "/usr/grte/v1"
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=gnu++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "supports_dynamic_linker"
-    enabled: true
-  }
-  feature {
-    name: "supports_interface_shared_libraries"
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "C:/tools/msys64/usr/bin/objcopy"
-    }
-    enabled: true
-  }
-}
-toolchain {
-  toolchain_identifier: "windows_msys64-no-dyn-linker"
-  host_system_name: "local"
-  target_system_name: "local"
-  target_cpu: "x64_windows"
-  target_libc: "local"
-  compiler: "compiler_no_dyn_linker"
-  abi_version: "local"
-  abi_libc_version: "local"
-  tool_path {
-    name: "ar"
-    path: "C:/tools/msys64/usr/bin/ar"
-  }
-  tool_path {
-    name: "compat-ld"
-    path: "C:/tools/msys64/usr/bin/ld"
-  }
-  tool_path {
-    name: "cpp"
-    path: "C:/tools/msys64/usr/bin/cpp"
-  }
-  tool_path {
-    name: "dwp"
-    path: "C:/tools/msys64/usr/bin/dwp"
-  }
-  tool_path {
-    name: "gcc"
-    path: "C:/tools/msys64/usr/bin/gcc"
-  }
-  tool_path {
-    name: "gcov"
-    path: "C:/tools/msys64/usr/bin/gcov"
-  }
-  tool_path {
-    name: "ld"
-    path: "C:/tools/msys64/usr/bin/ld"
-  }
-  tool_path {
-    name: "nm"
-    path: "C:/tools/msys64/usr/bin/nm"
-  }
-  tool_path {
-    name: "objcopy"
-    path: "C:/tools/msys64/usr/bin/objcopy"
-  }
-  tool_path {
-    name: "objdump"
-    path: "C:/tools/msys64/usr/bin/objdump"
-  }
-  tool_path {
-    name: "strip"
-    path: "C:/tools/msys64/usr/bin/strip"
-  }
-  tool_path {
-    name: "llvm-profdata"
-    path: "C:/tools/msys64/usr/bin/llvm-profdata"
-  }
-  cxx_builtin_include_directory: "C:/tools/msys64/"
-  cxx_builtin_include_directory: "/usr/"
-  builtin_sysroot: ""
-  feature {
-    name: "default_compile_flags"
-    flag_set {
-      action: "linkstamp-compile"
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-std=gnu++0x"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "default_link_flags"
-    flag_set {
-      action: "c++-link-executable"
-      action: "c++-link-dynamic-library"
-      action: "c++-link-nodeps-dynamic-library"
-      flag_group {
-        flag: "-lstdc++"
-      }
-    }
-    enabled: true
-  }
-  feature {
-    name: "objcopy_embed_flags"
-    flag_set {
-      action: "objcopy_embed_data"
-      flag_group {
-        flag: "-I"
-        flag: "binary"
-      }
-    }
-    enabled: true
-  }
-  action_config {
-    config_name: "objcopy_embed_data"
-    action_name: "objcopy_embed_data"
-    tool {
-      tool_path: "C:/tools/msys64/usr/bin/objcopy"
-    }
-    enabled: true
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 444ce0d..d8a37f5 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -282,7 +282,7 @@
                     LoadingPhaseThreadsOption.class,
                     LoadingOptions.class),
                 ruleClassProvider.getConfigurationOptions()));
-    optionsParser.parse(new String[] {"--default_visibility=public" });
+    optionsParser.parse(new String[] {"--default_visibility=public", "--cpu=k8", "--host_cpu=k8"});
     optionsParser.parse(args);
     if (defaultFlags().contains(Flag.TRIMMED_CONFIGURATIONS)) {
       optionsParser.parse("--experimental_dynamic_configs=on");
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 1c99bdb..986a4e5 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -354,6 +354,10 @@
     allArgs.add("--stamp");  // Stamp is now defaulted to false.
     allArgs.add("--experimental_extended_sanity_checks");
     allArgs.add("--features=cc_include_scanning");
+    // Always default to k8, even on mac and windows. Tests that need different cpu should set it
+    // using {@link useConfiguration()} explicitly.
+    allArgs.add("--cpu=k8");
+    allArgs.add("--host_cpu=k8");
 
     optionsParser.parse(allArgs);
     optionsParser.parse(args);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index fcb3427..e39a45c 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -24,15 +24,12 @@
 public final class BazelMockCcSupport extends MockCcSupport {
   public static final BazelMockCcSupport INSTANCE = new BazelMockCcSupport();
 
-  private static final String MOCK_CROSSTOOL_PATH =
-      "com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL";
-
   /** Filter to remove implicit dependencies of C/C++ rules. */
   private static final Predicate<String> CC_LABEL_NAME_FILTER =
       new Predicate<String>() {
         @Override
         public boolean apply(String label) {
-          return !label.startsWith("@blaze_tools//tools/cpp/link_dynamic_library");
+          return !label.startsWith("//tools/cpp");
         }
       };
 
@@ -73,271 +70,7 @@
 
   @Override
   public void setup(MockToolsConfig config) throws IOException {
-    config.create(
-        "/bazel_tools_workspace/tools/cpp/BUILD",
-        "package(default_visibility=['//visibility:public'])",
-        "toolchain_type(name = 'toolchain_type')",
-        "cc_library(name = 'malloc')",
-        "cc_toolchain_suite(",
-        "    name = 'toolchain',",
-        "    toolchains = {",
-        "      'local': ':cc-compiler-local',",
-        "      'k8': ':cc-compiler-k8',",
-        "      'piii': ':cc-compiler-piii-gcc-4.4.0',",
-        "      'darwin': ':cc-compiler-darwin',",
-        "      'ios_x86_64': ':cc-compiler-ios_x86_64',",
-        "      'armeabi-v7a': ':cc-compiler-armeabi-v7a',",
-        "      'x64_windows': ':cc-compiler-x64_windows',",
-        "      'ppc': ':cc-compiler-ppc',",
-        "      'local|compiler': ':cc-compiler-local',",
-        "      'k8|compiler': ':cc-compiler-k8',",
-        "      'k8|compiler_no_dyn_linker': ':cc-no-dyn-linker-k8',",
-        "      'piii|compiler': ':cc-compiler-piii-gcc-4.4.0',",
-        "      'darwin|compiler': ':cc-compiler-darwin',",
-        "      'darwin|compiler_no_dyn_linker': ':cc-no-dyn-linker-darwin',",
-        "      'ios_x86_64|compiler': ':cc-compiler-ios_x86_64',",
-        "      'armeabi-v7a|compiler': ':cc-compiler-armeabi-v7a',",
-        "      'x64_windows|windows_msys64': ':cc-compiler-x64_windows',",
-        "      'x64_windows|compiler_no_dyn_linker': ':cc-no-dyn-linker-x64_windows',",
-        "      'ppc|compiler': ':cc-compiler-ppc',",
-        "    })",
-        "cc_toolchain(name = 'cc-compiler-local', all_files = ':empty', compiler_files = ':empty',",
-        "    toolchain_identifier = 'toolchain-identifier-local',",
-        "    cpu = 'local',",
-        "    compiler = 'compiler',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-local',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:linux',",
-        "    ],",
-        "    toolchain = ':cc-compiler-local',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-compiler-k8', all_files = ':empty', compiler_files = ':empty',",
-        "    toolchain_identifier = 'toolchain-identifier-k8',",
-        "    cpu = 'k8',",
-        "    compiler = 'compiler',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-k8',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:linux',",
-        "    ],",
-        "    toolchain = ':cc-compiler-k8',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-no-dyn-linker-k8', all_files = ':empty', ",
-        "    compiler_files = ':empty', cpu = 'k8', compiler = 'compiler_no_dyn_linker', ",
-        "    dwp_files = ':empty', dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-no-dyn-linker-k8',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:linux',",
-        "    ],",
-        "    toolchain = ':cc-no-dyn-linker-k8',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-compiler-ppc', all_files = ':empty', compiler_files = ':empty',",
-        "    cpu = 'ppc',",
-        "    compiler = 'compiler',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-ppc',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:ppc',",
-        "        '@bazel_tools//platforms:linux',",
-        "    ],",
-        "    toolchain = ':cc-compiler-ppc',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-compiler-piii-gcc-4.4.0',",
-        "    all_files = ':all-files-piii',",
-        "    compiler_files = ':compiler-files-piii',",
-        "    cpu = 'piii',",
-        "    compiler = 'compiler',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-piii',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_32',",
-        "        '@bazel_tools//platforms:linux',",
-        "    ],",
-        "    toolchain = ':cc-compiler-piii-gcc-4.4.0',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-compiler-darwin', all_files = ':empty', ",
-        "    compiler_files = ':empty',",
-        "    cpu = 'darwin',",
-        "    compiler = 'compiler',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-darwin',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:osx',",
-        "    ],",
-        "    toolchain = ':cc-compiler-darwin',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-no-dyn-linker-darwin', all_files = ':empty', ",
-        "    compiler_files = ':empty',",
-        "    cpu = 'darwin',",
-        "    compiler = 'compiler_no_dyn_linker',",
-        "    dwp_files = ':empty', dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-no-dyn-linker-darwin',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:osx',",
-        "    ],",
-        "    toolchain = ':cc-no-dyn-linker-darwin',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-compiler-ios_x86_64', all_files = ':empty', ",
-        "    compiler_files = ':empty',",
-        "    cpu = 'ios_x86_64',",
-        "    compiler = 'compiler',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-ios_x86_64',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:ios',",
-        "    ],",
-        "    toolchain = ':cc-compiler-ios_x86_64',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-compiler-armeabi-v7a', all_files = ':empty', ",
-        "    compiler_files = ':empty',",
-        "    cpu = 'armeabi-v7a',",
-        "    compiler = 'compiler',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-armeabi-v7a',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:arm',",
-        "        '@bazel_tools//platforms:android',",
-        "    ],",
-        "    toolchain = ':cc-compiler-armeabi-v7a',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-compiler-x64_windows', all_files = ':empty', ",
-        "    compiler_files = ':empty',",
-        "    cpu = 'x64_windows',",
-        "    compiler = 'windows_msys64',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-x64_windows',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:windows',",
-        "    ],",
-        "    toolchain = ':cc-compiler-x64_windows',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "cc_toolchain(name = 'cc-no-dyn-linker-x64_windows', all_files = ':empty', ",
-        "    compiler_files = ':empty',",
-        "    cpu = 'x64_windows',",
-        "    compiler = 'compiler_no_dyn_linker',",
-        "    dwp_files = ':empty',",
-        "    dynamic_runtime_lib = ':empty', ",
-        "    ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
-        "    module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
-        "    objcopy_files = ':empty', static_runtime_lib = ':empty', strip_files = ':empty',",
-        ")",
-        "toolchain(name = 'cc-toolchain-no-dyn-linker-x64_windows',",
-        // Needs to be compatible with all execution environments for tests to work properly.
-        "    exec_compatible_with = [],",
-        "    target_compatible_with = [",
-        "        '@bazel_tools//platforms:x86_64',",
-        "        '@bazel_tools//platforms:windows',",
-        "    ],",
-        "    toolchain = ':cc-no-dyn-linker-x64_windows',",
-        "    toolchain_type = ':toolchain_type',",
-        ")",
-        "filegroup(",
-        "    name = 'interface_library_builder',",
-        "    srcs = ['build_interface_so'],",
-        ")",
-        "filegroup(",
-        "    name = 'link_dynamic_library',",
-        "    srcs = ['link_dynamic_library.sh'],",
-        ")",
-        "cc_toolchain_alias(name = 'current_cc_toolchain')",
-        "filegroup(",
-        "    name = 'crosstool',",
-        "    srcs = [':current_cc_toolchain'],",
-        ")");
-    config.create(
-        "/bazel_tools_workspace/tools/cpp/CROSSTOOL",
-        readCrosstoolFile());
-    if (config.isRealFileSystem()) {
-      config.linkTool("tools/cpp/link_dynamic_library.sh");
-    } else {
-      config.create("tools/cpp/link_dynamic_library.sh", "");
-    }
+    setupCrosstool(config);
     MockPlatformSupport.setup(
         config, "/bazel_tools_workspace/platforms", "/local_config_platform_workspace");
   }
@@ -353,11 +86,6 @@
   }
 
   @Override
-  public String readCrosstoolFile() throws IOException {
-    return ResourceLoader.readFromResources(MOCK_CROSSTOOL_PATH);
-  }
-
-  @Override
   public String getMockCrosstoolPath() {
     return "/bazel_tools_workspace/tools/cpp/";
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
index d1fbf35..9723b73 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
@@ -15,6 +15,7 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
 import com.google.protobuf.TextFormat;
@@ -39,11 +40,7 @@
   private final String crosstoolTop;
   private String version;
   private String crosstoolFileContents;
-  private boolean addEmbeddedRuntimes;
-  private String staticRuntimeLabelOrNull;
-  private String dynamicRuntimeLabelOrNull;
   private ImmutableList<String> archs;
-  private boolean addModuleMap;
   private boolean supportsHeaderParsing;
 
   Crosstool(MockToolsConfig config, String crosstoolTop) {
@@ -51,11 +48,6 @@
     this.crosstoolTop = crosstoolTop;
   }
 
-  public Crosstool setAddModuleMap(boolean addModuleMap) {
-    this.addModuleMap = addModuleMap;
-    return this;
-  }
-
   public Crosstool setCrosstoolFile(String version, String crosstoolFileContents) {
     this.version = version;
     this.crosstoolFileContents = crosstoolFileContents;
@@ -72,14 +64,6 @@
     return this;
   }
 
-  public Crosstool setEmbeddedRuntimes(
-      boolean addEmbeddedRuntimes, String staticRuntimesLabel, String dynamicRuntimesLabel) {
-    this.addEmbeddedRuntimes = addEmbeddedRuntimes;
-    this.staticRuntimeLabelOrNull = staticRuntimesLabel;
-    this.dynamicRuntimeLabelOrNull = dynamicRuntimesLabel;
-    return this;
-  }
-
   public void write() throws IOException {
     Set<String> runtimes = new HashSet<>();
     StringBuilder compilationTools = new StringBuilder();
@@ -108,15 +92,18 @@
     Set<String> seenCpus = new LinkedHashSet<>();
     StringBuilder compilerMap = new StringBuilder();
     for (CToolchain toolchain : toolchainList) {
+      boolean hasStaticLinkCppRuntimesFeature =
+          toolchain.getFeatureList().stream()
+              .anyMatch(f -> f.getName().equals(CppRuleClasses.STATIC_LINK_CPP_RUNTIMES));
       String staticRuntimeLabel =
-          staticRuntimeLabelOrNull != null
-              ? staticRuntimeLabelOrNull
-              : toolchain.getStaticRuntimesFilegroup();
+          hasStaticLinkCppRuntimesFeature
+              ? "mock-static-runtimes-target-for-" + toolchain.getToolchainIdentifier()
+              : null;
       String dynamicRuntimeLabel =
-          dynamicRuntimeLabelOrNull != null
-              ? dynamicRuntimeLabelOrNull
-              : toolchain.getDynamicRuntimesFilegroup();
-      if (!staticRuntimeLabel.isEmpty()) {
+          hasStaticLinkCppRuntimesFeature
+              ? "mock-dynamic-runtimes-target-for-" + toolchain.getToolchainIdentifier()
+              : null;
+      if (staticRuntimeLabel != null) {
         runtimes.add(
             Joiner.on('\n')
                 .join(
@@ -126,7 +113,7 @@
                     "  srcs = ['libstatic-runtime-lib-source.a'])",
                     ""));
       }
-      if (!dynamicRuntimeLabel.isEmpty()) {
+      if (dynamicRuntimeLabel != null) {
         runtimes.add(
             Joiner.on('\n')
                 .join(
@@ -166,7 +153,7 @@
                   "  name = 'cc-compiler-" + suffix + "',",
                   "  toolchain_identifier = '" + toolchain.getToolchainIdentifier() + "',",
                   "  output_licenses = ['unencumbered'],",
-                  addModuleMap ? "    module_map = 'crosstool.cppmap'," : "",
+                  "  module_map = 'crosstool.cppmap',",
                   "  cpu = '" + toolchain.getTargetCpu() + "',",
                   "  compiler = '" + toolchain.getCompiler() + "',",
                   "  ar_files = 'ar-" + toolchain.getTargetCpu() + "',",
@@ -179,10 +166,10 @@
                   "  all_files = ':every-file',",
                   "  licenses = ['unencumbered'],",
                   supportsHeaderParsing ? "    supports_header_parsing = 1," : "",
-                  dynamicRuntimeLabel.isEmpty()
+                  dynamicRuntimeLabel == null
                       ? ""
                       : "    dynamic_runtime_lib = '" + dynamicRuntimeLabel + "',",
-                  staticRuntimeLabel.isEmpty()
+                  staticRuntimeLabel == null
                       ? ""
                       : "    static_runtime_lib = '" + staticRuntimeLabel + "',",
                   ")",
@@ -207,10 +194,8 @@
                     "cc_toolchain_suite(name = 'everything', toolchains = {%s})", compilerMap),
                 "",
                 String.format(
-                    "filegroup(name = 'every-file', srcs = ['%s'%s%s])",
-                    Joiner.on("', '").join(CROSSTOOL_BINARIES),
-                    addEmbeddedRuntimes ? ", ':dynamic-runtime-libs-k8'" : "",
-                    addEmbeddedRuntimes ? ", ':static-runtime-libs-k8'" : ""),
+                    "filegroup(name = 'every-file', srcs = ['%s'])",
+                    Joiner.on("', '").join(CROSSTOOL_BINARIES)),
                 "",
                 compilationTools.toString(),
                 Joiner.on("\n").join(runtimes),
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index 9b06bb3..b8b7e1b 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -63,9 +63,9 @@
       "feature { name: '" + CppRuleClasses.DYNAMIC_LINKING_MODE + "'}";
 
   public static final String SUPPORTS_DYNAMIC_LINKER_FEATURE =
-      "feature { name: '" + CppRuleClasses.SUPPORTS_DYNAMIC_LINKER + " enabled: true'}";
+      "feature { name: '" + CppRuleClasses.SUPPORTS_DYNAMIC_LINKER + "' enabled: true}";
 
-  public static final String SUPPORTS_INTERFACE_SHARED_LIBRARIES =
+  public static final String SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE =
       "feature { name: '" + CppRuleClasses.SUPPORTS_INTERFACE_SHARED_LIBRARIES + "' enabled: true}";
 
   /** Feature expected by the C++ rules when pic build is requested */
@@ -73,12 +73,15 @@
       ""
           + "feature {"
           + "  name: 'pic'"
+          + "  enabled: true"
           + "  flag_set {"
+          + "    action: 'assemble'"
+          + "    action: 'preprocess-assemble'"
+          + "    action: 'linkstamp-compile'"
           + "    action: 'c-compile'"
           + "    action: 'c++-compile'"
           + "    action: 'c++-module-codegen'"
           + "    action: 'c++-module-compile'"
-          + "    action: 'preprocess-assemble'"
           + "    flag_group {"
           + "      expand_if_all_available: 'pic'"
           + "      flag: '-fPIC'"
@@ -126,6 +129,7 @@
           + "}"
           + "feature {"
           + "  name: 'header_module_compile'"
+          + "  enabled: true"
           + "  implies: 'module_maps'"
           + "  flag_set {"
           + "    action: 'c++-module-compile'"
@@ -146,6 +150,7 @@
           + "}"
           + "feature {"
           + "  name: 'module_maps'"
+          + "  enabled: true"
           + "  flag_set {"
           + "    action: 'c-compile'"
           + "    action: 'c++-compile'"
@@ -171,9 +176,24 @@
           + "  }"
           + "}";
 
-  /**
-   * A feature configuration snippet useful for testing environment variables.
-   */
+  public static final String MODULE_MAP_HOME_CWD_FEATURE =
+      ""
+          + "feature {"
+          + "  name: 'module_map_home_cwd'"
+          + "  enabled: true"
+          + "  flag_set {"
+          + "    action: 'c-compile'"
+          + "    action: 'c++-compile'"
+          + "    action: 'c++-header-parsing'"
+          + "    action: 'c++-module-compile'"
+          + "    action: 'preprocess-assemble'"
+          + "    flag_group {"
+          + "      flag: '<flag>'"
+          + "    }"
+          + "  }"
+          + "}";
+
+  /** A feature configuration snippet useful for testing environment variables. */
   public static final String ENV_VAR_FEATURE_CONFIGURATION =
       ""
           + "feature {"
@@ -196,6 +216,7 @@
           + "}"
           + "feature {"
           + "  name: 'module_maps'"
+          + "  enabled: true"
           + "  env_set {"
           + "    action: 'c-compile'"
           + "    action: 'c++-compile'"
@@ -419,7 +440,10 @@
       "" + "feature { name: 'copy_dynamic_libraries_to_binary' }";
 
   public static final String SUPPORTS_START_END_LIB_FEATURE =
-      "" + "feature {" + "   name: 'supports_start_end_lib'" + "   enabled: true" + "}";
+      "" + "feature { name: 'supports_start_end_lib' enabled: true }";
+
+  public static final String SUPPORTS_PIC_FEATURE =
+      "" + "feature { name: 'supports_pic' enabled: true }";
 
   public static final String TARGETS_WINDOWS_CONFIGURATION =
       ""
@@ -470,6 +494,29 @@
       emptyActionConfigFor(CppActionNames.CLIF_MATCH);
 
   public static final String EMPTY_STRIP_ACTION_CONFIG = emptyActionConfigFor(CppActionNames.STRIP);
+  public static final String STATIC_LINK_CPP_RUNTIMES_FEATURE =
+      "feature { name: 'static_link_cpp_runtimes' enabled: true }";
+  public static final String EMPTY_CROSSTOOL =
+      "major_version: 'foo'\nminor_version:' foo'\n" + emptyToolchainForCpu("k8");
+
+  public static String emptyToolchainForCpu(String cpu, String... append) {
+    return Joiner.on("\n")
+        .join(
+            ImmutableList.builder()
+                .add(
+                    "toolchain {",
+                    "  toolchain_identifier: 'mock-llvm-toolchain-" + cpu + "'",
+                    "  host_system_name: 'mock-system-name-for-" + cpu + "'",
+                    "  target_system_name: 'mock-target-system-name-for-" + cpu + "'",
+                    "  target_cpu: '" + cpu + "'",
+                    "  target_libc: 'mock-libc-for-" + cpu + "'",
+                    "  compiler: 'mock-compiler-for-" + cpu + "'",
+                    "  abi_version: 'mock-abi-version-for-" + cpu + "'",
+                    "  abi_libc_version: 'mock-abi-libc-for-" + cpu + "'")
+                .addAll(ImmutableList.copyOf(append))
+                .add("}")
+                .build());
+  }
 
   /**
    * Creates action_config for {@code actionName} action using DUMMY_TOOL that doesn't imply any
@@ -548,10 +595,6 @@
    */
   public abstract void setup(MockToolsConfig config) throws IOException;
 
-  public void setupCrosstoolWithEmbeddedRuntimes(MockToolsConfig config) throws IOException {
-    createCrosstoolPackage(config, /* addEmbeddedRuntimes= */ true);
-  }
-
   /**
    * Creates a crosstool package by merging {@code toolchain} with the default mock CROSSTOOL file.
    *
@@ -560,120 +603,28 @@
    */
   public void setupCrosstool(MockToolsConfig config, String... partialToolchain)
       throws IOException {
-    CToolchain.Builder toolchainBuilder = CToolchain.newBuilder();
-    TextFormat.merge(Joiner.on("\n").join(partialToolchain), toolchainBuilder);
-    setupCrosstool(config, toolchainBuilder.buildPartial());
-  }
-
-  /**
-   * Creates a crosstool package by merging {@code toolchain} with the default mock CROSSTOOL file.
-   */
-  public void setupCrosstool(MockToolsConfig config, CToolchain toolchain) throws IOException {
-    createCrosstoolPackage(
-        config,
-        /* addEmbeddedRuntimes= */ false,
-        /* addModuleMap= */ true,
-        /* staticRuntimesLabel= */ null,
-        /* dynamicRuntimesLabel= */ null,
-        toolchain);
-  }
-
-  /**
-   * Create a crosstool package. For integration tests, it actually links in a working crosstool,
-   * for all other tests, it only creates a dummy package, with a working CROSSTOOL file.
-   *
-   * <p>If <code>addEmbeddedRuntimes</code> is true, it also adds filegroups for the embedded
-   * runtimes.
-   */
-  public void setupCrosstool(
-      MockToolsConfig config,
-      boolean addEmbeddedRuntimes,
-      boolean addModuleMap,
-      String staticRuntimesLabel,
-      String dynamicRuntimesLabel,
-      CToolchain toolchain)
-      throws IOException {
-    createCrosstoolPackage(
-        config,
-        addEmbeddedRuntimes,
-        addModuleMap,
-        staticRuntimesLabel,
-        dynamicRuntimesLabel,
-        toolchain);
+    setupCrosstool(config, /* appendToCurrentToolchain= */ true, partialToolchain);
   }
 
   public void setupCrosstool(
-      MockToolsConfig config,
-      boolean addEmbeddedRuntimes,
-      boolean addModuleMap,
-      String staticRuntimesLabel,
-      String dynamicRuntimesLabel,
-      String crosstool)
+      MockToolsConfig config, boolean appendToCurrentToolchain, String... partialToolchain)
       throws IOException {
+    String toolchainString = Joiner.on("\n").join(partialToolchain);
+    String crosstoolFile;
+    if (appendToCurrentToolchain) {
+      CToolchain.Builder toolchainBuilder = CToolchain.newBuilder();
+      TextFormat.merge(toolchainString, toolchainBuilder);
+      crosstoolFile = mergeCrosstoolConfig(readCrosstoolFile(), toolchainBuilder.buildPartial());
+    } else {
+      crosstoolFile = readCrosstoolFile() + toolchainString;
+    }
     createCrosstoolPackage(
         config,
-        addEmbeddedRuntimes,
-        addModuleMap,
-        staticRuntimesLabel,
-        dynamicRuntimesLabel,
-        crosstool);
-  }
-
-  public void setupCrosstoolWithRelease(MockToolsConfig config, String crosstool)
-      throws IOException {
-    createCrosstoolPackage(config, false, true, null, null, crosstool);
-  }
-
-  protected void createCrosstoolPackage(MockToolsConfig config, boolean addEmbeddedRuntimes)
-      throws IOException {
-    createCrosstoolPackage(
-        config,
-        addEmbeddedRuntimes,
-        /* addModuleMap= */ true,
-        /* staticRuntimesLabel= */ null,
-        /* dynamicRuntimesLabel= */ null);
-  }
-
-  private void createCrosstoolPackage(
-      MockToolsConfig config,
-      boolean addEmbeddedRuntimes,
-      boolean addModuleMap,
-      String staticRuntimesLabel,
-      String dynamicRuntimesLabel)
-      throws IOException {
-    createCrosstoolPackage(
-        config,
-        addEmbeddedRuntimes,
-        addModuleMap,
-        staticRuntimesLabel,
-        dynamicRuntimesLabel,
-        readCrosstoolFile());
-  }
-
-  private void createCrosstoolPackage(
-      MockToolsConfig config,
-      boolean addEmbeddedRuntimes,
-      boolean addModuleMap,
-      String staticRuntimesLabel,
-      String dynamicRuntimesLabel,
-      CToolchain toolchain)
-      throws IOException {
-    String crosstoolFile = mergeCrosstoolConfig(readCrosstoolFile(), toolchain);
-    createCrosstoolPackage(
-        config,
-        addEmbeddedRuntimes,
-        addModuleMap,
-        staticRuntimesLabel,
-        dynamicRuntimesLabel,
         crosstoolFile);
   }
 
   protected void createCrosstoolPackage(
       MockToolsConfig config,
-      boolean addEmbeddedRuntimes,
-      boolean addModuleMap,
-      String staticRuntimesLabel,
-      String dynamicRuntimesLabel,
       String crosstoolFile)
       throws IOException {
     String crosstoolTop = getCrosstoolTopPathForConfig(config);
@@ -681,10 +632,8 @@
       config.linkTools(getRealFilesystemTools(crosstoolTop));
     } else {
       new Crosstool(config, crosstoolTop)
-          .setEmbeddedRuntimes(addEmbeddedRuntimes, staticRuntimesLabel, dynamicRuntimesLabel)
           .setCrosstoolFile(getMockCrosstoolVersion(), crosstoolFile)
           .setSupportedArchs(getCrosstoolArchs())
-          .setAddModuleMap(addModuleMap)
           .setSupportsHeaderParsing(true)
           .write();
     }
@@ -711,12 +660,15 @@
     }
   }
 
+  protected String readCrosstoolFile() throws IOException {
+    return ResourceLoader.readFromResources(
+        "com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL");
+  }
+
   public abstract String getMockCrosstoolVersion();
 
   public abstract Label getMockCrosstoolLabel();
 
-  public abstract String readCrosstoolFile() throws IOException;
-
   protected abstract ImmutableList<String> getCrosstoolArchs();
 
   protected abstract String[] getRealFilesystemTools(String crosstoolTop);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java
index 30f8a3b..85786da 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java
@@ -128,8 +128,8 @@
     }
   }
 
-  /** Adds a mock piii platform. */
-  public static void addMockPiiiPlatform(MockToolsConfig mockToolsConfig, Label crosstoolLabel)
+  /** Adds a mock K8 platform. */
+  public static void addMockK8Platform(MockToolsConfig mockToolsConfig, Label crosstoolLabel)
       throws Exception {
     mockToolsConfig.create(
         "mock_platform/BUILD",
@@ -137,15 +137,14 @@
         "constraint_setting(name = 'mock_setting')",
         "constraint_value(name = 'mock_value', constraint_setting = ':mock_setting')",
         "platform(",
-        "   name = 'mock-piii-platform',",
+        "   name = 'mock-k8-platform',",
         "   constraint_values = [':mock_value'],",
         ")",
         "toolchain(",
-        "   name = 'toolchain_cc-compiler-piii',",
+        "   name = 'toolchain_cc-compiler-k8',",
         "   toolchain_type = '" + TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain_type',",
         "   toolchain = '"
-            + crosstoolLabel.getRelativeWithRemapping(
-                "cc-compiler-piii-compiler", ImmutableMap.of())
+            + crosstoolLabel.getRelativeWithRemapping("cc-compiler-k8-compiler", ImmutableMap.of())
             + "',",
         "   target_compatible_with = [':mock_value'],",
         ")");
diff --git a/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java b/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java
index 9171f65..b7b0d2e 100644
--- a/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java
+++ b/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java
@@ -518,13 +518,8 @@
             .filter(action -> action.getMnemonic().equals("CppCompileActionTemplate"))
             .collect(Collectors.toList());
 
-    // Darwin and Windows only produce 1 CppCompileActionTemplate with PIC,
-    // while Linux has both PIC and non-PIC CppCompileActionTemplates
-    int expectedActionsCount =
-        (OS.getCurrent() == OS.DARWIN || OS.getCurrent() == OS.WINDOWS) ? 1 : 2;
-
     // Verify that we have the appropriate number of CppCompileActionTemplates.
-    assertThat(cppCompileActionTemplates).hasSize(expectedActionsCount);
+    assertThat(cppCompileActionTemplates).hasSize(1);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
index 6b7df86..1ee808b 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.ImportDepsCheckingLevel;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -122,6 +123,12 @@
         "    jars = ['baz.jar'],",
         "    constraints = ['android'],",
         ")");
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMultidexTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMultidexTest.java
index 9153f0d..78557e0 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMultidexTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMultidexTest.java
@@ -13,7 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.rules.android;
 
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.MultidexMode;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -24,6 +26,16 @@
 @RunWith(JUnit4.class)
 public class AndroidBinaryMultidexTest extends AndroidMultidexBaseTest {
 
+  @Before
+  public void setup() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
   /**
    * Tests that when multidex = "off", a classes.dex file is generated directly
    * from the input jar.
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index 6f39a89..80fb35f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -48,6 +48,7 @@
 import com.google.devtools.build.lib.packages.FileTarget;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.MultidexMode;
 import com.google.devtools.build.lib.rules.android.deployinfo.AndroidDeployInfoOuterClass.AndroidDeployInfo;
 import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
@@ -77,6 +78,16 @@
 public class AndroidBinaryTest extends AndroidBuildViewTestCase {
 
   @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
+  @Before
   public void createFiles() throws Exception {
     scratch.file("java/android/BUILD",
         "android_binary(name = 'app',",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java
index bb33ecb..f2a86e1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidCommonTest.java
@@ -16,6 +16,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.MultidexMode;
 import org.junit.Before;
 import org.junit.Test;
@@ -29,6 +30,16 @@
 public class AndroidCommonTest extends BuildViewTestCase {
 
   @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
+  @Before
   public final void createFile() throws Exception {
     scratch.file("java/srcs/a.properties", "foo");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java
index be8602d..1f36b80 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java
@@ -26,11 +26,13 @@
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.android.databinding.UsesDataBindingProvider;
 import com.google.devtools.build.lib.rules.java.JavaCompileAction;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -38,6 +40,16 @@
 /** Tests for Bazel's Android data binding support. */
 @RunWith(JUnit4.class)
 public class AndroidDataBindingTest extends AndroidBuildViewTestCase {
+  @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
   private void writeDataBindingFiles() throws Exception {
     scratch.file(
         "java/android/library/BUILD",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixtureTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixtureTest.java
index ceb0ad7..254d14a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixtureTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixtureTest.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,6 +29,16 @@
 public class AndroidDeviceScriptFixtureTest extends AndroidBuildViewTestCase {
 
   @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
+  @Before
   public void setup() throws Exception {
     scratch.file("scripts/BUILD", "exports_files(['my_script.sh'])");
     scratch.file(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixtureTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixtureTest.java
index aefd956..f232f9b 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixtureTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixtureTest.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -26,6 +27,15 @@
 /** Tests for {@link AndroidHostServiceFixture}. */
 @RunWith(JUnit4.class)
 public class AndroidHostServiceFixtureTest extends AndroidBuildViewTestCase {
+  @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
 
   @Before
   public void setup() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java
index f5358ea..f84161c 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import org.junit.Before;
 import org.junit.Test;
@@ -36,6 +37,16 @@
 public class AndroidInstrumentationTestTest extends AndroidBuildViewTestCase {
 
   @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
+  @Before
   public void setup() throws Exception {
     scratch.file(
         "java/com/app/BUILD",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
index 1006d6b..0bb335f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
@@ -46,6 +46,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.android.AndroidLibraryAarInfo.Aar;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
 import com.google.devtools.build.lib.rules.java.JavaCompilationInfoProvider;
@@ -60,6 +61,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -69,6 +71,15 @@
  */
 @RunWith(JUnit4.class)
 public class AndroidLibraryTest extends AndroidBuildViewTestCase {
+  @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
 
   @Test
   public void testSimpleLibrary() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java
index d4712bb..aa3ccd5 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java
@@ -22,9 +22,11 @@
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.FileProvider;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.java.JavaPrimaryClassProvider;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import java.util.List;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -33,6 +35,16 @@
 @RunWith(JUnit4.class)
 public abstract class AndroidLocalTestTest extends AbstractAndroidLocalTestTestBase {
 
+  @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
   @Test
   public void testSimpleTestNotNull() throws Exception {
     scratch.file(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
index a1a4232..a5f15fd 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
 import com.google.devtools.build.lib.rules.android.databinding.DataBinding;
 import com.google.devtools.build.lib.rules.android.databinding.DataBindingContext;
@@ -42,6 +43,16 @@
       ImmutableList.of(DEFAULT_RESOURCE_ROOT);
 
   @Before
+  public void setupCcToolchain() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain=*/ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
+  }
+
+  @Before
   @Test
   public void testGetResourceRootsNoResources() throws Exception {
     assertThat(getResourceRoots()).isEmpty();
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkTest.java
index 7957e5d..41d5dd5 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkTest.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.syntax.Runtime;
 import java.util.List;
 import java.util.Map;
@@ -59,6 +60,12 @@
 
   @Test
   public void testAndroidSplitTransition() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain= */ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
     writeAndroidSplitTransitionTestFiles();
 
     useConfiguration("--fat_apk_cpu=k8,armeabi-v7a");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
index d9c9e7f..90f6790 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -22,6 +22,7 @@
         "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
         "//src/test/java/com/google/devtools/build/lib:actions_testutil",
         "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:truth",
@@ -51,6 +52,7 @@
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//third_party:junit4",
         "//third_party:truth",
     ],
@@ -115,6 +117,7 @@
         "//src/main/java/com/google/devtools/build/lib:packages-internal",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:truth",
@@ -166,6 +169,7 @@
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/test/java/com/google/devtools/build/lib:actions_testutil",
         "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//src/test/java/com/google/devtools/build/lib:testutil",
         "//third_party:guava",
         "//third_party:junit4",
@@ -183,6 +187,7 @@
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/test/java/com/google/devtools/build/lib:actions_testutil",
         "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//src/test/java/com/google/devtools/build/lib:testutil",
         "//third_party:junit4",
         "//third_party:truth",
@@ -202,6 +207,7 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/test/java/com/google/devtools/build/lib:actions_testutil",
         "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//src/test/java/com/google/devtools/build/lib:testutil",
         "//third_party:guava",
         "//third_party:junit4",
@@ -227,6 +233,7 @@
         "//src/test/java/com/google/devtools/build/lib:actions_testutil",
         "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
         "//src/test/java/com/google/devtools/build/lib:java_compile_action_test_helper",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:truth",
@@ -303,6 +310,7 @@
         "//src/main/protobuf:extra_actions_base_java_proto",
         "//src/test/java/com/google/devtools/build/lib:actions_testutil",
         "//src/test/java/com/google/devtools/build/lib:java_compile_action_test_helper",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//src/test/java/com/google/devtools/build/lib:testutil",
         "//third_party:guava",
         "//third_party:junit4",
@@ -351,6 +359,7 @@
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
         "//src/test/java/com/google/devtools/build/lib:actions_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//src/test/java/com/google/devtools/build/lib:testutil",
         "//third_party:guava",
         "//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index c633106..9d76c5f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -28,33 +28,20 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.AnalysisUtils;
-import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.OutputGroupInfo;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
-import com.google.devtools.build.lib.analysis.mock.BazelAnalysisMock;
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider;
-import com.google.devtools.build.lib.bazel.rules.CcRules;
-import com.google.devtools.build.lib.bazel.rules.GenericRules;
-import com.google.devtools.build.lib.bazel.rules.ToolchainRules;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.util.MockCcSupport;
-import com.google.devtools.build.lib.packages.util.MockToolsConfig;
-import com.google.devtools.build.lib.rules.core.CoreRules;
-import com.google.devtools.build.lib.rules.platform.PlatformRules;
-import com.google.devtools.build.lib.rules.repository.CoreWorkspaceRules;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.ModifiedFileSet;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
-import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
-import com.google.devtools.common.options.InvocationPolicyEnforcer;
-import java.util.ArrayList;
 import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
@@ -261,11 +248,12 @@
 
   @Test
   public void testStartEndLib() throws Exception {
-    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig,
-        CrosstoolConfig.CToolchain.newBuilder().setSupportsStartEndLib(true).buildPartial());
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_START_END_LIB_FEATURE);
     useConfiguration(
         // Prevent Android from trying to setup ARM crosstool by forcing it on system cpu.
-        "--fat_apk_cpu=" + CrosstoolConfigurationHelper.defaultCpu(), "--start_end_lib");
+        "--fat_apk_cpu=k8", "--start_end_lib");
     scratch.file(
         "test/BUILD",
         "cc_library(name='lib',",
@@ -284,7 +272,9 @@
 
   @Test
   public void testStartEndLibThroughFeature() throws Exception {
-    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig);
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_START_END_LIB_FEATURE);
     useConfiguration("--start_end_lib");
     scratch.file(
         "test/BUILD",
@@ -302,6 +292,10 @@
 
   @Test
   public void testTempsWithDifferentExtensions() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
+    invalidatePackages();
     useConfiguration("--cpu=k8", "--save_temps");
     scratch.file(
         "ananas/BUILD",
@@ -322,8 +316,8 @@
    * Returns the {@link IterableSubject} for the {@link OutputGroupInfo#TEMP_FILES} generated when
    * {@code testTarget} is built for {@code cpu}.
    */
-  private IterableSubject assertTempsForTarget(String cpu, String testTarget) throws Exception {
-    useConfiguration("--cpu=" + cpu, "--host_cpu=" + cpu, "--save_temps");
+  private IterableSubject assertTempsForTarget(String testTarget) throws Exception {
+    useConfiguration("--save_temps");
     ConfiguredTarget target = getConfiguredTarget(testTarget);
     assertThat(target).isNotNull();
 
@@ -331,31 +325,39 @@
         ActionsTestUtil.baseArtifactNames(getOutputGroup(target, OutputGroupInfo.TEMP_FILES));
 
     // Return the IterableSubject for the temp files.
-    return assertThat(temps).named(cpu);
+    return assertThat(temps).named("k8");
   }
 
   @Test
-  public void testTempsForCc_k8() throws Exception {
-    assertTempsForTarget("k8", "//foo:foo").containsExactly("foo.pic.ii", "foo.pic.s");
+  public void testTempsForCcWithPic() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
+    invalidatePackages();
+    assertTempsForTarget("//foo:foo").containsExactly("foo.pic.ii", "foo.pic.s");
   }
 
   @Test
-  public void testTempsForCc_piii() throws Exception {
-    // PIII does not use PIC.
-    assertTempsForTarget("piii", "//foo:foo").containsExactly("foo.ii", "foo.s");
+  public void testTempsForCcWithoutPic() throws Exception {
+    assertTempsForTarget("//foo:foo").containsExactly("foo.ii", "foo.s");
   }
 
   @Test
-  public void testTempsForC_k8() throws Exception {
+  public void testTempsForCWithPic() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
+    invalidatePackages();
+    useConfiguration();
+
     scratch.file("csrc/BUILD", "cc_library(name='csrc', srcs=['foo.c'])");
-    assertTempsForTarget("k8", "//csrc:csrc").containsExactly("foo.pic.i", "foo.pic.s");
+    assertTempsForTarget("//csrc:csrc").containsExactly("foo.pic.i", "foo.pic.s");
   }
 
   @Test
-  public void testTempsForC_piii() throws Exception {
+  public void testTempsForCWithoutPic() throws Exception {
     scratch.file("csrc/BUILD", "cc_library(name='csrc', srcs=['foo.c'])");
-    // PIII does not use PIC.
-    assertTempsForTarget("piii", "//csrc:csrc").containsExactly("foo.i", "foo.s");
+    assertTempsForTarget("//csrc:csrc").containsExactly("foo.i", "foo.s");
   }
 
   @Test
@@ -377,11 +379,12 @@
    */
   @Test
   public void testNoCoptfPicOverride() throws Exception {
-    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig,
-        CrosstoolConfig.CToolchain.newBuilder().setNeedsPic(true).buildPartial());
-    useConfiguration(
-        // Prevent Android from trying to setup ARM crosstool by forcing it on system cpu.
-        "--fat_apk_cpu=" + CrosstoolConfigurationHelper.defaultCpu());
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE, MockCcSupport.PIC_FEATURE);
+    // Prevent Android from trying to setup ARM crosstool by forcing it on system cpu.
+    useConfiguration("--fat_apk_cpu=k8");
 
     scratch.file(
         "a/BUILD",
@@ -418,6 +421,11 @@
 
   @Test
   public void testPicModeAssembly() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE, MockCcSupport.PIC_FEATURE);
+    invalidatePackages();
     useConfiguration("--cpu=k8");
     scratch.file("a/BUILD", "cc_library(name='preprocess', srcs=['preprocess.S'])");
     List<String> argv = getCppCompileAction("//a:preprocess").getArguments();
@@ -709,7 +717,13 @@
 
   @Test
   public void testCcLibraryWithDashStaticOnDarwin() throws Exception {
-    assumeTrue(OS.getCurrent() == OS.DARWIN);
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain= */ false,
+            MockCcSupport.emptyToolchainForCpu("darwin"));
+    useConfiguration("--cpu=darwin");
     checkError(
         "badlib",
         "lib_with_dash_static",
@@ -965,7 +979,8 @@
             MockCcSupport.NO_LEGACY_FEATURES_FEATURE,
             MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
             MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
-            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG);
+            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
@@ -1015,7 +1030,8 @@
             MockCcSupport.NO_LEGACY_FEATURES_FEATURE,
             MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
             MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
-            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG);
+            MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--force_pic", "--cpu=k8");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
@@ -1052,74 +1068,4 @@
         "PIC compilation is requested but the toolchain does not support it"
             + " (feature named 'supports_pic' is not enabled");
   }
-
-  /**
-   * Tests for the case where there are only C++ rules defined.
-   */
-  @RunWith(JUnit4.class)
-  public static class OnlyCppRules extends CcCommonTest {
-
-    @Override
-    protected AnalysisMock getAnalysisMock() {
-      final AnalysisMock original = BazelAnalysisMock.INSTANCE;
-      return new AnalysisMock.Delegate(original) {
-        @Override
-        public ConfiguredRuleClassProvider createRuleClassProvider() {
-          ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
-          builder.setToolsRepository("@bazel_tools");
-          BazelRuleClassProvider.BAZEL_SETUP.init(builder);
-          CoreRules.INSTANCE.init(builder);
-          CoreWorkspaceRules.INSTANCE.init(builder);
-          PlatformRules.INSTANCE.init(builder);
-          ToolchainRules.INSTANCE.init(builder);
-          GenericRules.INSTANCE.init(builder);
-          CcRules.INSTANCE.init(builder);
-          return builder.build();
-        }
-
-        @Override
-        public InvocationPolicyEnforcer getInvocationPolicyEnforcer() {
-          return new InvocationPolicyEnforcer(null);
-        }
-
-        @Override
-        public boolean isThisBazel() {
-          return true;
-        }
-
-        @Override
-        public List<String> getWorkspaceContents(MockToolsConfig config) {
-          String bazelToolWorkspace = config.getPath("/bazel_tools_workspace").getPathString();
-          return new ArrayList<>(
-              ImmutableList.of(
-                  "local_repository(name = 'bazel_tools', path = '" + bazelToolWorkspace + "')",
-                  "local_repository(name = 'local_config_xcode', path = '/local_config_xcode')",
-                  "local_repository(name = 'com_google_protobuf', path = '/protobuf')",
-                  "bind(name = 'android/sdk', actual='@bazel_tools//tools/android:sdk')",
-                  "bind(name = 'tools/python', actual='//tools/python')",
-                  "register_toolchains('@bazel_tools//tools/cpp:all')"));
-        }
-      };
-    }
-
-    @Override
-    public void testNoCoptfPicOverride() throws Exception {
-      // Test sets --fat_apk_cpu, which doesn't exist.
-    }
-
-    @Override
-    public void testStartEndLib() throws Exception {
-      // Test sets --fat_apk_cpu, which doesn't exist.
-    }
-
-    @Override
-    public void testExpandLabelInLinkoptsAgainstSrc() throws Exception {
-      // genrule now requires JavaConfiguration, so isn't appropriate for OnlyCppRules.
-    }
-
-    @Override
-    public void testExpandedLinkopts() throws Exception {
-      // genrule now requires JavaConfiguration, so isn't appropriate for OnlyCppRules.
-    }
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCompileOnlyTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCompileOnlyTest.java
index 03f06b6..4755530 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCompileOnlyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCompileOnlyTest.java
@@ -17,7 +17,7 @@
 
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.CompileOnlyTestCase;
-
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -30,6 +30,9 @@
 
   @Test
   public void testCcCompileOnly() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8");
     scratch.file("package/BUILD",
         "cc_binary(name='foo', srcs=['foo.cc', ':bar'], deps = [':foolib'])",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
index 4814556..e34ef58 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
@@ -18,9 +18,9 @@
 
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
-import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -55,7 +55,7 @@
         "})",
         "cc_toolchain(",
         "    name = 'toolchain_b',",
-        "    toolchain_identifier = 'toolchain-identifier-k8',",
+        "    toolchain_identifier = 'mock-llvm-toolchain-k8',",
         "    cpu = 'ED-E',",
         "    all_files = ':banana',",
         "    ar_files = ':empty',",
@@ -65,7 +65,7 @@
         "    linker_files = ':empty',",
         "    strip_files = ':empty',",
         "    objcopy_files = ':empty')");
-    scratch.file("b/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
+    scratch.file("b/CROSSTOOL", MockCcSupport.EMPTY_CROSSTOOL);
 
     scratch.file("a/BUILD", "cc_host_toolchain_alias(name='current_cc_host_toolchain')");
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
index 0a77570..f1dc565 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -194,6 +194,12 @@
 
   @Test
   public void testFilesToBuild() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     useConfiguration("--cpu=k8");
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
     String cpu = getTargetConfiguration().getCpu();
@@ -260,7 +266,12 @@
 
   @Test
   public void testFilesToBuildWithInterfaceSharedObjects() throws Exception {
-    useConfiguration("--interface_shared_objects");
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     useConfiguration("--cpu=k8");
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
     String cpu = getTargetConfiguration().getCpu();
@@ -293,6 +304,12 @@
 
   @Test
   public void testSoName() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     // Without interface shared libraries.
     useConfiguration("--nointerface_shared_objects");
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
@@ -316,6 +333,12 @@
 
   @Test
   public void testCppLinkActionExtraActionInfoWithoutSharedLibraries() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     useConfiguration("--nointerface_shared_objects");
 
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
@@ -351,6 +374,9 @@
 
   @Test
   public void testCppLinkActionExtraActionInfoWithSharedLibraries() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     useConfiguration("--cpu=k8");
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
     Artifact sharedObject =
@@ -420,7 +446,9 @@
         .ccSupport()
         .setupCrosstool(
             mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
             MockCcSupport.COPY_DYNAMIC_LIBRARIES_TO_BINARY_CONFIGURATION,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE,
             MockCcSupport.TARGETS_WINDOWS_CONFIGURATION,
             "artifact_name_pattern {"
                 + "   category_name: 'object_file'"
@@ -452,8 +480,7 @@
                 + "   prefix: ''"
                 + "   extension: '.if.lib'"
                 + "}");
-
-    useConfiguration("--features=-supports_pic");
+    useConfiguration();
 
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
     Artifact helloObj =
@@ -537,6 +564,12 @@
 
   @Test
   public void testArtifactsToAlwaysBuild() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_PIC_FEATURE,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     useConfiguration("--cpu=k8");
     // ArtifactsToAlwaysBuild should apply both for static libraries.
     ConfiguredTarget helloStatic = getConfiguredTarget("//hello:hello_static");
@@ -555,6 +588,10 @@
 
   @Test
   public void testTransitiveArtifactsToAlwaysBuildStatic() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
+
     useConfiguration("--cpu=k8");
     ConfiguredTarget x = scratchConfiguredTarget(
         "foo", "x",
@@ -570,7 +607,10 @@
   public void testBuildHeaderModulesAsPrerequisites() throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION);
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8");
     ConfiguredTarget x =
 
@@ -589,7 +629,10 @@
   public void testCodeCoverage() throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION);
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8", "--collect_code_coverage");
     ConfiguredTarget x =
         scratchConfiguredTarget(
@@ -674,10 +717,10 @@
         .ccSupport()
         .setupCrosstool(
             mockToolsConfig,
-            ""
-                + "feature { name: 'header_modules' implies: 'use_header_modules' }"
-                + "feature { name: 'module_maps' }"
-                + "feature { name: 'use_header_modules' }");
+            MockCcSupport.SUPPORTS_PIC_FEATURE,
+            "feature { name: 'header_modules' implies: 'use_header_modules' }",
+            "feature { name: 'module_maps' enabled: true }",
+            "feature { name: 'use_header_modules' }");
     useConfiguration("--cpu=k8");
     scratch.file("module/BUILD",
         "package(features = ['header_modules'])",
@@ -721,7 +764,9 @@
 
   @Test
   public void testContainingSourcesWithSameBaseName() throws Exception {
-    AnalysisMock.get().ccSupport().setup(mockToolsConfig);
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8");
     setupPackagesForSourcesWithSameBaseNameTests();
     getConfiguredTarget("//foo:lib");
@@ -816,9 +861,12 @@
   public void testCompileHeaderModulesTransitively() throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION);
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8");
-    setupPackagesForModuleTests(/*useHeaderModules=*/false);
+    setupPackagesForModuleTests(/* useHeaderModules= */ false);
 
     // The //nomodule:f target only depends on non-module targets, thus it should be module-free.
     ConfiguredTarget nomoduleF = getConfiguredTarget("//nomodule:f");
@@ -895,9 +943,13 @@
   public void testCompileUsingHeaderModulesTransitively() throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION);
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.HEADER_MODULES_FEATURE_CONFIGURATION,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8");
-    setupPackagesForModuleTests( /*useHeaderModules=*/true);
+    setupPackagesForModuleTests(/* useHeaderModules= */ true);
+    invalidatePackages();
 
     ConfiguredTarget nomoduleF = getConfiguredTarget("//nomodule:f");
     Artifact fObjectArtifact =
@@ -946,7 +998,6 @@
         .ccSupport()
         .setupCrosstool(
             mockToolsConfig,
-            "needsPic: false",
             MockCcSupport.EMPTY_COMPILE_ACTION_CONFIG,
             MockCcSupport.EMPTY_EXECUTABLE_ACTION_CONFIG,
             MockCcSupport.EMPTY_DYNAMIC_LIBRARY_ACTION_CONFIG,
@@ -954,7 +1005,7 @@
             MockCcSupport.EMPTY_STATIC_LIBRARY_ACTION_CONFIG,
             MockCcSupport.EMPTY_STRIP_ACTION_CONFIG,
             MockCcSupport.NO_LEGACY_FEATURES_FEATURE);
-    useConfiguration();
+    useConfiguration("--features=-supports_pic");
     scratchConfiguredTarget("a", "a",
         "cc_binary(name='a', srcs=['a.cc'], deps=[':b'])",
         "cc_library(name='b', srcs=['b.cc'])");
@@ -982,7 +1033,7 @@
   public void testCppModuleMap() throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, "feature { name: 'module_maps' }");
+        .setupCrosstool(mockToolsConfig, "feature { name: 'module_maps' enabled: true }");
     useConfiguration();
     writeSimpleCcLibrary();
     CppModuleMapAction action = getCppModuleMapAction("//module:map");
@@ -1183,7 +1234,10 @@
       + "}";
 
   private List<String> getCompilationModeFlags(String... flags) throws Exception {
-    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig, COMPILATION_MODE_FEATURES);
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig, COMPILATION_MODE_FEATURES, MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration(flags);
     scratch.overwriteFile("mode/BUILD", "cc_library(name = 'a', srcs = ['a.cc'])");
     getConfiguredTarget("//mode:a");
@@ -1216,7 +1270,10 @@
       throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.HOST_AND_NONHOST_CONFIGURATION);
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.HOST_AND_NONHOST_CONFIGURATION,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     scratch.overwriteFile("mode/BUILD", "cc_library(name = 'a', srcs = ['a.cc'])");
     useConfiguration(
         "--cpu=k8",
@@ -1240,6 +1297,7 @@
 
   @Test
   public void testHostAndNonHostFeatures() throws Exception {
+    useConfiguration();
     List<String> flags;
 
     flags = getHostAndTargetFlags(/* useHost= */ true, /* isDisabledByFlag= */ false);
@@ -1349,6 +1407,12 @@
 
   @Test
   public void alwaysAddStaticAndDynamicLibraryToFilesToBuildWhenBuilding() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     useConfiguration("--cpu=k8");
     ConfiguredTarget target =
         scratchConfiguredTarget("a", "b", "cc_library(name = 'b', srcs = ['source.cc'])");
@@ -1417,7 +1481,9 @@
     AnalysisMock.get()
         .ccSupport()
         .setupCrosstool(
-            mockToolsConfig, MockCcSupport.COPY_DYNAMIC_LIBRARIES_TO_BINARY_CONFIGURATION);
+            mockToolsConfig,
+            MockCcSupport.COPY_DYNAMIC_LIBRARIES_TO_BINARY_CONFIGURATION,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     useConfiguration("--cpu=k8", "--features=copy_dynamic_libraries_to_binary");
     ConfiguredTarget target =
         scratchConfiguredTarget("a", "foo", "cc_library(name = 'foo', srcs = ['foo.cc'])");
@@ -1432,7 +1498,11 @@
 
   @Test
   public void testCcLinkParamsHasDynamicLibrariesForRuntimeWithoutCopyFeature() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     useConfiguration("--cpu=k8");
+    invalidatePackages();
     ConfiguredTarget target =
         scratchConfiguredTarget("a", "foo", "cc_library(name = 'foo', srcs = ['foo.cc'])");
     Iterable<Artifact> libraries =
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
index cbbad1b..bae9ebe 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
@@ -23,8 +23,7 @@
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
-import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.ToolPath;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -38,12 +37,7 @@
   public void testSkylarkCallables() throws Exception {
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder()
-                .setBuiltinSysroot("/usr/local/custom-sysroot")
-                .addToolPath(ToolPath.newBuilder().setName("ar").setPath("foo/ar/path").build())
-                .buildPartial());
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--cpu=k8", "--force_pic");
     scratch.file(
         "test/rule.bzl",
@@ -72,11 +66,11 @@
 
     ConfiguredTarget ct = getConfiguredTarget("//test:target");
 
-    assertThat((String) ct.get("ar_executable")).endsWith("foo/ar/path");
+    assertThat((String) ct.get("ar_executable")).endsWith("/usr/bin/mock-ar");
 
     assertThat(ct.get("cpu")).isEqualTo("k8");
 
-    assertThat(ct.get("sysroot")).isEqualTo("/usr/local/custom-sysroot");
+    assertThat(ct.get("sysroot")).isEqualTo("/usr/grte/v1");
 
     @SuppressWarnings("unchecked")
     boolean usePicForDynamicLibraries = (boolean) ct.get("use_pic_for_dynamic_libraries");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java
index a33eef1..99f13f9 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java
@@ -22,10 +22,8 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.analysis.util.ScratchAttributeWriter;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.packages.util.MockPlatformSupport;
 import com.google.devtools.build.lib.testutil.TestConstants;
-import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.ToolPath;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -37,7 +35,7 @@
 
   @Before
   public void setup() throws Exception {
-    MockPlatformSupport.addMockPiiiPlatform(
+    MockPlatformSupport.addMockK8Platform(
         mockToolsConfig, analysisMock.ccSupport().getMockCrosstoolLabel());
   }
 
@@ -46,12 +44,10 @@
 
   @Test
   public void testResolvedCcToolchain() throws Exception {
-    String crosstool = analysisMock.ccSupport().readCrosstoolFile();
-    getAnalysisMock().ccSupport().setupCrosstoolWithRelease(mockToolsConfig, crosstool);
     useConfiguration(
         "--incompatible_enable_cc_toolchain_resolution",
-        "--experimental_platforms=//mock_platform:mock-piii-platform",
-        "--extra_toolchains=//mock_platform:toolchain_cc-compiler-piii");
+        "--experimental_platforms=//mock_platform:mock-k8-platform",
+        "--extra_toolchains=//mock_platform:toolchain_cc-compiler-k8");
     ConfiguredTarget target =
         ScratchAttributeWriter.fromLabelString(this, "cc_library", "//lib")
             .setList("srcs", "a.cc")
@@ -62,17 +58,15 @@
                 .getToolchainContext()
                 .forToolchainType(Label.parseAbsolute(CPP_TOOLCHAIN_TYPE, ImmutableMap.of()));
     assertThat(Iterables.getOnlyElement(toolchain.getCompilerFiles()).getExecPathString())
-        .endsWith("piii");
+        .endsWith("k8");
   }
 
   @Test
   public void testToolchainSelectionWithPlatforms() throws Exception {
-    String crosstool = analysisMock.ccSupport().readCrosstoolFile();
-    getAnalysisMock().ccSupport().setupCrosstoolWithRelease(mockToolsConfig, crosstool);
     useConfiguration(
         "--incompatible_enable_cc_toolchain_resolution",
-        "--experimental_platforms=//mock_platform:mock-piii-platform",
-        "--extra_toolchains=//mock_platform:toolchain_cc-compiler-piii");
+        "--experimental_platforms=//mock_platform:mock-k8-platform",
+        "--extra_toolchains=//mock_platform:toolchain_cc-compiler-k8");
     ConfiguredTarget target =
         ScratchAttributeWriter.fromLabelString(this, "cc_library", "//lib")
             .setList("srcs", "a.cc")
@@ -82,7 +76,7 @@
             getRuleContext(target)
                 .getToolchainContext()
                 .forToolchainType(Label.parseAbsolute(CPP_TOOLCHAIN_TYPE, ImmutableMap.of()));
-    assertThat(toolchain.getToolchainIdentifier()).endsWith("piii");
+    assertThat(toolchain.getToolchainIdentifier()).endsWith("k8");
   }
 
   @Test
@@ -116,32 +110,4 @@
 
     // should not throw.
   }
-
-  @Test
-  public void testToolPaths() throws Exception {
-    String originalCrosstool = analysisMock.ccSupport().readCrosstoolFile();
-    String crosstoolWithPiiiLd =
-        MockCcSupport.applyToToolchain(
-            originalCrosstool,
-            "piii",
-            t -> t.addToolPath(ToolPath.newBuilder().setName("ld").setPath("piii-ld").build()));
-
-    getAnalysisMock().ccSupport().setupCrosstoolWithRelease(mockToolsConfig, crosstoolWithPiiiLd);
-
-    useConfiguration(
-        "--incompatible_enable_cc_toolchain_resolution",
-        "--experimental_platforms=//mock_platform:mock-piii-platform",
-        "--extra_toolchains=//mock_platform:toolchain_cc-compiler-piii");
-    ConfiguredTarget target =
-        ScratchAttributeWriter.fromLabelString(this, "cc_library", "//lib")
-            .setList("srcs", "a.cc")
-            .write();
-    CcToolchainProvider toolchain =
-        (CcToolchainProvider)
-            getRuleContext(target)
-                .getToolchainContext()
-                .forToolchainType(Label.parseAbsolute(CPP_TOOLCHAIN_TYPE, ImmutableMap.of()));
-    assertThat(toolchain.getToolPathFragment(CppConfiguration.Tool.LD).toString())
-        .contains("piii-ld");
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
index 9826a93..2172ad9 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
@@ -22,16 +22,16 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
-import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.packages.util.ResourceLoader;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
 import com.google.devtools.build.lib.testutil.TestConstants;
-import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
 import com.google.devtools.common.options.OptionsParsingException;
 import com.google.protobuf.TextFormat;
@@ -60,12 +60,8 @@
     scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
     getAnalysisMock()
         .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder()
-                .setSupportsInterfaceSharedObjects(false)
-                .buildPartial());
-    useConfiguration();
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
+    useConfiguration("--features=-supports_interface_shared_libraries");
     invalidatePackages();
 
     ConfiguredTarget target = getConfiguredTarget("//a:b");
@@ -78,7 +74,7 @@
                 FeatureConfiguration.EMPTY))
         .isFalse();
 
-    useConfiguration("--interface_shared_objects");
+    useConfiguration();
     invalidatePackages();
     target = getConfiguredTarget("//a:b");
     toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
@@ -89,25 +85,6 @@
                 FeatureConfiguration.EMPTY))
         .isFalse();
 
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder()
-                .setSupportsInterfaceSharedObjects(true)
-                .buildPartial());
-    useConfiguration();
-    invalidatePackages();
-
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(
-            CppHelper.useInterfaceSharedLibraries(
-                getConfiguration(target).getFragment(CppConfiguration.class),
-                toolchainProvider,
-                FeatureConfiguration.EMPTY))
-        .isTrue();
-
     useConfiguration("--nointerface_shared_objects");
     invalidatePackages();
     target = getConfiguredTarget("//a:b");
@@ -122,86 +99,75 @@
 
   @Test
   public void testFission() throws Exception {
-    scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
+    scratch.file("a/BUILD", "cc_library(name = 'a', srcs = ['a.cc'])");
 
     // Default configuration: disabled.
     getAnalysisMock()
         .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder().setSupportsFission(true).buildPartial());
+        .setupCrosstool(mockToolsConfig, MockCcSupport.PER_OBJECT_DEBUG_INFO_CONFIGURATION);
     useConfiguration();
-    ConfiguredTarget target = getConfiguredTarget("//a:b");
-    CcToolchainProvider toolchainProvider =
-        (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
 
-    assertThat(toolchainProvider.useFission()).isFalse();
+    assertThat(getCppCompileOutputs()).doesNotContain("yolo");
 
     // Mode-specific settings.
     useConfiguration("-c", "dbg", "--fission=dbg");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isTrue();
+    assertThat(getCppCompileOutputs()).contains("a.dwo");
 
     useConfiguration("-c", "dbg", "--fission=opt");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isFalse();
+    assertThat(getCppCompileOutputs()).doesNotContain("a.dwo");
 
     useConfiguration("-c", "dbg", "--fission=opt,dbg");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isTrue();
+    assertThat(getCppCompileOutputs()).contains("a.dwo");
 
     useConfiguration("-c", "fastbuild", "--fission=opt,dbg");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isFalse();
+    assertThat(getCppCompileOutputs()).doesNotContain("a.dwo");
 
     useConfiguration("-c", "fastbuild", "--fission=opt,dbg");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isFalse();
+    assertThat(getCppCompileOutputs()).doesNotContain("a.dwo");
 
     // Universally enabled
     useConfiguration("-c", "dbg", "--fission=yes");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isTrue();
+    assertThat(getCppCompileOutputs()).contains("a.dwo");
 
     useConfiguration("-c", "opt", "--fission=yes");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isTrue();
+    assertThat(getCppCompileOutputs()).contains("a.dwo");
 
     useConfiguration("-c", "fastbuild", "--fission=yes");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isTrue();
+    assertThat(getCppCompileOutputs()).contains("a.dwo");
 
     // Universally disabled
     useConfiguration("-c", "dbg", "--fission=no");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isFalse();
+    assertThat(getCppCompileOutputs()).doesNotContain("a.dwo");
 
     useConfiguration("-c", "opt", "--fission=no");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isFalse();
+    assertThat(getCppCompileOutputs()).doesNotContain("a.dwo");
 
     useConfiguration("-c", "fastbuild", "--fission=no");
-    target = getConfiguredTarget("//a:b");
-    toolchainProvider = (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    assertThat(toolchainProvider.useFission()).isFalse();
+    assertThat(getCppCompileOutputs()).doesNotContain("a.dwo");
+  }
+
+  private ImmutableList<String> getCppCompileOutputs() throws LabelSyntaxException {
+    RuleConfiguredTarget target = (RuleConfiguredTarget) getConfiguredTarget("//a:a");
+    return target.getActions().stream()
+        .filter(a -> a.getMnemonic().equals("CppCompile"))
+        .findFirst()
+        .get()
+        .getOutputs()
+        .stream()
+        .map(a -> a.getFilename())
+        .collect(ImmutableList.toImmutableList());
   }
 
   @Test
   public void testPic() throws Exception {
     scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
 
-    assertThat(usePicForBinariesWithConfiguration("--cpu=piii")).isFalse();
-    assertThat(usePicForBinariesWithConfiguration("--cpu=piii", "-c", "opt")).isFalse();
+    assertThat(usePicForBinariesWithConfiguration("--cpu=k8")).isFalse();
+    assertThat(usePicForBinariesWithConfiguration("--cpu=k8", "-c", "opt")).isFalse();
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
+    invalidatePackages();
     assertThat(usePicForBinariesWithConfiguration("--cpu=k8")).isTrue();
     assertThat(usePicForBinariesWithConfiguration("--cpu=k8", "-c", "opt")).isFalse();
   }
@@ -243,11 +209,7 @@
 
     getAnalysisMock()
         .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder()
-                .setSupportsEmbeddedRuntimes(true)
-                .buildPartial());
+        .setupCrosstool(mockToolsConfig, MockCcSupport.STATIC_LINK_CPP_RUNTIMES_FEATURE);
 
     useConfiguration();
 
@@ -277,7 +239,7 @@
         "    objcopy_files = ':empty',",
         "    dynamic_runtime_lib = ':empty',",
         "    static_runtime_lib = ':empty')");
-    scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
+    scratch.file("a/CROSSTOOL", MockCcSupport.EMPTY_CROSSTOOL);
 
     // Check defaults.
     useConfiguration();
@@ -314,27 +276,6 @@
     }
   }
 
-  // Regression test for bug 2088255:
-  // "StringIndexOutOfBoundsException in BuildConfiguration.<init>()"
-  @Test
-  public void testShortLibcVersion() throws Exception {
-    scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
-
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder().setTargetLibc("2.3.6").buildPartial());
-
-    useConfiguration();
-
-    ConfiguredTarget target = getConfiguredTarget("//a:b");
-    CcToolchainProvider toolchainProvider =
-        (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-
-    assertThat(toolchainProvider.getTargetLibc()).isEqualTo("2.3.6");
-  }
-
   @Test
   public void testParamDfDoubleQueueThresholdFactor() throws Exception {
     scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
@@ -378,11 +319,7 @@
       scratch.overwriteFile("a/BUILD", "cc_toolchain_alias(name = 'b')");
       getAnalysisMock()
           .ccSupport()
-          .setupCrosstool(
-              mockToolsConfig,
-              CrosstoolConfig.CToolchain.newBuilder()
-                  .addCxxBuiltinIncludeDirectory(entry)
-                  .buildPartial());
+          .setupCrosstool(mockToolsConfig, "cxx_builtin_include_directory: '" + entry + "'");
 
       useConfiguration();
       invalidatePackages();
@@ -585,7 +522,7 @@
         "fdo/BUILD",
         "exports_files(['my_profile.afdo'])",
         "fdo_profile(name = 'fdo', profile = ':my_profile.profdata')");
-    scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
+    scratch.file("a/CROSSTOOL", MockCcSupport.EMPTY_CROSSTOOL);
 
     useConfiguration();
     assertThat(getPrerequisites(getConfiguredTarget("//a:b"), ":zipper")).isEmpty();
@@ -625,11 +562,7 @@
         "      target_libc: \"banana\"",
         "    \"\"\")");
 
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(mockToolsConfig, CrosstoolConfig.CToolchain.newBuilder()
-            .setAbiVersion("orange")
-            .buildPartial());
+    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig, "abi_version: 'orange'");
 
     useConfiguration("--incompatible_enable_cc_toolchain_resolution");
 
@@ -652,11 +585,7 @@
     loadCcToolchainConfigLib();
     writeStarlarkRule();
 
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder().setAbiVersion("orange").buildPartial());
+    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig, "abi_version: 'orange'");
 
     useConfiguration("--cpu=k8");
 
@@ -777,35 +706,7 @@
   public void testSupportsDynamicLinkerIsFalseWhenFeatureNotSet() throws Exception {
     scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
 
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(mockToolsConfig, MockCcSupport.DYNAMIC_LINKING_MODE_FEATURE);
-
-    // To make sure the toolchain doesn't define linking_mode_flags { mode: DYNAMIC } as that would
-    // also result in supportsDynamicLinker returning true
-    useConfiguration("--compiler=compiler_no_dyn_linker");
-
-    ConfiguredTarget target = getConfiguredTarget("//a:b");
-    CcToolchainProvider toolchainProvider =
-        (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-
-    assertThat(toolchainProvider.supportsDynamicLinker(FeatureConfiguration.EMPTY)).isFalse();
-  }
-
-  @Test
-  public void testSupportsDynamicLinkerIsTrueWhenFeatureSet() throws Exception {
-    scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
-
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            MockCcSupport.DYNAMIC_LINKING_MODE_FEATURE,
-            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
-
-    // To make sure the toolchain doesn't define linking_mode_flags { mode: DYNAMIC } as that would
-    // also result in supportsDynamicLinker returning true
-    useConfiguration("--compiler=compiler_no_dyn_linker");
+    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig);
 
     ConfiguredTarget target = getConfiguredTarget("//a:b");
     CcToolchainProvider toolchainProvider =
@@ -830,41 +731,24 @@
         .isEqualTo(featureConfiguration.isEnabled(CppRuleClasses.STATIC_LINK_CPP_RUNTIMES));
   }
 
-  // Tests CcCommon::enableStaticLinkCppRuntimesFeature when supports_embedded_runtimes is false
-  // in the toolchain.
-  @Test
-  public void testStaticLinkCppRuntimesSetViaSupportsEmbeddedRuntimesFalse() throws Exception {
-    scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
-    getAnalysisMock().ccSupport().setupCrosstoolWithEmbeddedRuntimes(mockToolsConfig);
-    useConfiguration();
-    ConfiguredTarget target = getConfiguredTarget("//a:b");
-    CcToolchainProvider toolchainProvider =
-        (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    FeatureConfiguration featureConfiguration =
-        CcCommon.configureFeaturesOrReportRuleError(getRuleContext(target), toolchainProvider);
-    assertThat(toolchainProvider.supportsEmbeddedRuntimes())
-        .isEqualTo(featureConfiguration.isEnabled(CppRuleClasses.STATIC_LINK_CPP_RUNTIMES));
-  }
-
-  private FeatureConfiguration configureFeaturesForStaticLinkCppRuntimesTest(
-      String partialToolchain, String configurationToUse) throws Exception {
-    scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
+  private FeatureConfiguration getFeatureConfigurationForStaticLinkCppRuntimes(
+      String partialToolchain, String... configurationToUse) throws Exception {
+    scratch.file("a/BUILD", "cc_binary(name = 'a')");
     CToolchain.Builder toolchainBuilder = CToolchain.newBuilder();
     TextFormat.merge(partialToolchain, toolchainBuilder);
     getAnalysisMock()
         .ccSupport()
         .setupCrosstool(
-            mockToolsConfig,
-            /* addEmbeddedRuntimes= */ true,
-            /* addModuleMap= */ false,
-            /* staticRuntimesLabel= */ "static-runtime",
-            /* dynamicRuntimesLabel= */ "dynamic-runtime",
-            toolchainBuilder.buildPartial());
+            mockToolsConfig, MockCcSupport.STATIC_LINK_CPP_RUNTIMES_FEATURE, partialToolchain);
     useConfiguration(configurationToUse);
-    ConfiguredTarget target = getConfiguredTarget("//a:b");
-    CcToolchainProvider toolchainProvider =
-        (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
-    return CcCommon.configureFeaturesOrReportRuleError(getRuleContext(target), toolchainProvider);
+    RuleConfiguredTarget target = (RuleConfiguredTarget) getConfiguredTarget("//a:a");
+    CppLinkAction action =
+        (CppLinkAction)
+            target.getActions().stream()
+                .filter(a -> a.getMnemonic().equals("CppLink"))
+                .findFirst()
+                .get();
+    return action.getLinkCommandLine().getFeatureConfiguration();
   }
 
   // Tests CcCommon::enableStaticLinkCppRuntimesFeature when supports_embedded_runtimes is true in
@@ -872,7 +756,8 @@
   @Test
   public void testSupportsEmbeddedRuntimesNoFeatureAtAll() throws Exception {
     FeatureConfiguration featureConfiguration =
-        configureFeaturesForStaticLinkCppRuntimesTest("supports_embedded_runtimes: true", "");
+        getFeatureConfigurationForStaticLinkCppRuntimes(
+            "supports_embedded_runtimes: true", "--noincompatible_disable_legacy_crosstool_fields");
     assertThat(featureConfiguration.isEnabled(CppRuleClasses.STATIC_LINK_CPP_RUNTIMES)).isTrue();
   }
 
@@ -881,8 +766,10 @@
   @Test
   public void testSupportsEmbeddedRuntimesFeatureEnabled() throws Exception {
     FeatureConfiguration featureConfiguration =
-        configureFeaturesForStaticLinkCppRuntimesTest(
-            "supports_embedded_runtimes: true", "--features=static_link_cpp_runtimes");
+        getFeatureConfigurationForStaticLinkCppRuntimes(
+            "supports_embedded_runtimes: true",
+            "--features=static_link_cpp_runtimes",
+            "--noincompatible_disable_legacy_crosstool_fields");
     assertThat(featureConfiguration.isEnabled(CppRuleClasses.STATIC_LINK_CPP_RUNTIMES)).isTrue();
   }
 
@@ -891,9 +778,10 @@
   @Test
   public void testStaticLinkCppRuntimesOverridesSupportsEmbeddedRuntimes() throws Exception {
     FeatureConfiguration featureConfiguration =
-        configureFeaturesForStaticLinkCppRuntimesTest(
-            "supports_embedded_runtimes: true feature { name: 'static_link_cpp_runtimes' }",
-            "--features=-static_link_cpp_runtimes");
+        getFeatureConfigurationForStaticLinkCppRuntimes(
+            "supports_embedded_runtimes: true",
+            "--features=-static_link_cpp_runtimes",
+            "--noincompatible_disable_legacy_crosstool_fields");
     assertThat(featureConfiguration.isEnabled(CppRuleClasses.STATIC_LINK_CPP_RUNTIMES)).isFalse();
   }
 
@@ -902,12 +790,6 @@
     scratch.file("a/BUILD", "cc_toolchain_alias(name = 'b')");
     scratch.file("libc1/BUILD", "filegroup(name = 'everything', srcs = ['header1.h'])");
     scratch.file("libc1/header1.h", "#define FOO 1");
-
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder().clearDefaultGrteTop().buildPartial());
     useConfiguration();
     ConfiguredTarget target = getConfiguredTarget("//a:b");
     CcToolchainProvider toolchainProvider =
@@ -953,11 +835,8 @@
     scratch.file("libc2/BUILD", "filegroup(name = 'everything', srcs = ['header2.h'])");
     scratch.file("libc2/header2.h", "#define FOO 2");
 
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder().setDefaultGrteTop("//libc1").buildPartial());
+    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig, "default_grte_top: '//libc1'");
+
     useConfiguration("--cpu=k8");
     ConfiguredTarget target = getConfiguredTarget("//a:a");
     CcToolchainProvider ccToolchainProvider =
@@ -1006,11 +885,7 @@
     scratch.file("libc3/BUILD", "filegroup(name = 'everything', srcs = ['header.h'])");
     scratch.file("libc3/header.h", "#define FOO 3");
 
-    getAnalysisMock()
-        .ccSupport()
-        .setupCrosstool(
-            mockToolsConfig,
-            CrosstoolConfig.CToolchain.newBuilder().setDefaultGrteTop("//libc1").buildPartial());
+    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig, "default_grte_top: '//libc1'");
     useConfiguration("--cpu=k8", "--grte_top=//libc3");
     ConfiguredTarget target = getConfiguredTarget("//a:a");
     CcToolchainProvider ccToolchainProvider =
@@ -1034,11 +909,10 @@
 
   @Test
   public void testCrosstoolReadWhenStarlarkRuleIsEnabledButNotPresent() throws Exception {
-    reporter.removeHandler(failFastHandler);
     scratch.file("lib/BUILD", "cc_library(name = 'lib', srcs = ['a.cc'])");
     getSimpleStarlarkRule(/* addToolchainConfigAttribute= */ false);
 
-    scratch.file("a/CROSSTOOL", getAnalysisMock().ccSupport().readCrosstoolFile());
+    scratch.file("a/CROSSTOOL", MockCcSupport.EMPTY_CROSSTOOL);
 
     useConfiguration("--cpu=k8", "--crosstool_top=//a:a");
     ConfiguredTarget target = getConfiguredTarget("//lib:lib");
@@ -1047,7 +921,6 @@
 
   @Test
   public void testCrosstoolNotNeededWhenStarlarkRuleIsEnabled() throws Exception {
-    reporter.removeHandler(failFastHandler);
     scratch.file("lib/BUILD", "cc_library(name = 'lib', srcs = ['a.cc'])");
     getSimpleStarlarkRule(/* addToolchainConfigAttribute= */ true);
 
@@ -1079,7 +952,7 @@
         "    linker_files = ':empty',",
         "    strip_files = ':empty',",
         "    objcopy_files = ':empty',",
-        "    toolchain_identifier = 'toolchain-identifier-k8',",
+        "    toolchain_identifier = 'mock-llvm-toolchain-k8',",
         (addToolchainConfigAttribute ? "    toolchain_config = ':toolchain_config'" : "") + ")");
 
     scratch.file(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java
index a5ef1c1..26211cd 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java
@@ -70,7 +70,7 @@
   @Test
   public void testPresenceOfLegacyCompileFlags() throws Exception {
     AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig, "cxx_flag: '-foo'");
-    useConfiguration();
+    useConfiguration("--noincompatible_disable_legacy_crosstool_fields");
 
     scratch.file("x/BUILD", "cc_binary(name = 'bin', srcs = ['bin.cc'])");
     scratch.file("x/bin.cc");
@@ -125,7 +125,7 @@
     AnalysisMock.get()
         .ccSupport()
         .setupCrosstool(mockToolsConfig, "unfiltered_cxx_flag: '--i_ll_live_forever'");
-    useConfiguration();
+    useConfiguration("--noincompatible_disable_legacy_crosstool_fields");
 
     scratch.file("x/BUILD", "cc_binary(name = 'bin', srcs = ['bin.cc'])");
     scratch.file("x/bin.cc");
@@ -269,7 +269,9 @@
 
   @Test
   public void testPresenceOfPerObjectDebugFileBuildVariableUsingLegacyFields() throws Exception {
-    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig, "supports_fission: true");
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.PER_OBJECT_DEBUG_INFO_CONFIGURATION);
     useConfiguration("--fission=yes");
 
     scratch.file("x/BUILD", "cc_binary(name = 'bin', srcs = ['bin.cc'])");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index b5a0d06..053fd22 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -259,10 +259,17 @@
   public void testCompilesTestSourcesIntoDynamicLibrary() throws Exception {
     if (OS.getCurrent() == OS.WINDOWS) {
       // Skip the test on Windows.
-      // TODO(bazel-team): maybe we should move that test that doesn't work with MSVC toolchain to
-      // its own suite with a TestSpec?
+      // TODO(#7524): This test should work on Windows just fine, investigate and fix.
       return;
     }
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_PIC_FEATURE,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
+
     scratch.file(
         "x/BUILD",
         "cc_test(name = 'a', srcs = ['a.cc'])",
@@ -271,17 +278,15 @@
     useConfiguration("--experimental_link_compile_output_separately", "--force_pic");
 
     ConfiguredTarget configuredTarget = getConfiguredTarget("//x:a");
-    String cpu = CrosstoolConfigurationHelper.defaultCpu();
     CppLinkAction linkAction =
         (CppLinkAction) getGeneratingAction(configuredTarget, "x/a");
     assertThat(artifactsToStrings(linkAction.getInputs()))
-        .contains("bin _solib_" + cpu + "/libx_Sliba.ifso");
+        .contains("bin _solib_k8/libx_Sliba.ifso");
     assertThat(linkAction.getArguments())
-        .contains(
-            getBinArtifactWithNoOwner("_solib_" + cpu + "/libx_Sliba.ifso").getExecPathString());
+        .contains(getBinArtifactWithNoOwner("_solib_k8/libx_Sliba.ifso").getExecPathString());
     RunfilesProvider runfilesProvider = configuredTarget.getProvider(RunfilesProvider.class);
     assertThat(artifactsToStrings(runfilesProvider.getDefaultRunfiles().getArtifacts()))
-        .contains("bin _solib_" + cpu + "/libx_Sliba.so");
+        .contains("bin _solib_k8/libx_Sliba.so");
 
     configuredTarget = getConfiguredTarget("//x:b");
     linkAction = (CppLinkAction) getGeneratingAction(configuredTarget, "x/b");
@@ -295,10 +300,16 @@
   public void testCompilesDynamicModeTestSourcesWithFeatureIntoDynamicLibrary() throws Exception {
     if (OS.getCurrent() == OS.WINDOWS) {
       // Skip the test on Windows.
-      // TODO(bazel-team): maybe we should move that test that doesn't work with MSVC toolchain to
-      // its own suite with a TestSpec?
+      // TODO(#7524): This test should work on Windows just fine, investigate and fix.
       return;
     }
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_PIC_FEATURE,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     scratch.file(
         "x/BUILD",
         "cc_test(name='a', srcs=['a.cc'], features=['dynamic_link_test_srcs'])",
@@ -308,16 +319,14 @@
     useConfiguration("--force_pic");
 
     ConfiguredTarget configuredTarget = getConfiguredTarget("//x:a");
-    String cpu = CrosstoolConfigurationHelper.defaultCpu();
     CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(configuredTarget, "x/a");
     assertThat(artifactsToStrings(linkAction.getInputs()))
-        .contains("bin _solib_" + cpu + "/libx_Sliba.ifso");
+        .contains("bin _solib_k8/libx_Sliba.ifso");
     assertThat(linkAction.getArguments())
-        .contains(
-            getBinArtifactWithNoOwner("_solib_" + cpu + "/libx_Sliba.ifso").getExecPathString());
+        .contains(getBinArtifactWithNoOwner("_solib_k8/libx_Sliba.ifso").getExecPathString());
     RunfilesProvider runfilesProvider = configuredTarget.getProvider(RunfilesProvider.class);
     assertThat(artifactsToStrings(runfilesProvider.getDefaultRunfiles().getArtifacts()))
-        .contains("bin _solib_" + cpu + "/libx_Sliba.so");
+        .contains("bin _solib_k8/libx_Sliba.so");
 
     configuredTarget = getConfiguredTarget("//x:b");
     linkAction = (CppLinkAction) getGeneratingAction(configuredTarget, "x/b");
@@ -339,20 +348,24 @@
       throws Exception {
     if (OS.getCurrent() == OS.WINDOWS) {
       // Skip the test on Windows.
-      // TODO(bazel-team): maybe we should move that test that doesn't work with MSVC toolchain to
-      // its own suite with a TestSpec?
+      // TODO(#7524): This test should work on Windows just fine, investigate and fix.
       return;
     }
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_PIC_FEATURE);
     scratch.file(
         "x/BUILD", "cc_binary(name = 'a', srcs = ['a.cc'], features = ['-static_link_test_srcs'])");
     scratch.file("x/a.cc", "int main() {}");
     useConfiguration("--force_pic", "--dynamic_mode=default");
 
     ConfiguredTarget configuredTarget = getConfiguredTarget("//x:a");
-    String cpu = CrosstoolConfigurationHelper.defaultCpu();
     CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(configuredTarget, "x/a");
     assertThat(artifactsToStrings(linkAction.getInputs()))
-        .doesNotContain("bin _solib_" + cpu + "/libx_Sliba.ifso");
+        .doesNotContain("bin _solib_k8/libx_Sliba.ifso");
     assertThat(artifactsToStrings(linkAction.getInputs())).contains("bin x/_objs/a/a.pic.o");
     RunfilesProvider runfilesProvider = configuredTarget.getProvider(RunfilesProvider.class);
     assertThat(artifactsToStrings(runfilesProvider.getDefaultRunfiles().getArtifacts()))
@@ -673,7 +686,12 @@
 
   @Test
   public void testInterfaceOutputForDynamicLibrary() throws Exception {
-    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig);
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     useConfiguration();
 
     scratch.file("foo/BUILD", "cc_library(name = 'foo', srcs = ['foo.cc'])");
@@ -695,7 +713,7 @@
     FeatureConfiguration featureConfiguration =
         CcToolchainFeaturesTest.buildFeatures(
                 ruleContext,
-                "supports_interface_shared_objects: true ",
+                MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE,
                 "feature {",
                 "   name: 'build_interface_libraries'",
                 "   flag_set {",
@@ -858,64 +876,6 @@
   }
 
   @Test
-  public void testLinksTreeArtifactLibraryForDeps() throws Exception {
-    // This test only makes sense if start/end lib archives are supported.
-    analysisMock.ccSupport().setupCrosstool(mockToolsConfig, "supports_start_end_lib: true");
-    useConfiguration("--start_end_lib");
-    RuleContext ruleContext = createDummyRuleContext();
-
-    SpecialArtifact testTreeArtifact = createTreeArtifact("library_directory");
-
-    TreeFileArtifact library0 = ActionInputHelper.treeFileArtifact(testTreeArtifact, "library0.o");
-    TreeFileArtifact library1 = ActionInputHelper.treeFileArtifact(testTreeArtifact, "library1.o");
-
-    ArtifactExpander expander =
-        new ArtifactExpander() {
-          @Override
-          public void expand(Artifact artifact, Collection<? super Artifact> output) {
-            if (artifact.equals(testTreeArtifact)) {
-              output.add(library0);
-              output.add(library1);
-            }
-          };
-        };
-
-    Artifact archiveFile = scratchArtifact("library.a");
-
-    CppLinkActionBuilder builder =
-        createLinkBuilder(ruleContext, LinkTargetType.STATIC_LIBRARY)
-            .setLibraryIdentifier("foo")
-            .addLibrary(
-                LinkerInputs.newInputLibrary(
-                    archiveFile,
-                    ArtifactCategory.STATIC_LIBRARY,
-                    null,
-                    ImmutableList.<Artifact>of(testTreeArtifact),
-                    LtoCompilationContext.EMPTY,
-                    null,
-                    /* mustKeepDebug= */ false));
-
-    CppLinkAction linkAction = builder.build();
-
-    Iterable<String> treeArtifactsPaths = ImmutableList.of(testTreeArtifact.getExecPathString());
-    Iterable<String> treeFileArtifactsPaths =
-        ImmutableList.of(library0.getExecPathString(), library1.getExecPathString());
-
-    // Should only reference the tree artifact.
-    verifyArguments(
-        linkAction.getLinkCommandLine().getRawLinkArgv(),
-        treeArtifactsPaths,
-        treeFileArtifactsPaths);
-    verifyArguments(linkAction.getArguments(), treeArtifactsPaths, treeFileArtifactsPaths);
-
-    // Should only reference tree file artifacts.
-    verifyArguments(
-        linkAction.getLinkCommandLine().getRawLinkArgv(expander),
-        treeFileArtifactsPaths,
-        treeArtifactsPaths);
-  }
-
-  @Test
   public void testStaticLinking() throws Exception {
     RuleContext ruleContext = createDummyRuleContext();
 
@@ -1019,7 +979,7 @@
   public void testLinkoptsComeAfterLinkerInputs() throws Exception {
     RuleContext ruleContext = createDummyRuleContext();
 
-    String solibPrefix = "_solib_" + CrosstoolConfigurationHelper.defaultCpu();
+    String solibPrefix = "_solib_k8";
     Iterable<LibraryToLink> linkerInputs =
         LinkerInputs.opaqueLibrariesToLink(
             ArtifactCategory.DYNAMIC_LIBRARY,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java
index d6371d8..cc98fba 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelperTest.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import java.util.List;
 import org.junit.Test;
@@ -139,6 +140,11 @@
 
   @Test
   public void testLinkstampRespectsPicnessFromConfiguration() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE, MockCcSupport.PIC_FEATURE);
+
     useConfiguration("--force_pic");
     scratch.file(
         "x/BUILD",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
deleted file mode 100644
index 3e5fd88..0000000
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
+++ /dev/null
@@ -1,651 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.cpp;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
-import com.google.devtools.build.lib.analysis.config.CompilationMode;
-import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
-import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
-import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
-import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
-import com.google.devtools.build.lib.testutil.TestConstants;
-import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
-import com.google.devtools.build.lib.vfs.PathFragment;
-import java.io.IOException;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for {@link CppConfigurationLoader}.
- */
-@RunWith(JUnit4.class)
-public class CrosstoolConfigurationLoaderTest extends AnalysisTestCase {
-
-  private CppConfiguration create(CppConfigurationLoader loader, String... args) throws Exception {
-    useConfiguration(args);
-    return loader.create(buildOptions);
-  }
-
-  private CppConfigurationLoader loader(String crosstoolFileContents) throws IOException {
-    getAnalysisMock().ccSupport().setupCrosstoolWithRelease(mockToolsConfig, crosstoolFileContents);
-    return new CppConfigurationLoader(CpuTransformer.IDENTITY);
-  }
-
-  @Before
-  public void setupTests() throws Exception {
-    useRuleClassProvider(TestRuleClassProvider.getRuleClassProvider());
-  }
-
-  private CppConfigurationLoader loaderWithOptionalTool(String optionalTool) throws IOException {
-    return loader(
-        "major_version: \"12\""
-            + "minor_version: \"0\""
-            + "toolchain {"
-            + "  toolchain_identifier: \"toolchain-identifier\""
-            + "  host_system_name: \"host-system-name\""
-            + "  target_system_name: \"target-system-name\""
-            + "  target_cpu: \"k8\""
-            + "  target_libc: \"target-libc\""
-            + "  compiler: \"compiler\""
-            + "  abi_version: \"abi-version\""
-            + "  abi_libc_version: \"abi-libc-version\""
-            + "  tool_path { name: \"ar\" path: \"path-to-ar\" }"
-            + "  tool_path { name: \"cpp\" path: \"path-to-cpp\" }"
-            + "  tool_path { name: \"gcc\" path: \"path-to-gcc\" }"
-            + "  tool_path { name: \"gcov\" path: \"path-to-gcov\" }"
-            + "  tool_path { name: \"ld\" path: \"path-to-ld\" }"
-            + "  tool_path { name: \"nm\" path: \"path-to-nm\" }"
-            + "  tool_path { name: \"objcopy\" path: \"path-to-objcopy\" }"
-            + "  tool_path { name: \"objdump\" path: \"path-to-objdump\" }"
-            + "  tool_path { name: \"strip\" path: \"path-to-strip\" }"
-            + "  tool_path { name: \"dwp\" path: \"path-to-dwp\" }"
-            + optionalTool
-            + "  supports_normalizing_ar: true"
-            + "  supports_incremental_linker: true"
-            + "  supports_fission: true"
-            + "  compiler_flag: \"c\""
-            + "  cxx_flag: \"cxx\""
-            + "  unfiltered_cxx_flag: \"unfiltered\""
-            + "  linker_flag: \"linker\""
-            + "  dynamic_library_linker_flag: \"solinker\""
-            + "  objcopy_embed_flag: \"objcopy\""
-            + "  compilation_mode_flags {"
-            + "    mode: FASTBUILD"
-            + "    compiler_flag: \"fastbuild\""
-            + "    cxx_flag: \"cxx-fastbuild\""
-            + "    linker_flag: \"linker-fastbuild\""
-            + "  }"
-            + "  compilation_mode_flags {"
-            + "    mode: DBG"
-            + "    compiler_flag: \"dbg\""
-            + "    cxx_flag: \"cxx-dbg\""
-            + "    linker_flag: \"linker-dbg\""
-            + "  }"
-            + "  compilation_mode_flags {"
-            + "    mode: COVERAGE"
-            + "    compiler_flag: \"coverage\""
-            + "    cxx_flag: \"cxx-coverage\""
-            + "    linker_flag: \"linker-coverage\""
-            + "  }"
-            + "  compilation_mode_flags {"
-            + "    mode: OPT"
-            + "    compiler_flag: \"opt\""
-            + "    cxx_flag: \"cxx-opt\""
-            + "    linker_flag: \"linker-opt\""
-            + "  }"
-            + "  linking_mode_flags {"
-            + "    mode: FULLY_STATIC"
-            + "    linker_flag: \"fully static\""
-            + "  }"
-            + "  linking_mode_flags {"
-            + "    mode: MOSTLY_STATIC"
-            + "    linker_flag: \"mostly static\""
-            + "  }"
-            + "  linking_mode_flags {"
-            + "    mode: DYNAMIC"
-            + "    linker_flag: \"dynamic\""
-            + "  }"
-            + "  make_variable {"
-            + "    name: \"SOME_MAKE_VARIABLE\""
-            + "    value: \"make-variable-value\""
-            + "  }"
-            + "  cxx_builtin_include_directory: \"system-include-dir\""
-            + "}");
-  }
-
-  private ConfiguredTarget getCcToolchainTarget(CppConfiguration cppConfiguration)
-      throws Exception {
-    update(cppConfiguration.getRuleProvidingCcToolchainProvider().toString());
-    return Preconditions.checkNotNull(
-        getConfiguredTarget(cppConfiguration.getRuleProvidingCcToolchainProvider().toString()));
-  }
-
-  private CcToolchainProvider getCcToolchainProvider(CppConfiguration cppConfiguration)
-      throws Exception {
-    return (CcToolchainProvider)
-        getCcToolchainTarget(cppConfiguration).get(ToolchainInfo.PROVIDER);
-  }
-
-  /**
-   * Checks that we do not accidentally change the proto format in incompatible
-   * ways. Do not modify the configuration file in this test, except if you are
-   * absolutely certain that it is backwards-compatible.
-   */
-  @Test
-  public void testSimpleCompleteConfiguration() throws Exception {
-    CppConfigurationLoader loader = loaderWithOptionalTool("");
-
-    // Need to clear out the android cpu options to avoid this split transition in Bazel.
-    CppConfiguration toolchain =
-        create(loader, "--cpu=k8", "--host_cpu=k8", "--android_cpu=", "--fat_apk_cpu=");
-    CcToolchainProvider ccProvider = getCcToolchainProvider(toolchain);
-    assertThat(ccProvider.getToolchainIdentifier()).isEqualTo("toolchain-identifier");
-
-    assertThat(ccProvider.getHostSystemName()).isEqualTo("host-system-name");
-    assertThat(ccProvider.getCompiler()).isEqualTo("compiler");
-    assertThat(ccProvider.getTargetLibc()).isEqualTo("target-libc");
-    assertThat(ccProvider.getTargetCpu()).isEqualTo("k8");
-    assertThat(ccProvider.getTargetGnuSystemName()).isEqualTo("target-system-name");
-
-    assertThat(ccProvider.getToolPathFragment(Tool.AR)).isEqualTo(getToolPath("path-to-ar"));
-
-    assertThat(ccProvider.getAbi()).isEqualTo("abi-version");
-    assertThat(ccProvider.getAbiGlibcVersion()).isEqualTo("abi-libc-version");
-
-    assertThat(ccProvider.supportsStartEndLib(FeatureConfiguration.EMPTY)).isFalse();
-    assertThat(ccProvider.supportsInterfaceSharedLibraries(FeatureConfiguration.EMPTY)).isFalse();
-    assertThat(ccProvider.supportsEmbeddedRuntimes()).isFalse();
-    assertThat(ccProvider.toolchainNeedsPic()).isFalse();
-    assertThat(ccProvider.supportsFission()).isTrue();
-
-    assertThat(ccProvider.getBuiltInIncludeDirectories())
-        .containsExactly(getToolPath("system-include-dir"));
-    assertThat(ccProvider.getSysroot()).isNull();
-
-    assertThat(ccProvider.getLegacyCompileOptionsWithCopts())
-        .containsExactly("c", "fastbuild")
-        .inOrder();
-    assertThat(ccProvider.getUnfilteredCompilerOptions()).containsExactly("unfiltered").inOrder();
-
-    assertThat(CppHelper.getFullyStaticLinkOptions(toolchain, ccProvider, false))
-        .containsExactly("linker", "linker-fastbuild", "fully static")
-        .inOrder();
-    assertThat(CppHelper.getDynamicLinkOptions(toolchain, ccProvider, false))
-        .containsExactly("linker", "linker-fastbuild", "dynamic")
-        .inOrder();
-    assertThat(CppHelper.getFullyStaticLinkOptions(toolchain, ccProvider, true))
-        .containsExactly("linker", "linker-fastbuild", "mostly static", "solinker")
-        .inOrder();
-    assertThat(CppHelper.getDynamicLinkOptions(toolchain, ccProvider, true))
-        .containsExactly("linker", "linker-fastbuild", "dynamic", "solinker")
-        .inOrder();
-
-    assertThat(ccProvider.getObjCopyOptionsForEmbedding()).containsExactly("objcopy").inOrder();
-    assertThat(ccProvider.getLdOptionsForEmbedding()).isEmpty();
-
-    assertThat(ccProvider.getAdditionalMakeVariables().entrySet())
-        .containsExactlyElementsIn(
-            ImmutableMap.of(
-                    "SOME_MAKE_VARIABLE", "make-variable-value",
-                    "STACK_FRAME_UNLIMITED", "",
-                    "CC_FLAGS", "")
-                .entrySet());
-
-    assertThat(ccProvider.getToolPathFragment(Tool.LD)).isEqualTo(getToolPath("path-to-ld"));
-    assertThat(ccProvider.getToolPathFragment(Tool.DWP)).isEqualTo(getToolPath("path-to-dwp"));
-  }
-
-  /**
-   * Tests all of the fields and a bunch of the combinations a config can hold,
-   * including non-default toolchains, missing sections and repeated entries
-   * (and their order in the end result.)
-   */
-  @Test
-  public void testComprehensiveCompleteConfiguration() throws Exception {
-    CppConfigurationLoader loader =
-        loader(
-            // Needs to include \n's; as a single line it hits a parser limitation.
-            "major_version: \"12\"\n"
-                + "minor_version: \"0\"\n"
-                + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-A\"\n"
-                + "  host_system_name: \"host-system-name-A\"\n"
-                + "  target_system_name: \"target-system-name-A\"\n"
-                + "  target_cpu: \"k8\"\n"
-                + "  target_libc: \"target-libc-A\"\n"
-                + "  compiler: \"compiler-A\"\n"
-                + "  abi_version: \"abi-version-A\"\n"
-                + "  abi_libc_version: \"abi-libc-version-A\"\n"
-                + "  tool_path { name: \"ar\" path: \"path/to/ar-A\" }\n"
-                + "  tool_path { name: \"cpp\" path: \"path/to/cpp-A\" }\n"
-                + "  tool_path { name: \"gcc\" path: \"path/to/gcc-A\" }\n"
-                + "  tool_path { name: \"gcov\" path: \"path/to/gcov-A\" }\n"
-                + "  tool_path { name: \"gcov-tool\" path: \"path-to-gcov-tool-A\" }"
-                + "  tool_path { name: \"ld\" path: \"path/to/ld-A\" }\n"
-                + "  tool_path { name: \"nm\" path: \"path/to/nm-A\" }\n"
-                + "  tool_path { name: \"objcopy\" path: \"path/to/objcopy-A\" }\n"
-                + "  tool_path { name: \"objdump\" path: \"path/to/objdump-A\" }\n"
-                + "  tool_path { name: \"strip\" path: \"path/to/strip-A\" }\n"
-                + "  tool_path { name: \"dwp\" path: \"path/to/dwp\" }\n"
-                + "  supports_start_end_lib: true\n"
-                + "  supports_normalizing_ar: true\n"
-                + "  supports_embedded_runtimes: true\n"
-                + "  static_runtimes_filegroup: 'static-runtime-1'\n"
-                + "  dynamic_runtimes_filegroup: 'dynamic-runtime-1'\n"
-                + "  needsPic: true\n"
-                + "  compiler_flag: \"compiler-flag-A-1\"\n"
-                + "  compiler_flag: \"compiler-flag-A-2\"\n"
-                + "  cxx_flag: \"cxx-flag-A-1\"\n"
-                + "  cxx_flag: \"cxx-flag-A-2\"\n"
-                + "  unfiltered_cxx_flag: \"unfiltered-flag-A-1\"\n"
-                + "  unfiltered_cxx_flag: \"unfiltered-flag-A-2\"\n"
-                + "  linker_flag: \"linker-flag-A-1\"\n"
-                + "  linker_flag: \"linker-flag-A-2\"\n"
-                + "  dynamic_library_linker_flag: \"solinker-flag-A-1\"\n"
-                + "  dynamic_library_linker_flag: \"solinker-flag-A-2\"\n"
-                + "  objcopy_embed_flag: \"objcopy-embed-flag-A-1\"\n"
-                + "  objcopy_embed_flag: \"objcopy-embed-flag-A-2\"\n"
-                + "  ld_embed_flag: \"ld-embed-flag-A-1\"\n"
-                + "  ld_embed_flag: \"ld-embed-flag-A-2\"\n"
-                + "  compilation_mode_flags {\n"
-                + "    mode: FASTBUILD\n"
-                + "    compiler_flag: \"fastbuild-flag-A-1\"\n"
-                + "    compiler_flag: \"fastbuild-flag-A-2\"\n"
-                + "    cxx_flag: \"cxx-fastbuild-flag-A-1\"\n"
-                + "    cxx_flag: \"cxx-fastbuild-flag-A-2\"\n"
-                + "    linker_flag: \"linker-fastbuild-flag-A-1\"\n"
-                + "    linker_flag: \"linker-fastbuild-flag-A-2\"\n"
-                + "  }\n"
-                + "  compilation_mode_flags {\n"
-                + "    mode: DBG\n"
-                + "    compiler_flag: \"dbg-flag-A-1\"\n"
-                + "    compiler_flag: \"dbg-flag-A-2\"\n"
-                + "    cxx_flag: \"cxx-dbg-flag-A-1\"\n"
-                + "    cxx_flag: \"cxx-dbg-flag-A-2\"\n"
-                + "    linker_flag: \"linker-dbg-flag-A-1\"\n"
-                + "    linker_flag: \"linker-dbg-flag-A-2\"\n"
-                + "  }\n"
-                + "  compilation_mode_flags {\n"
-                + "    mode: COVERAGE\n"
-                + "  }\n"
-                + "  # skip mode OPT to test handling its absence\n"
-                + "  linking_mode_flags {\n"
-                + "    mode: FULLY_STATIC\n"
-                + "    linker_flag: \"fully-static-flag-A-1\"\n"
-                + "    linker_flag: \"fully-static-flag-A-2\"\n"
-                + "  }\n"
-                + "  linking_mode_flags {\n"
-                + "    mode: MOSTLY_STATIC\n"
-                + "  }\n"
-                + "  # skip linking mode DYNAMIC to test handling its absence\n"
-                + "  make_variable {\n"
-                + "    name: \"SOME_MAKE_VARIABLE-A-1\"\n"
-                + "    value: \"make-variable-value-A-1\"\n"
-                + "  }\n"
-                + "  make_variable {\n"
-                + "    name: \"SOME_MAKE_VARIABLE-A-2\"\n"
-                + "    value: \"make-variable-value-A-2 with spaces in\"\n"
-                + "  }\n"
-                + "  cxx_builtin_include_directory: \"system-include-dir-A-1\"\n"
-                + "  cxx_builtin_include_directory: \"system-include-dir-A-2\"\n"
-                + "  builtin_sysroot: \"builtin-sysroot-A\"\n"
-                + "  default_python_top: \"python-top-A\"\n"
-                + "  default_python_version: \"python-version-A\"\n"
-                + "}\n"
-                + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-B\"\n"
-                + "  host_system_name: \"host-system-name-B\"\n"
-                + "  target_system_name: \"target-system-name-B\"\n"
-                + "  target_cpu: \"k8\"\n"
-                + "  target_libc: \"target-libc-B\"\n"
-                + "  compiler: \"compiler-B\"\n"
-                + "  abi_version: \"abi-version-B\"\n"
-                + "  abi_libc_version: \"abi-libc-version-B\"\n"
-                + "  tool_path { name: \"ar\" path: \"path/to/ar-B\" }\n"
-                + "  tool_path { name: \"cpp\" path: \"path/to/cpp-B\" }\n"
-                + "  tool_path { name: \"gcc\" path: \"path/to/gcc-B\" }\n"
-                + "  tool_path { name: \"gcov\" path: \"path/to/gcov-B\" }\n"
-                + "  tool_path { name: \"gcov-tool\" path: \"path/to/gcov-tool-B\" }\n"
-                + "  tool_path { name: \"ld\" path: \"path/to/ld-B\" }\n"
-                + "  tool_path { name: \"nm\" path: \"path/to/nm-B\" }\n"
-                + "  tool_path { name: \"objcopy\" path: \"path/to/objcopy-B\" }\n"
-                + "  tool_path { name: \"objdump\" path: \"path/to/objdump-B\" }\n"
-                + "  tool_path { name: \"strip\" path: \"path/to/strip-B\" }\n"
-                + "  tool_path { name: \"dwp\" path: \"path/to/dwp\" }\n"
-                + "  supports_start_end_lib: true\n"
-                + "  supports_normalizing_ar: true\n"
-                + "  supports_embedded_runtimes: true\n"
-                + "  static_runtimes_filegroup: 'static-runtime-2'\n"
-                + "  dynamic_runtimes_filegroup: 'dynamic-runtime-2'\n"
-                + "  needsPic: true\n"
-                + "  compiler_flag: \"compiler-flag-B-1\"\n"
-                + "  compiler_flag: \"compiler-flag-B-2\"\n"
-                + "  cxx_flag: \"cxx-flag-B-1\"\n"
-                + "  cxx_flag: \"cxx-flag-B-2\"\n"
-                + "  unfiltered_cxx_flag: \"unfiltered-flag-B-1\"\n"
-                + "  unfiltered_cxx_flag: \"unfiltered-flag-B-2\"\n"
-                + "  linker_flag: \"linker-flag-B-1\"\n"
-                + "  linker_flag: \"linker-flag-B-2\"\n"
-                + "  dynamic_library_linker_flag: \"solinker-flag-B-1\"\n"
-                + "  dynamic_library_linker_flag: \"solinker-flag-B-2\"\n"
-                + "  objcopy_embed_flag: \"objcopy-embed-flag-B-1\"\n"
-                + "  objcopy_embed_flag: \"objcopy-embed-flag-B-2\"\n"
-                + "  ld_embed_flag: \"ld-embed-flag-B-1\"\n"
-                + "  ld_embed_flag: \"ld-embed-flag-B-2\"\n"
-                + "  compilation_mode_flags {\n"
-                + "    mode: FASTBUILD\n"
-                + "    compiler_flag: \"fastbuild-flag-B-1\"\n"
-                + "    compiler_flag: \"fastbuild-flag-B-2\"\n"
-                + "    cxx_flag: \"cxx-fastbuild-flag-B-1\"\n"
-                + "    cxx_flag: \"cxx-fastbuild-flag-B-2\"\n"
-                + "    linker_flag: \"linker-fastbuild-flag-B-1\"\n"
-                + "    linker_flag: \"linker-fastbuild-flag-B-2\"\n"
-                + "  }\n"
-                + "  compilation_mode_flags {\n"
-                + "    mode: DBG\n"
-                + "    compiler_flag: \"dbg-flag-B-1\"\n"
-                + "    compiler_flag: \"dbg-flag-B-2\"\n"
-                + "    cxx_flag: \"cxx-dbg-flag-B-1\"\n"
-                + "    cxx_flag: \"cxx-dbg-flag-B-2\"\n"
-                + "    linker_flag: \"linker-dbg-flag-B-1\"\n"
-                + "    linker_flag: \"linker-dbg-flag-B-2\"\n"
-                + "  }\n"
-                + "  compilation_mode_flags {\n"
-                + "    mode: COVERAGE\n"
-                + "  }\n"
-                + "  # skip mode OPT to test handling its absence\n"
-                + "  linking_mode_flags {\n"
-                + "    mode: FULLY_STATIC\n"
-                + "    linker_flag: \"fully-static-flag-B-1\"\n"
-                + "    linker_flag: \"fully-static-flag-B-2\"\n"
-                + "  }\n"
-                + "  linking_mode_flags {\n"
-                + "    mode: MOSTLY_STATIC\n"
-                + "  }\n"
-                + "  # skip linking mode DYNAMIC to test handling its absence\n"
-                + "  make_variable {\n"
-                + "    name: \"SOME_MAKE_VARIABLE-B-1\"\n"
-                + "    value: \"make-variable-value-B-1\"\n"
-                + "  }\n"
-                + "  make_variable {\n"
-                + "    name: \"SOME_MAKE_VARIABLE-B-2\"\n"
-                + "    value: \"make-variable-value-B-2 with spaces in\"\n"
-                + "  }\n"
-                + "  cxx_builtin_include_directory: \"system-include-dir-B-1\"\n"
-                + "  cxx_builtin_include_directory: \"system-include-dir-B-2\"\n"
-                + "  builtin_sysroot: \"builtin-sysroot-B\"\n"
-                + "  default_python_top: \"python-top-B\"\n"
-                + "  default_python_version: \"python-version-B\"\n"
-                + "}\n"
-                + "toolchain {\n"
-                + "  toolchain_identifier: \"toolchain-identifier-C\"\n"
-                + "  host_system_name: \"host-system-name-C\"\n"
-                + "  target_system_name: \"target-system-name-C\"\n"
-                + "  target_cpu: \"k8\"\n"
-                + "  target_libc: \"target-libc-C\"\n"
-                + "  compiler: \"compiler-C\"\n"
-                + "  abi_version: \"abi-version-C\"\n"
-                + "  abi_libc_version: \"abi-libc-version-C\"\n"
-                + "  tool_path { name: \"ar\" path: \"path/to/ar-C\" }"
-                + "  tool_path { name: \"cpp\" path: \"path/to/cpp-C\" }"
-                + "  tool_path { name: \"gcc\" path: \"path/to/gcc-C\" }"
-                + "  tool_path { name: \"gcov\" path: \"path/to/gcov-C\" }"
-                + "  tool_path { name: \"gcov-tool\" path: \"path/to/gcov-tool-C\" }"
-                + "  tool_path { name: \"ld\" path: \"path/to/ld-C\" }"
-                + "  tool_path { name: \"nm\" path: \"path/to/nm-C\" }"
-                + "  tool_path { name: \"objcopy\" path: \"path/to/objcopy-C\" }"
-                + "  tool_path { name: \"objdump\" path: \"path/to/objdump-C\" }"
-                + "  tool_path { name: \"strip\" path: \"path/to/strip-C\" }"
-                + "  tool_path { name: \"dwp\" path: \"path/to/dwp\" }\n"
-                + "}");
-
-    mockToolsConfig.create(
-        "some/BUILD",
-        "package(default_visibility=['//visibility:public'])",
-        "licenses(['unencumbered'])",
-        "filegroup(name = 'everything')");
-
-    // Need to clear out the android cpu options to avoid this split transition in Bazel.
-    CppConfiguration toolchainA =
-        create(loader, "--cpu=k8", "--host_cpu=k8", "--android_cpu=", "--fat_apk_cpu=");
-    ConfiguredTarget ccToolchainA = getCcToolchainTarget(toolchainA);
-    CcToolchainProvider ccProviderA =
-        (CcToolchainProvider) ccToolchainA.get(ToolchainInfo.PROVIDER);
-    TemplateVariableInfo makeProviderA = ccToolchainA.get(TemplateVariableInfo.PROVIDER);
-    assertThat(ccProviderA.getToolchainIdentifier()).isEqualTo("toolchain-identifier-A");
-    assertThat(ccProviderA.getHostSystemName()).isEqualTo("host-system-name-A");
-    assertThat(ccProviderA.getTargetGnuSystemName()).isEqualTo("target-system-name-A");
-    assertThat(ccProviderA.getTargetCpu()).isEqualTo("k8");
-    assertThat(ccProviderA.getTargetLibc()).isEqualTo("target-libc-A");
-    assertThat(ccProviderA.getCompiler()).isEqualTo("compiler-A");
-    assertThat(ccProviderA.getAbi()).isEqualTo("abi-version-A");
-    assertThat(ccProviderA.getAbiGlibcVersion()).isEqualTo("abi-libc-version-A");
-    assertThat(ccProviderA.getToolPathFragment(Tool.AR)).isEqualTo(getToolPath("path/to/ar-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.CPP)).isEqualTo(getToolPath("path/to/cpp-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.GCC)).isEqualTo(getToolPath("path/to/gcc-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.GCOV)).isEqualTo(getToolPath("path/to/gcov-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.LD)).isEqualTo(getToolPath("path/to/ld-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.NM)).isEqualTo(getToolPath("path/to/nm-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.OBJCOPY))
-        .isEqualTo(getToolPath("path/to/objcopy-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.OBJDUMP))
-        .isEqualTo(getToolPath("path/to/objdump-A"));
-    assertThat(ccProviderA.getToolPathFragment(Tool.STRIP))
-        .isEqualTo(getToolPath("path/to/strip-A"));
-    assertThat(ccProviderA.supportsStartEndLib(FeatureConfiguration.EMPTY)).isTrue();
-    assertThat(ccProviderA.supportsEmbeddedRuntimes()).isTrue();
-    assertThat(ccProviderA.toolchainNeedsPic()).isTrue();
-
-    assertThat(ccProviderA.getLegacyCompileOptionsWithCopts())
-        .containsExactly(
-            "compiler-flag-A-1", "compiler-flag-A-2", "fastbuild-flag-A-1", "fastbuild-flag-A-2")
-        .inOrder();
-    assertThat(ccProviderA.getUnfilteredCompilerOptions())
-        .containsExactly("unfiltered-flag-A-1", "unfiltered-flag-A-2")
-        .inOrder();
-    assertThat(CppHelper.getDynamicLinkOptions(toolchainA, ccProviderA, true))
-        .containsExactly(
-            "linker-flag-A-1",
-            "linker-flag-A-2",
-            "linker-fastbuild-flag-A-1",
-            "linker-fastbuild-flag-A-2",
-            "solinker-flag-A-1",
-            "solinker-flag-A-2")
-        .inOrder();
-
-    // Only test a couple of compilation/linking mode combinations
-    // (but test each mode at least once.)
-    assertThat(
-            ccProviderA.configureAllLegacyLinkOptions(
-                CompilationMode.FASTBUILD, LinkingMode.LEGACY_FULLY_STATIC))
-        .containsExactly(
-            "linker-flag-A-1",
-            "linker-flag-A-2",
-            "linker-fastbuild-flag-A-1",
-            "linker-fastbuild-flag-A-2",
-            "fully-static-flag-A-1",
-            "fully-static-flag-A-2")
-        .inOrder();
-    assertThat(ccProviderA.configureAllLegacyLinkOptions(CompilationMode.DBG, LinkingMode.DYNAMIC))
-        .containsExactly(
-            "linker-flag-A-1", "linker-flag-A-2", "linker-dbg-flag-A-1", "linker-dbg-flag-A-2")
-        .inOrder();
-    assertThat(
-            ccProviderA.configureAllLegacyLinkOptions(
-                CompilationMode.OPT, LinkingMode.LEGACY_FULLY_STATIC))
-        .containsExactly(
-            "linker-flag-A-1", "linker-flag-A-2", "fully-static-flag-A-1", "fully-static-flag-A-2")
-        .inOrder();
-
-    assertThat(
-            ccProviderA.configureAllLegacyLinkOptions(
-                CompilationMode.OPT, LinkingMode.LEGACY_FULLY_STATIC))
-        .containsExactly(
-            "linker-flag-A-1", "linker-flag-A-2", "fully-static-flag-A-1", "fully-static-flag-A-2")
-        .inOrder();
-
-    assertThat(ccProviderA.getObjCopyOptionsForEmbedding())
-        .containsExactly("objcopy-embed-flag-A-1", "objcopy-embed-flag-A-2")
-        .inOrder();
-    assertThat(ccProviderA.getLdOptionsForEmbedding())
-        .containsExactly("ld-embed-flag-A-1", "ld-embed-flag-A-2")
-        .inOrder();
-
-    assertThat(makeProviderA.getVariables().entrySet())
-        .containsAllIn(
-            ImmutableMap.<String, String>builder()
-                .put("SOME_MAKE_VARIABLE-A-1", "make-variable-value-A-1")
-                .put("SOME_MAKE_VARIABLE-A-2", "make-variable-value-A-2 with spaces in")
-                .put("STACK_FRAME_UNLIMITED", "")
-                .build()
-                .entrySet());
-    assertThat(ccProviderA.getBuiltInIncludeDirectories())
-        .containsExactly(
-            getToolPath("system-include-dir-A-1"), getToolPath("system-include-dir-A-2"))
-        .inOrder();
-
-    // Cursory testing of the "B" toolchain only; assume that if none of
-    // toolchain B bled through into toolchain A, the reverse also didn't occur. And
-    // we test more of it with the "C" toolchain below.
-    checkToolchainB(loader, "--cpu=k8", "--host_cpu=k8", "--compiler=compiler-B");
-    checkToolchainB(
-        loader, "--cpu=k8", "--host_cpu=k8", "--compiler=compiler-B", "--compilation_mode=opt");
-
-    // Make sure nothing bled through to the nearly-empty "C" toolchain. This is also testing for
-    // all the defaults.
-    // Need to clear out the android cpu options to avoid this split transition in Bazel.
-    CppConfiguration toolchainC =
-        create(
-            loader,
-            "--compiler=compiler-C",
-            "--cpu=k8",
-            "--host_cpu=k8",
-            "--android_cpu=",
-            "--fat_apk_cpu=");
-    CcToolchainProvider ccProviderC = getCcToolchainProvider(toolchainC);
-    assertThat(ccProviderC.getToolchainIdentifier()).isEqualTo("toolchain-identifier-C");
-    assertThat(ccProviderC.getHostSystemName()).isEqualTo("host-system-name-C");
-    assertThat(ccProviderC.getTargetGnuSystemName()).isEqualTo("target-system-name-C");
-    assertThat(ccProviderC.getTargetCpu()).isEqualTo("k8");
-    assertThat(ccProviderC.getTargetLibc()).isEqualTo("target-libc-C");
-    assertThat(ccProviderC.getCompiler()).isEqualTo("compiler-C");
-    assertThat(ccProviderC.getAbi()).isEqualTo("abi-version-C");
-    assertThat(ccProviderC.getAbiGlibcVersion()).isEqualTo("abi-libc-version-C");
-    // Don't bother with testing the list of tools again.
-    assertThat(ccProviderC.supportsStartEndLib(FeatureConfiguration.EMPTY)).isFalse();
-    assertThat(ccProviderC.supportsInterfaceSharedLibraries(FeatureConfiguration.EMPTY)).isFalse();
-    assertThat(ccProviderC.supportsEmbeddedRuntimes()).isFalse();
-    assertThat(ccProviderC.toolchainNeedsPic()).isFalse();
-    assertThat(ccProviderC.supportsFission()).isFalse();
-
-    assertThat(ccProviderC.getLegacyCompileOptionsWithCopts()).isEmpty();
-    assertThat(ccProviderC.getUnfilteredCompilerOptions()).isEmpty();
-    assertThat(CppHelper.getDynamicLinkOptions(toolchainC, ccProviderC, true)).isEmpty();
-    assertThat(
-            ccProviderC.configureAllLegacyLinkOptions(
-                CompilationMode.FASTBUILD, LinkingMode.LEGACY_FULLY_STATIC))
-        .isEmpty();
-    assertThat(ccProviderC.configureAllLegacyLinkOptions(CompilationMode.DBG, LinkingMode.DYNAMIC))
-        .isEmpty();
-    assertThat(
-            ccProviderC.configureAllLegacyLinkOptions(
-                CompilationMode.OPT, LinkingMode.LEGACY_FULLY_STATIC))
-        .isEmpty();
-    assertThat(ccProviderC.getObjCopyOptionsForEmbedding()).isEmpty();
-    assertThat(ccProviderC.getLdOptionsForEmbedding()).isEmpty();
-
-    assertThat(ccProviderC.getAdditionalMakeVariables())
-        .containsExactlyEntriesIn(
-            ImmutableMap.of(
-                "CC_FLAGS", "",
-                "STACK_FRAME_UNLIMITED", ""));
-    assertThat(ccProviderC.getBuiltInIncludeDirectories()).isEmpty();
-    assertThat(ccProviderC.getSysroot()).isNull();
-  }
-
-  protected PathFragment getToolPath(String path) throws LabelSyntaxException {
-    PackageIdentifier packageIdentifier =
-        PackageIdentifier.create(
-            TestConstants.TOOLS_REPOSITORY,
-            PathFragment.create(TestConstants.MOCK_CC_CROSSTOOL_PATH).getRelative(path));
-    return packageIdentifier.getPathUnderExecRoot();
-  }
-
-  private void checkToolchainB(CppConfigurationLoader loader, String... args) throws Exception {
-    CppConfiguration toolchainB = create(loader, args);
-    CcToolchainProvider ccProviderB = getCcToolchainProvider(toolchainB);
-    assertThat(ccProviderB.getToolchainIdentifier()).isEqualTo("toolchain-identifier-B");
-    assertThat(ccProviderB.configureAllLegacyLinkOptions(CompilationMode.DBG, LinkingMode.DYNAMIC))
-        .containsExactly(
-            "linker-flag-B-1", "linker-flag-B-2", "linker-dbg-flag-B-1", "linker-dbg-flag-B-2")
-        .inOrder();
-    assertThat(ccProviderB.getLegacyCompileOptionsWithCopts())
-        .containsAllOf("compiler-flag-B-1", "compiler-flag-B-2")
-        .inOrder();
-  }
-
-  /**
-   * Returns a test crosstool config with the specified tool missing from the tool_path
-   * set. Also allows injection of custom fields.
-   */
-  private static String getConfigWithMissingToolDef(Tool missingTool, String... customFields) {
-    StringBuilder s =
-        new StringBuilder(
-            "major_version: \"12\""
-                + "minor_version: \"0\""
-                + "toolchain {"
-                + "  toolchain_identifier: \"toolchain-identifier\""
-                + "  host_system_name: \"host-system-name\""
-                + "  target_system_name: \"target-system-name\""
-                + "  target_cpu: \"banana_cpu\""
-                + "  target_libc: \"target-libc\""
-                + "  compiler: \"compiler\""
-                + "  abi_version: \"abi-version\""
-                + "  abi_libc_version: \"abi-libc-version\"");
-
-    for (String customField : customFields) {
-      s.append(customField);
-    }
-    for (Tool tool : Tool.values()) {
-      if (tool != missingTool) {
-        String toolName = tool.getNamePart();
-        s.append("  tool_path { name: \"" + toolName + "\" path: \"path-to-" + toolName + "\" }");
-      }
-    }
-    s.append("}");
-    return s.toString();
-  }
-
-  /**
-   * For a non-fission-supporting crosstool, there's no need to check the dwp tool path.
-   */
-  @Test
-  public void testNonFissionConfigWithMissingDwp() throws Exception {
-    CppConfigurationLoader loader =
-        loader(getConfigWithMissingToolDef(Tool.DWP, "supports_fission: false"));
-    // The following line throws an IllegalArgumentException if an expected tool path is missing.
-    create(loader, "--cpu=banana_cpu");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java
index c6beb9f..eaad325 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.FileProvider;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,7 +36,7 @@
       throws Exception {
     // Strip the first parameters from the argv, which are the dynamic library script
     // (usually tools/cpp/link_dynamic_library.sh), and its arguments.
-    return linkAction.getArguments().subList(6, optionPatterns.length + 6);
+    return linkAction.getArguments().subList(1, optionPatterns.length + 1);
   }
 
   private void assertLinkopts(CppLinkAction linkAction, String... optionPatterns) throws Exception {
@@ -47,6 +48,10 @@
 
   @Test
   public void testGeneratedLib() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
+
     useConfiguration("--cpu=k8");
     ConfiguredTarget genlib =
         scratchConfiguredTarget(
@@ -80,6 +85,10 @@
    */
   @Test
   public void testCcLibraryLinkopts() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
+
     scratch.overwriteFile(
         "custom_malloc/BUILD",
         "cc_library(name = 'custom_malloc',",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
index cd515f6..03eaebc 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
@@ -55,6 +55,9 @@
 
   @Test
   public void testForcePicBuildVariable() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE);
     useConfiguration("--force_pic");
     scratch.file("x/BUILD", "cc_binary(name = 'bin', srcs = ['a.cc'])");
     scratch.file("x/a.cc");
@@ -69,7 +72,9 @@
 
   @Test
   public void testLibrariesToLinkAreExported() throws Exception {
-    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig);
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     useConfiguration();
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
@@ -133,11 +138,12 @@
 
   @Test
   public void testInterfaceLibraryBuildingVariablesWhenLegacyGenerationPossible() throws Exception {
-    // Make sure the interface shared object generation is enabled in the configuration
-    // (which it is not by default for some windows toolchains)
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, "supports_interface_shared_objects: true");
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     useConfiguration();
 
     verifyIfsoVariables();
@@ -145,9 +151,12 @@
 
   @Test
   public void testInterfaceLibraryBuildingVariablesWhenGenerationPossible() throws Exception {
-    // Make sure the interface shared object generation is enabled in the configuration
-    // (which it is not by default for some windows toolchains)
-    AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig);
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     useConfiguration();
 
     verifyIfsoVariables();
@@ -198,10 +207,11 @@
         .setupCrosstool(
             mockToolsConfig,
             MockCcSupport.THIN_LTO_CONFIGURATION,
+            MockCcSupport.SUPPORTS_PIC_FEATURE,
             MockCcSupport.HOST_AND_NONHOST_CONFIGURATION,
-            "supports_interface_shared_objects: true",
-            "needsPic: true",
-            "supports_start_end_lib: true");
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_START_END_LIB_FEATURE);
     useConfiguration("--features=thin_lto");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
@@ -254,7 +264,7 @@
     // (which it is not by default for some windows toolchains)
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, "supports_interface_shared_objects: true");
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     useConfiguration();
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
@@ -292,6 +302,9 @@
 
   @Test
   public void testOutputExecpath() throws Exception {
+    AnalysisMock.get()
+        .ccSupport()
+        .setupCrosstool(mockToolsConfig, MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     // Make sure the interface shared object generation is enabled in the configuration
     // (which it is not by default for some windows toolchains)
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
@@ -309,16 +322,16 @@
 
   @Test
   public void testOutputExecpathIsNotExposedWhenThinLtoIndexing() throws Exception {
-    // Make sure the interface shared object generation is enabled in the configuration
-    // (which it is not by default for some windows toolchains)
     AnalysisMock.get()
         .ccSupport()
         .setupCrosstool(
             mockToolsConfig,
             MockCcSupport.THIN_LTO_CONFIGURATION,
             MockCcSupport.HOST_AND_NONHOST_CONFIGURATION,
-            "needsPic: true",
-            "supports_start_end_lib: true");
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_PIC_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE,
+            MockCcSupport.SUPPORTS_START_END_LIB_FEATURE);
     useConfiguration("--features=thin_lto");
 
     scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'])");
@@ -399,7 +412,7 @@
 
     AnalysisMock.get()
         .ccSupport()
-        .setupCrosstool(mockToolsConfig, "supports_fission: true");
+        .setupCrosstool(mockToolsConfig, MockCcSupport.PER_OBJECT_DEBUG_INFO_CONFIGURATION);
 
     useConfiguration("--fission=no");
     ConfiguredTarget target = getConfiguredTarget("//x:foo");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
index 5dd6459..572bf95 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
@@ -438,7 +438,7 @@
     AnalysisMock.get()
         .ccSupport()
         .setupCrosstool(mockToolsConfig, "compiler_flag: '-foo'", "cxx_flag: '-foo_for_cxx_only'");
-    useConfiguration();
+    useConfiguration("--noincompatible_disable_legacy_crosstool_fields");
     SkylarkList<String> commandLine =
         commandLineForVariables(
             CppActionNames.CPP_COMPILE,
@@ -455,7 +455,7 @@
     AnalysisMock.get()
         .ccSupport()
         .setupCrosstool(mockToolsConfig, "compiler_flag: '-foo'", "cxx_flag: '-foo_for_cxx_only'");
-    useConfiguration();
+    useConfiguration("--noincompatible_disable_legacy_crosstool_fields");
     assertThat(
             commandLineForVariables(
                 CppActionNames.CPP_COMPILE,
@@ -524,6 +524,11 @@
 
   @Test
   public void testCompileBuildVariablesForPic() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig, MockCcSupport.SUPPORTS_PIC_FEATURE, MockCcSupport.PIC_FEATURE);
+    useConfiguration();
     assertThat(
             commandLineForVariables(
                 CppActionNames.CPP_COMPILE,
@@ -893,7 +898,7 @@
     AnalysisMock.get()
         .ccSupport()
         .setupCrosstool(mockToolsConfig, "test_only_linker_flag: '-im_only_testing_flag'");
-    useConfiguration();
+    useConfiguration("--noincompatible_disable_legacy_crosstool_fields");
     assertThat(
             commandLineForVariables(
                 CppActionNames.CPP_LINK_EXECUTABLE,
@@ -930,7 +935,7 @@
             "  mode: DYNAMIC",
             "  linker_flag: '-dynamic_linking_mode_flag'",
             "}");
-    useConfiguration();
+    useConfiguration("--noincompatible_disable_legacy_crosstool_fields");
     SkylarkList<String> staticLinkingModeFlags =
         commandLineForVariables(
             CppActionNames.CPP_LINK_EXECUTABLE,
@@ -1166,12 +1171,12 @@
         .setupCrosstool(
             mockToolsConfig,
             MockCcSupport.COPY_DYNAMIC_LIBRARIES_TO_BINARY_CONFIGURATION,
-            MockCcSupport.TARGETS_WINDOWS_CONFIGURATION);
+            MockCcSupport.TARGETS_WINDOWS_CONFIGURATION,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     doTestCcLinkingContext(
         ImmutableList.of("a.a", "libdep2.a", "b.a", "c.a", "d.a", "libdep1.a"),
         ImmutableList.of("a.pic.a", "b.pic.a", "c.pic.a", "e.pic.a"),
-        ImmutableList.of("a.so", "libdep2.so", "b.so", "e.so", "libdep1.so"),
-        /* disableSupportsPic= */ true);
+        ImmutableList.of("a.so", "libdep2.so", "b.so", "e.so", "libdep1.so"));
   }
 
   @Test
@@ -1181,23 +1186,20 @@
         .setupCrosstool(
             mockToolsConfig,
             MockCcSupport.PIC_FEATURE,
-            "needsPic: true");
+            MockCcSupport.SUPPORTS_PIC_FEATURE,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE);
     doTestCcLinkingContext(
         ImmutableList.of("a.a", "b.a", "c.a", "d.a"),
         ImmutableList.of("a.pic.a", "libdep2.a", "b.pic.a", "c.pic.a", "e.pic.a", "libdep1.a"),
-        ImmutableList.of("a.so", "liba_Slibdep2.so", "b.so", "e.so", "liba_Slibdep1.so"),
-        /* disableSupportsPic= */ false);
+        ImmutableList.of("a.so", "liba_Slibdep2.so", "b.so", "e.so", "liba_Slibdep1.so"));
   }
 
   private void doTestCcLinkingContext(
       List<String> staticLibraryList,
       List<String> picStaticLibraryList,
-      List<String> dynamicLibraryList,
-      boolean disableSupportsPic)
+      List<String> dynamicLibraryList)
       throws Exception {
-    useConfiguration(
-        "--features=-supports_interface_shared_libraries",
-        disableSupportsPic ? "--features=-supports_pic" : "--features=supports_pic");
+    useConfiguration("--features=-supports_interface_shared_libraries");
     setUpCcLinkingContextTest();
     ConfiguredTarget a = getConfiguredTarget("//a:a");
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java
index 7599c57..c27af4f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.bazel.rules.cpp.proto.BazelCcProtoAspect;
 import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.rules.cpp.CppCompileAction;
@@ -63,6 +64,12 @@
 
   @Test
   public void basic() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     scratch.file(
         "x/BUILD",
         "cc_proto_library(name = 'foo_cc_proto', deps = ['foo_proto'])",
@@ -194,6 +201,12 @@
 
   @Test
   public void commandLineControlsOutputFileSuffixes() throws Exception {
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            MockCcSupport.SUPPORTS_DYNAMIC_LINKER_FEATURE,
+            MockCcSupport.SUPPORTS_INTERFACE_SHARED_LIBRARIES_FEATURE);
     useConfiguration(
         "--cc_proto_library_header_suffixes=.pb.h,.proto.h",
         "--cc_proto_library_source_suffixes=.pb.cc,.pb.cc.meta");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
index 20aa815..8872b9a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
@@ -50,6 +50,7 @@
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.RuleClassProvider;
 import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
@@ -344,6 +345,12 @@
     if (defaultFlags().contains(Flag.TRIMMED_CONFIGURATIONS)) {
       return;
     }
+    getAnalysisMock()
+        .ccSupport()
+        .setupCrosstool(
+            mockToolsConfig,
+            /* appendToCurrentToolchain= */ false,
+            MockCcSupport.emptyToolchainForCpu("armeabi-v7a"));
     scratch.file(
         "java/a/BUILD",
         "cc_library(name = 'lib', srcs = ['lib.cc'])",