From 65a82881365b918a2db88d94de5a86f7da1672b0 Mon Sep 17 00:00:00 2001 From: Greg Estren Date: Tue, 17 Nov 2015 22:28:32 +0000 Subject: LipoDataTransition is only meaningful for C++ options. If a rule (such as a filegroup) doesn't have C++ options in its transitive closure, then buildOptions.get(CppOptions.class) returns null and crashes. So add a check to just fast-return for these cases. -- MOS_MIGRATED_REVID=108079561 --- .../google/devtools/build/lib/analysis/config/BuildOptions.java | 7 +++++++ .../build/lib/rules/cpp/transitions/LipoDataTransition.java | 6 ++++++ 2 files changed, 13 insertions(+) (limited to 'src/main') diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java index c79d8b1612..6bba7a3c4c 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java @@ -149,6 +149,13 @@ public final class BuildOptions implements Cloneable, Serializable { return (T) options; } + /** + * Returns true if these options contain the given {@link FragmentOptions}. + */ + public boolean contains(Class optionsClass) { + return fragmentOptionsMap.containsKey(optionsClass); + } + /** * Returns a multimap of all labels that were specified as options, keyed by the name to be * displayed to the user if something goes wrong. This should be the set of all labels diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/LipoDataTransition.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/LipoDataTransition.java index 7fab820017..3556eecb24 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/LipoDataTransition.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/LipoDataTransition.java @@ -37,6 +37,12 @@ public final class LipoDataTransition implements PatchTransition { return options; } + // If this target and its transitive closure don't have C++ options, there's no + // LIPO context to change. + if (!options.contains(CppOptions.class)) { + return options; + } + CppOptions cppOptions = options.get(CppOptions.class); if (cppOptions.lipoMode == CrosstoolConfig.LipoMode.OFF) { return options; -- cgit v1.2.3