diff options
author | 2018-03-15 09:20:42 -0700 | |
---|---|---|
committer | 2018-03-15 09:22:45 -0700 | |
commit | d1119fa583ff659a80828d1b67cc980b04f6b386 (patch) | |
tree | c7161ba3e0f88c9857eac4cae56d39416e8593af | |
parent | 6a0ac92a0938f141644411f12cb4e6e499684886 (diff) |
Conditionally set the default crosstool based on the major revision by binding //external:android/crosstool to an alias in the NDK BUILD file.
This does not change existing behavior until r17 support is released.
https://github.com/bazelbuild/bazel/issues/4742
RELNOTES: None.
PiperOrigin-RevId: 189195669
4 files changed, 33 insertions, 18 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java index bbdefada8a..cf61da68b9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java @@ -27,6 +27,8 @@ import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths; import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkRelease; import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl; import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpls; +import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpls.GnuLibStdCppStlImpl; +import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpls.LibCppStlImpl; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; @@ -219,7 +221,9 @@ public class AndroidNdkRepositoryFunction extends AndroidRepositoryFunction { throw new RepositoryFunctionException(new IOException(e), Transience.PERSISTENT); } - String buildFile = createBuildFile(ruleName, crosstoolsAndStls.build()); + String defaultCrosstool = getDefaultCrosstool(ndkRelease.majorRevision); + + String buildFile = createBuildFile(ruleName, defaultCrosstool, crosstoolsAndStls.build()); writeBuildFile(outputDirectory, buildFile); return RepositoryDirectoryValue.builder().setPath(outputDirectory); } @@ -229,12 +233,18 @@ public class AndroidNdkRepositoryFunction extends AndroidRepositoryFunction { return AndroidNdkRepositoryRule.class; } + private static String getDefaultCrosstool(Integer majorRevision) { + // From NDK 17, libc++ replaces gnu-libstdc++ as the default STL. + return majorRevision <= 16 ? GnuLibStdCppStlImpl.NAME : LibCppStlImpl.NAME; + } + private static PathFragment getAndroidNdkHomeEnvironmentVar( Path workspace, Map<String, String> env) { return workspace.getRelative(PathFragment.create(env.get(PATH_ENV_VAR))).asFragment(); } - private static String createBuildFile(String ruleName, List<CrosstoolStlPair> crosstools) { + private static String createBuildFile( + String ruleName, String defaultCrosstool, List<CrosstoolStlPair> crosstools) { String buildFileTemplate = getTemplate("android_ndk_build_file_template.txt"); String ccToolchainSuiteTemplate = getTemplate("android_ndk_cc_toolchain_suite_template.txt"); @@ -286,6 +296,7 @@ public class AndroidNdkRepositoryFunction extends AndroidRepositoryFunction { return buildFileTemplate .replace("%ruleName%", ruleName) + .replace("%defaultCrosstool%", "//:toolchain-" + defaultCrosstool) .replace("%ccToolchainSuites%", ccToolchainSuites) .replace("%ccToolchainRules%", ccToolchainRules) .replace("%stlFilegroups%", stlFilegroups) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java index c2a5be5f92..7d3088029c 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java @@ -21,7 +21,6 @@ import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; -import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpls; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; @@ -38,16 +37,12 @@ public class AndroidNdkRepositoryRule implements RuleDefinition { public static final String NAME = "android_ndk_repository"; private static final Function<? super Rule, Map<String, Label>> BINDINGS_FUNCTION = - rule -> { - String defaultToolchainName = - AndroidNdkRepositoryFunction.createToolchainName(StlImpls.DEFAULT_STL_NAME); - - return ImmutableMap.of( - "android/crosstool", - Label.parseAbsoluteUnchecked("@" + rule.getName() + "//:" + defaultToolchainName), - "android_ndk_for_testing", - Label.parseAbsoluteUnchecked("@" + rule.getName() + "//:files")); - }; + rule -> + ImmutableMap.of( + "android/crosstool", + Label.parseAbsoluteUnchecked("@" + rule.getName() + "//:default_crosstool"), + "android_ndk_for_testing", + Label.parseAbsoluteUnchecked("@" + rule.getName() + "//:files")); @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt index eb2f818e0a..6612d27890 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt @@ -27,6 +27,11 @@ cc_library( srcs = [], ) +alias( + name = "default_crosstool", + actual = "%defaultCrosstool%", +) + ################################################################ # cc toolchain suite rules (one for each STL in the NDK) ################################################################ diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpls.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpls.java index 0508b7c7c5..dc651e5e18 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpls.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpls.java @@ -24,14 +24,14 @@ import java.util.List; */ public final class StlImpls { - public static final String DEFAULT_STL_NAME = "gnu-libstdcpp"; - private StlImpls() {} public static class GnuLibStdCppStlImpl extends StlImpl { + public static final String NAME = "gnu-libstdcpp"; + public GnuLibStdCppStlImpl(NdkPaths ndkPaths) { - super(DEFAULT_STL_NAME, ndkPaths); + super(NAME, ndkPaths); } @Override @@ -44,8 +44,10 @@ public final class StlImpls { public static class LibCppStlImpl extends StlImpl { + public static final String NAME = "libcpp"; + public LibCppStlImpl(NdkPaths ndkPaths) { - super("libcpp", ndkPaths); + super(NAME, ndkPaths); } @Override @@ -58,8 +60,10 @@ public final class StlImpls { public static class StlPortStlImpl extends StlImpl { + public static final String NAME = "stlport"; + public StlPortStlImpl(NdkPaths ndkPaths) { - super("stlport", ndkPaths); + super(NAME, ndkPaths); } @Override |