diff options
author | 2017-09-12 23:58:34 +0200 | |
---|---|---|
committer | 2017-09-13 19:06:29 +0200 | |
commit | e0bbe757b3626fbbadbab798e6752ca086e9ff46 (patch) | |
tree | 7d58994baa09bdce6be8df4276e15d31aac9d057 /src | |
parent | 93d65a4473c9c963a190b433f359ef7e52273bd4 (diff) |
Remove outdated references to static vs. dynamic configurations.
PiperOrigin-RevId: 168452997
Diffstat (limited to 'src')
9 files changed, 68 insertions, 116 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java b/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java index 9b67fe8583..f548b1860a 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java @@ -26,11 +26,13 @@ import javax.annotation.Nullable; /** * A dependency of a configured target through a label. * - * <p>For static configurations: includes the target and the configuration of the dependency + * <p>The dep's configuration can be specified in one of two ways: + * + * <p>Explicit configurations: includes the target and the configuration of the dependency * configured target and any aspects that may be required, as well as the configurations for * these aspects. * - * <p>For dynamic configurations: includes the target and the desired configuration transitions + * <p>Configuration transitions: includes the target and the desired configuration transitions * that should be applied to produce the dependency's configuration. It's the caller's * responsibility to construct an actual configuration out of that. A set of aspects is also * included; the caller must also construct configurations for each of these. @@ -45,30 +47,29 @@ public abstract class Dependency { /** * Creates a new {@link Dependency} with a null configuration, suitable for edges with no - * configuration in static configuration builds. + * configuration. */ public static Dependency withNullConfiguration(Label label) { return new NullConfigurationDependency(label); } /** - * Creates a new {@link Dependency} with the given configuration, suitable for static - * configuration builds. + * Creates a new {@link Dependency} with the given explicit configuration. * * <p>The configuration must not be {@code null}. * * <p>A {@link Dependency} created this way will have no associated aspects. */ public static Dependency withConfiguration(Label label, BuildConfiguration configuration) { - return new StaticConfigurationDependency( + return new ExplicitConfigurationDependency( label, configuration, AspectCollection.EMPTY, ImmutableMap.<AspectDescriptor, BuildConfiguration>of()); } /** - * Creates a new {@link Dependency} with the given configuration and aspects, suitable for - * static configuration builds. The configuration is also applied to all aspects. + * Creates a new {@link Dependency} with the given configuration and aspects. The configuration + * is also applied to all aspects. * * <p>The configuration and aspects must not be {@code null}. */ @@ -79,12 +80,13 @@ public abstract class Dependency { for (AspectDescriptor aspect : aspects.getAllAspects()) { aspectBuilder.put(aspect, configuration); } - return new StaticConfigurationDependency(label, configuration, aspects, aspectBuilder.build()); + return new ExplicitConfigurationDependency(label, configuration, aspects, + aspectBuilder.build()); } /** * Creates a new {@link Dependency} with the given configuration and aspects, suitable for - * storing the output of a dynamic configuration trimming step. The aspects each have their own + * storing the output of a configuration trimming step. The aspects each have their own * configuration. * * <p>The aspects and configurations must not be {@code null}. @@ -93,17 +95,16 @@ public abstract class Dependency { Label label, BuildConfiguration configuration, AspectCollection aspects, Map<AspectDescriptor, BuildConfiguration> aspectConfigurations) { - return new StaticConfigurationDependency( + return new ExplicitConfigurationDependency( label, configuration, aspects, ImmutableMap.copyOf(aspectConfigurations)); } /** - * Creates a new {@link Dependency} with the given transition and aspects, suitable for dynamic - * configuration builds. + * Creates a new {@link Dependency} with the given transition and aspects. */ public static Dependency withTransitionAndAspects( Label label, Attribute.Transition transition, AspectCollection aspects) { - return new DynamicConfigurationDependency(label, transition, aspects); + return new ConfigurationTransitionDependency(label, transition, aspects); } protected final Label label; @@ -122,23 +123,23 @@ public abstract class Dependency { } /** - * Returns true if this dependency specifies a static configuration, false if it specifies - * a dynamic transition. + * Returns true if this dependency specifies an explicit configuration, false if it specifies + * a configuration transition. */ - public abstract boolean hasStaticConfiguration(); + public abstract boolean hasExplicitConfiguration(); /** - * Returns the static configuration for the target this dependency points to. + * Returns the explicit configuration intended for this dependency. * - * @throws IllegalStateException if {@link #hasStaticConfiguration} returns false. + * @throws IllegalStateException if {@link #hasExplicitConfiguration} returns false. */ @Nullable public abstract BuildConfiguration getConfiguration(); /** - * Returns the dynamic transition to be applied to reach the target this dependency points to. + * Returns the configuration transition to apply to reach the target this dependency points to. * - * @throws IllegalStateException if {@link #hasStaticConfiguration} returns true. + * @throws IllegalStateException if {@link #hasExplicitConfiguration} returns true. */ public abstract Attribute.Transition getTransition(); @@ -151,15 +152,15 @@ public abstract class Dependency { public abstract AspectCollection getAspects(); /** - * Returns the the static configuration an aspect should be evaluated with + * Returns the configuration an aspect should be evaluated with ** - * @throws IllegalStateException if {@link #hasStaticConfiguration()} returns false. + * @throws IllegalStateException if {@link #hasExplicitConfiguration()} returns false. */ public abstract BuildConfiguration getAspectConfiguration(AspectDescriptor aspect); /** - * Implementation of a dependency with no configuration, suitable for static configuration - * builds of edges to source files or e.g. for visibility. + * Implementation of a dependency with no configuration, suitable for, e.g., source files or + * visibility. */ private static final class NullConfigurationDependency extends Dependency { public NullConfigurationDependency(Label label) { @@ -167,7 +168,7 @@ public abstract class Dependency { } @Override - public boolean hasStaticConfiguration() { + public boolean hasExplicitConfiguration() { return true; } @@ -180,7 +181,7 @@ public abstract class Dependency { @Override public Attribute.Transition getTransition() { throw new IllegalStateException( - "A dependency with a static configuration does not have a transition."); + "This dependency has an explicit configuration, not a transition."); } @Override @@ -214,15 +215,14 @@ public abstract class Dependency { } /** - * Implementation of a dependency with static configurations, suitable for static configuration - * builds. + * Implementation of a dependency with an explicitly set configuration. */ - private static final class StaticConfigurationDependency extends Dependency { + private static final class ExplicitConfigurationDependency extends Dependency { private final BuildConfiguration configuration; private final AspectCollection aspects; private final ImmutableMap<AspectDescriptor, BuildConfiguration> aspectConfigurations; - public StaticConfigurationDependency( + public ExplicitConfigurationDependency( Label label, BuildConfiguration configuration, AspectCollection aspects, ImmutableMap<AspectDescriptor, BuildConfiguration> aspectConfigurations) { @@ -233,7 +233,7 @@ public abstract class Dependency { } @Override - public boolean hasStaticConfiguration() { + public boolean hasExplicitConfiguration() { return true; } @@ -245,7 +245,7 @@ public abstract class Dependency { @Override public Attribute.Transition getTransition() { throw new IllegalStateException( - "A dependency with a static configuration does not have a transition."); + "This dependency has an explicit configuration, not a transition."); } @Override @@ -265,10 +265,10 @@ public abstract class Dependency { @Override public boolean equals(Object other) { - if (!(other instanceof StaticConfigurationDependency)) { + if (!(other instanceof ExplicitConfigurationDependency)) { return false; } - StaticConfigurationDependency otherDep = (StaticConfigurationDependency) other; + ExplicitConfigurationDependency otherDep = (ExplicitConfigurationDependency) other; return label.equals(otherDep.label) && configuration.equals(otherDep.configuration) && aspects.equals(otherDep.aspects) @@ -278,20 +278,19 @@ public abstract class Dependency { @Override public String toString() { return String.format( - "StaticConfigurationDependency{label=%s, configuration=%s, aspectConfigurations=%s}", - label, configuration, aspectConfigurations); + "%s{label=%s, configuration=%s, aspectConfigurations=%s}", + getClass().getSimpleName(), label, configuration, aspectConfigurations); } } /** - * Implementation of a dependency with a given configuration transition, suitable for dynamic - * configuration builds. + * Implementation of a dependency with a given configuration transition. */ - private static final class DynamicConfigurationDependency extends Dependency { + private static final class ConfigurationTransitionDependency extends Dependency { private final Attribute.Transition transition; private final AspectCollection aspects; - public DynamicConfigurationDependency( + public ConfigurationTransitionDependency( Label label, Attribute.Transition transition, AspectCollection aspects) { super(label); this.transition = Preconditions.checkNotNull(transition); @@ -299,14 +298,14 @@ public abstract class Dependency { } @Override - public boolean hasStaticConfiguration() { + public boolean hasExplicitConfiguration() { return false; } @Override public BuildConfiguration getConfiguration() { throw new IllegalStateException( - "A dependency with a dynamic configuration transition does not have a configuration."); + "This dependency has a transition, not an explicit configuration."); } @Override @@ -322,8 +321,7 @@ public abstract class Dependency { @Override public BuildConfiguration getAspectConfiguration(AspectDescriptor aspect) { throw new IllegalStateException( - "A dependency with a dynamic configuration transition does not have aspect " - + "configurations."); + "This dependency has a transition, not an explicit aspect configuration."); } @Override @@ -333,10 +331,10 @@ public abstract class Dependency { @Override public boolean equals(Object other) { - if (!(other instanceof DynamicConfigurationDependency)) { + if (!(other instanceof ConfigurationTransitionDependency)) { return false; } - DynamicConfigurationDependency otherDep = (DynamicConfigurationDependency) other; + ConfigurationTransitionDependency otherDep = (ConfigurationTransitionDependency) other; return label.equals(otherDep.label) && transition.equals(otherDep.transition) && aspects.equals(otherDep.aspects); @@ -345,8 +343,8 @@ public abstract class Dependency { @Override public String toString() { return String.format( - "DynamicConfigurationDependency{label=%s, transition=%s, aspects=%s}", - label, transition, aspects); + "%s{label=%s, transition=%s, aspects=%s}", + getClass().getSimpleName(), label, transition, aspects); } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index ce8405bafb..7b3f7253a2 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -255,8 +255,8 @@ public final class AspectFunction implements SkyFunction { // When getting the dependencies of this hybrid aspect+base target, use the aspect's // configuration. The configuration of the aspect will always be a superset of the target's - // (dynamic configuration mode: target is part of the aspect's config fragment requirements; - // static configuration mode: target is the same configuration as the aspect), so the fragments + // (trimmed configuration mode: target is part of the aspect's config fragment requirements; + // untrimmed mode: target is the same configuration as the aspect), so the fragments // required by all dependencies (both those of the aspect and those of the base target) // will be present this way. TargetAndConfiguration originalTargetAndAspectConfiguration = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java index 0656d45dfb..ee23308d07 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java @@ -112,7 +112,7 @@ public final class AspectValue extends ActionLookupValue { /** * Returns the configuration to be used for the evaluation of the aspect itself. * - * <p>In dynamic configuration mode, the aspect may require more fragments than the target on + * <p>In trimmed configuration mode, the aspect may require more fragments than the target on * which it is being evaluated; in addition to configuration fragments required by the target * and its dependencies, an aspect has configuration fragment requirements of its own, as well * as dependencies of its own with their own configuration fragment requirements. @@ -122,7 +122,7 @@ public final class AspectValue extends ActionLookupValue { * configurations trimmed from this one as normal. * * <p>Because of these properties, this configuration is always a superset of that returned by - * {@link #getBaseConfiguration()}. In static configuration mode, this configuration will be + * {@link #getBaseConfiguration()}. In untrimmed configuration mode, this configuration will be * equivalent to that returned by {@link #getBaseConfiguration()}. * * @see #getBaseConfiguration() @@ -134,7 +134,7 @@ public final class AspectValue extends ActionLookupValue { /** * Returns the configuration to be used for the base target. * - * <p>In dynamic configuration mode, the configured target this aspect is attached to may have + * <p>In trimmed configuration mode, the configured target this aspect is attached to may have * a different configuration than the aspect itself (see the documentation for * {@link #getAspectConfiguration()} for an explanation why). The base configuration is the one * used to construct a key to look up the base configured target. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java index 2b18dc8b01..ce60f42cfe 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java @@ -531,7 +531,7 @@ public final class ConfiguredTargetFunction implements SkyFunction { * Creates a dynamic configuration for each dep that's custom-fitted specifically for that dep. * * <p>More specifically: given a set of {@link Dependency} instances holding dynamic config - * transition requests (e.g. {@link Dependency#hasStaticConfiguration()} == false}), returns + * transition requests (e.g. {@link Dependency#hasExplicitConfiguration()} == false}), returns * equivalent dependencies containing dynamically created configurations applying those * transitions. If {@link BuildConfiguration.Options#trimConfigurations()} is true, these * configurations only contain the fragments needed by the dep and its transitive closure. Else @@ -618,7 +618,7 @@ public final class ConfiguredTargetFunction implements SkyFunction { // // A *lot* of targets have null deps, so this produces real savings. Profiling tests over a // simple cc_binary show this saves ~1% of total analysis phase time. - if (dep.hasStaticConfiguration()) { + if (dep.hasExplicitConfiguration()) { continue; } @@ -869,7 +869,7 @@ public final class ConfiguredTargetFunction implements SkyFunction { OrderedSetMultimap<Attribute, Dependency> result = OrderedSetMultimap.create(); for (Map.Entry<Attribute, Dependency> depsEntry : originalDeps.entries()) { AttributeAndLabel attrAndLabel = iterator.next(); - if (depsEntry.getValue().hasStaticConfiguration()) { + if (depsEntry.getValue().hasExplicitConfiguration()) { result.put(attrAndLabel.attribute, depsEntry.getValue()); } else { Collection<Dependency> dynamicAttrDeps = dynamicDeps.get(attrAndLabel); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java index 6a472b7839..fb18457312 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java @@ -505,8 +505,6 @@ public final class SkyframeBuildView { * Returns the host configuration trimmed to the same fragments as the input configuration. If * the input is null, returns the top-level host configuration. * - * <p>For static configurations, this unconditionally returns the (sole) top-level configuration. - * * <p>This may only be called after {@link #setTopLevelHostConfiguration} has set the * correct host configuration at the top-level. */ @@ -531,7 +529,7 @@ public final class SkyframeBuildView { Set<Class<? extends BuildConfiguration.Fragment>> fragmentClasses = config.trimConfigurations() ? config.fragmentClasses() - : ((ConfiguredRuleClassProvider) ruleClassProvider).getAllFragments(); + : ruleClassProvider.getAllFragments(); BuildConfiguration hostConfig = hostConfigurationCache.get(fragmentClasses); if (hostConfig != null) { return hostConfig; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 8ddecaf657..fafe911823 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -1435,7 +1435,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { Map<Label, Set<Class<? extends BuildConfiguration.Fragment>>> fragmentsMap = new HashMap<>(); Set<Label> labelsWithErrors = new HashSet<>(); for (Dependency key : keys) { - if (key.hasStaticConfiguration()) { + if (key.hasExplicitConfiguration()) { builder.put(key, key.getConfiguration()); } else if (useUntrimmedDynamicConfigs(fromOptions)) { fragmentsMap.put(key.getLabel(), allFragments); @@ -1464,7 +1464,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { // Now get the configurations. final List<SkyKey> configSkyKeys = new ArrayList<>(); for (Dependency key : keys) { - if (labelsWithErrors.contains(key.getLabel()) || key.hasStaticConfiguration()) { + if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) { continue; } Set<Class<? extends BuildConfiguration.Fragment>> depFragments = @@ -1479,7 +1479,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { EvaluationResult<SkyValue> configsResult = evaluateSkyKeys(eventHandler, configSkyKeys, /*keepGoing=*/true); for (Dependency key : keys) { - if (labelsWithErrors.contains(key.getLabel()) || key.hasStaticConfiguration()) { + if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) { continue; } Set<Class<? extends BuildConfiguration.Fragment>> depFragments = diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java index 1444837448..af37c8b78f 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java @@ -192,17 +192,16 @@ public class DependencyResolverTest extends AnalysisTestCase { } /** - * Null configurations should be static whether we're building with static or dynamic - * configurations. This is because the dynamic config logic that translates transitions into - * final configurations can be trivially skipped in those cases. + * Null configurations should always be explicit (vs. holding transitions). This lets Bazel skip + * its complicated dependency configuration logic for these cases. */ @Test - public void nullConfigurationsAlwaysStatic() throws Exception { + public void nullConfigurationsAlwaysExplicit() throws Exception { pkg("a", "genrule(name = 'gen', srcs = ['gen.in'], cmd = '', outs = ['gen.out'])"); update(); Dependency dep = assertDep(dependentNodeMap("//a:gen", null), "srcs", "//a:gen.in"); - assertThat(dep.hasStaticConfiguration()).isTrue(); + assertThat(dep.hasExplicitConfiguration()).isTrue(); assertThat(dep.getConfiguration()).isNull(); } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java index 4de388c23f..df6541a461 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java @@ -42,7 +42,7 @@ public class DependencyTest extends AnalysisTestCase { Dependency nullDep = Dependency.withNullConfiguration(Label.parseAbsolute("//a")); assertThat(nullDep.getLabel()).isEqualTo(Label.parseAbsolute("//a")); - assertThat(nullDep.hasStaticConfiguration()).isTrue(); + assertThat(nullDep.hasExplicitConfiguration()).isTrue(); assertThat(nullDep.getConfiguration()).isNull(); assertThat(nullDep.getAspects().getAllAspects()).isEmpty(); @@ -61,7 +61,7 @@ public class DependencyTest extends AnalysisTestCase { Dependency.withConfiguration(Label.parseAbsolute("//a"), getTargetConfiguration()); assertThat(targetDep.getLabel()).isEqualTo(Label.parseAbsolute("//a")); - assertThat(targetDep.hasStaticConfiguration()).isTrue(); + assertThat(targetDep.hasExplicitConfiguration()).isTrue(); assertThat(targetDep.getConfiguration()).isEqualTo(getTargetConfiguration()); assertThat(targetDep.getAspects().getAllAspects()).isEmpty(); @@ -85,7 +85,7 @@ public class DependencyTest extends AnalysisTestCase { Label.parseAbsolute("//a"), getTargetConfiguration(), twoAspects); assertThat(targetDep.getLabel()).isEqualTo(Label.parseAbsolute("//a")); - assertThat(targetDep.hasStaticConfiguration()).isTrue(); + assertThat(targetDep.hasExplicitConfiguration()).isTrue(); assertThat(targetDep.getConfiguration()).isEqualTo(getTargetConfiguration()); assertThat(targetDep.getAspects()).isEqualTo(twoAspects); assertThat(targetDep.getAspectConfiguration(simpleAspect)).isEqualTo(getTargetConfiguration()); @@ -142,7 +142,7 @@ public class DependencyTest extends AnalysisTestCase { Label.parseAbsolute("//a"), getTargetConfiguration(), aspects, twoAspectMap); assertThat(targetDep.getLabel()).isEqualTo(Label.parseAbsolute("//a")); - assertThat(targetDep.hasStaticConfiguration()).isTrue(); + assertThat(targetDep.hasExplicitConfiguration()).isTrue(); assertThat(targetDep.getConfiguration()).isEqualTo(getTargetConfiguration()); assertThat(targetDep.getAspects().getAllAspects()) .containsExactly(simpleAspect, attributeAspect); @@ -182,7 +182,7 @@ public class DependencyTest extends AnalysisTestCase { Label.parseAbsolute("//a"), ConfigurationTransition.HOST, twoAspects); assertThat(hostDep.getLabel()).isEqualTo(Label.parseAbsolute("//a")); - assertThat(hostDep.hasStaticConfiguration()).isFalse(); + assertThat(hostDep.hasExplicitConfiguration()).isFalse(); assertThat(hostDep.getAspects().getAllAspects()) .containsExactlyElementsIn(twoAspects.getAllAspects()); assertThat(hostDep.getTransition()).isEqualTo(ConfigurationTransition.HOST); 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 f98f897979..dafa0530f9 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 @@ -349,49 +349,6 @@ toolchain { supports_interface_shared_objects: true } -# Stub crosstool to allow construction of apple crosstool configuration in a -# static configuration set. -# TODO(b/33804121): Remove this once dynamic configurations are in place. -toolchain { - toolchain_identifier: "local_ios" - - host_system_name: "local" - target_system_name: "local" - target_cpu: "ios_x86_64" - target_libc: "ios" - compiler: "compiler" - linking_mode_flags { mode: DYNAMIC } - - 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" } - - needsPic: false - - builtin_sysroot: "" - cxx_flag: "-std=c++0x" - linker_flag: "-lstdc++" - 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" - objcopy_embed_flag: "-I" - objcopy_embed_flag: "binary" - supports_interface_shared_objects: true -} - toolchain { toolchain_identifier: "local_windows_mingw" |