diff options
author | 2015-03-20 17:59:21 +0000 | |
---|---|---|
committer | 2015-03-23 11:55:43 +0000 | |
commit | 5386fa1ef6585948b59daa8e7ab9698a844084c7 (patch) | |
tree | ac1af81a2a180c5f6307c9e96f8398d18c7a91b9 /src/main/java/com/google/devtools/build | |
parent | 84ec4bfb479abea111acd2343c2602a44c09b3e5 (diff) |
Remove common java code between objc tools and rules.
As we are releasing the tools somewhat independently of the rules these utility
dependencies make life a lot harder. I'm sad about losing some of the enum
type-safety but being able to treat the code independently is more than worth
it.
--
MOS_MIGRATED_REVID=89137624
Diffstat (limited to 'src/main/java/com/google/devtools/build')
23 files changed, 326 insertions, 28 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java index 1710c96149..2608a9c0ab 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java @@ -33,7 +33,6 @@ import com.google.devtools.build.lib.rules.objc.ObjcActionsBuilder.ExtraLinkInpu import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.LinkedBinary; -import com.google.devtools.build.xcode.common.Platform; /** * Implementation for rules that link binaries. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java index 047a102a53..db2ad424ff 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java @@ -26,7 +26,6 @@ import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos; import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos.Control; import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos.MergeZip; import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos.VariableSubstitution; -import com.google.devtools.build.xcode.common.TargetDeviceFamily; import java.io.InputStream; import java.util.Map; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java index f48ad0e024..4e20ddc6ee 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java @@ -21,7 +21,6 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.objc.ObjcActionsBuilder.ExtraActoolArgs; import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder; -import com.google.devtools.build.xcode.common.TargetDeviceFamily; import java.util.Set; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java index c95f2e5702..ab6d89874f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.xcode.bundlemerge.proto.BundleMergeProtos.BundleFile; -import com.google.devtools.build.xcode.util.Value; /** * Represents a file which is processed to another file and bundled. It contains the diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/InfoplistMerging.java b/src/main/java/com/google/devtools/build/lib/rules/objc/InfoplistMerging.java index 58369ada51..017e15fbe9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/InfoplistMerging.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/InfoplistMerging.java @@ -25,7 +25,6 @@ import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; -import com.google.devtools.build.xcode.util.Interspersing; /** * Supplies information regarding Infoplist merging for a particular binary. This includes: diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Interspersing.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Interspersing.java new file mode 100644 index 0000000000..23813dd4e5 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Interspersing.java @@ -0,0 +1,71 @@ +// Copyright 2014 Google Inc. 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.objc; + +import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; + +/** + * Utility code for interspersing items into sequences. + */ +public class Interspersing { + private Interspersing() {} + + /** + * Inserts {@code what} before each item in {@code sequence}, returning a lazy sequence of twice + * the length. + */ + public static <E> Iterable<E> beforeEach(final E what, Iterable<E> sequence) { + Preconditions.checkNotNull(what); + return Iterables.concat( + Iterables.transform( + sequence, + new Function<E, Iterable<E>>() { + @Override + public Iterable<E> apply(E element) { + return ImmutableList.of(what, element); + } + } + )); + } + + /** + * Prepends {@code what} to each string in {@code sequence}, returning a lazy sequence of the + * same length. + */ + public static Iterable<String> + prependEach(final String what, Iterable<String> sequence) { + Preconditions.checkNotNull(what); + return Iterables.transform( + sequence, + new Function<String, String>() { + @Override + public String apply(String input) { + return what + input; + } + }); + } + + /** + * Similar to {@link #prependEach(String, Iterable)}, but also converts each item in the sequence + * to a string. + */ + public static <E> Iterable<String> + prependEach(String what, Iterable<E> sequence, Function<? super E, String> toString) { + return prependEach(what, Iterables.transform(sequence, toString)); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java index 72a4046437..f703c4e094 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java @@ -20,7 +20,6 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.xcode.common.Platform; /** * Implementation for {@code ios_application}. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java index 0a9fb7b6a6..e694710cb2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosSdkCommands.java @@ -23,8 +23,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.xcode.common.Platform; -import com.google.devtools.build.xcode.util.Interspersing; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting; import java.util.List; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java index ecd2d84837..ec7fc86f33 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java @@ -52,8 +52,6 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.util.LazyString; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.xcode.common.TargetDeviceFamily; -import com.google.devtools.build.xcode.util.Interspersing; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos; import java.io.InputStream; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java index e25e274674..1d44401f3b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java @@ -26,7 +26,6 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; -import com.google.devtools.build.xcode.common.TargetDeviceFamily; /** * Implementation for {@code objc_bundle_library}. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java index 8937340c7c..b75199d286 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java @@ -14,8 +14,6 @@ package com.google.devtools.build.lib.rules.objc; -import static com.google.devtools.build.xcode.common.BuildOptionsUtil.DEFAULT_OPTIONS_NAME; - import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; @@ -64,7 +62,7 @@ public class public String iosCpu; @Option(name = "xcode_options", - defaultValue = DEFAULT_OPTIONS_NAME, + defaultValue = "Debug", category = "undocumented", help = "Specifies the name of the build settings to use.") // TODO(danielwh): Do literally anything with this flag. Ideally, pass it to xcodegen via a diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index 915fc80f14..65ddb991a6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -61,7 +61,6 @@ import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.cpp.CcCommon; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.xcode.util.Interspersing; import java.util.HashSet; import java.util.List; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java index 519cf48612..61b81d3de4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.syntax.Label; -import com.google.devtools.build.xcode.common.Platform; import java.util.List; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java index 6737f7b00c..011e99a203 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.analysis.config.InvalidConfigurationExcepti import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.syntax.Label; -import com.google.devtools.build.xcode.common.Platform; /** * A loader that creates ObjcConfiguration instances based on Objective-C configurations and diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index 1fb5fbcf6f..5167696e30 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -48,8 +48,6 @@ import com.google.devtools.build.lib.syntax.Label; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.FileTypeSet; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.xcode.common.Platform; -import com.google.devtools.build.xcode.common.TargetDeviceFamily; /** * Shared rule classes and associated utility code for Objective-C rules. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/OptionsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/OptionsProvider.java index f87c96a66e..84a2ee547a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/OptionsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/OptionsProvider.java @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.xcode.util.Value; /** * Provides information contained in a {@code objc_options} target. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Platform.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Platform.java new file mode 100644 index 0000000000..2fbe1b74fa --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Platform.java @@ -0,0 +1,58 @@ +// Copyright 2014 Google Inc. 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.objc; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; + +import java.util.Locale; +import java.util.Set; + +/** + * An enum that can be used to distinguish between an iOS simulator and device. + */ +public enum Platform { + DEVICE("iPhoneOS"), SIMULATOR("iPhoneSimulator"); + + private static final Set<String> SIMULATOR_ARCHS = ImmutableSet.of("i386", "x86_64"); + + private final String nameInPlist; + + Platform(String nameInPlist) { + this.nameInPlist = Preconditions.checkNotNull(nameInPlist); + } + + /** + * Returns the name of the "platform" as it appears in the CFBundleSupportedPlatforms plist + * setting. + */ + public String getNameInPlist() { + return nameInPlist; + } + + /** + * Returns the name of the "platform" as it appears in the plist when it appears in all-lowercase. + */ + public String getLowerCaseNameInPlist() { + return nameInPlist.toLowerCase(Locale.US); + } + + /** + * Returns the platform for the arch. + */ + public static Platform forArch(String arch) { + return SIMULATOR_ARCHS.contains(arch) ? SIMULATOR : DEVICE; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java index 61aad49623..76a44ba317 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.rules.objc; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; -import static com.google.devtools.build.xcode.common.TargetDeviceFamily.UI_DEVICE_FAMILY_VALUES; +import static com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.UI_DEVICE_FAMILY_VALUES; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; @@ -41,12 +41,10 @@ import com.google.devtools.build.lib.packages.Attribute.SplitTransition; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.objc.ObjcActionsBuilder.ExtraActoolArgs; +import com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.InvalidFamilyNameException; +import com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.RepeatedFamilyNameException; import com.google.devtools.build.lib.shell.ShellUtils; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.xcode.common.InvalidFamilyNameException; -import com.google.devtools.build.xcode.common.Platform; -import com.google.devtools.build.xcode.common.RepeatedFamilyNameException; -import com.google.devtools.build.xcode.common.TargetDeviceFamily; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting; import java.util.List; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/SdkFramework.java b/src/main/java/com/google/devtools/build/lib/rules/objc/SdkFramework.java index c692fcd402..f6aa10757d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/SdkFramework.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/SdkFramework.java @@ -15,7 +15,6 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.xcode.util.Value; /** * Represents the name of an SDK framework. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/TargetDeviceFamily.java b/src/main/java/com/google/devtools/build/lib/rules/objc/TargetDeviceFamily.java new file mode 100644 index 0000000000..2233f965a3 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/TargetDeviceFamily.java @@ -0,0 +1,123 @@ +// Copyright 2014 Google Inc. 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.objc; + +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +import java.util.EnumSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Possible values in the {@code TARGETED_DEVICE_FAMILY} build setting. + */ +public enum TargetDeviceFamily { + IPAD, IPHONE; + + /** + * An exception that indicates the name of a device family was not recognized or is somehow + * invalid. + */ + public static class InvalidFamilyNameException extends IllegalArgumentException { + public InvalidFamilyNameException(String message) { + super(message); + } + } + + /** + * An exception that indicates a family name appeared twice in a sequence when only one is + * expected. + */ + public static class RepeatedFamilyNameException extends IllegalArgumentException { + public RepeatedFamilyNameException(String message) { + super(message); + } + } + + /** + * Contains the values of the UIDeviceFamily plist info setting for each valid set of + * TargetDeviceFamilies. + */ + public static final Map<Set<TargetDeviceFamily>, List<Integer>> UI_DEVICE_FAMILY_VALUES = + ImmutableMap.<Set<TargetDeviceFamily>, List<Integer>>builder() + .put(ImmutableSet.of(TargetDeviceFamily.IPHONE), ImmutableList.of(1)) + .put(ImmutableSet.of(TargetDeviceFamily.IPAD), ImmutableList.of(2)) + .put(ImmutableSet.of(TargetDeviceFamily.IPHONE, TargetDeviceFamily.IPAD), + ImmutableList.of(1, 2)) + .build(); + + /** + * Returns the name of the family as it appears in build rules. + */ + public String getNameInRule() { + return BY_NAME_IN_RULE.get(this); + } + + private static final ImmutableBiMap<TargetDeviceFamily, String> BY_NAME_IN_RULE = + ImmutableBiMap.of(IPAD, "ipad", IPHONE, "iphone"); + + /** + * Converts a sequence containing the strings returned by {@link #getNameInRule()} to a set of + * instances of this enum. + * + * <p>If there are multiple items in the returned set, they are in enumeration order. + * + * @param names the names of the families + * @throws InvalidFamilyNameException if some family name in the sequence was not recognized + * @throws RepeatedFamilyNameException if some family name appeared in the sequence twice + */ + public static Set<TargetDeviceFamily> fromNamesInRule(Iterable<String> names) { + Set<TargetDeviceFamily> families = EnumSet.noneOf(TargetDeviceFamily.class); + for (String name : names) { + TargetDeviceFamily family = BY_NAME_IN_RULE.inverse().get(name); + if (family == null) { + throw new InvalidFamilyNameException(name); + } + if (!families.add(family)) { + throw new RepeatedFamilyNameException(name); + } + } + return families; + } + + /** + * Converts the {@code TARGETED_DEVICE_FAMILY} setting in build settings to a set of + * {@code TargetedDevice}s. + */ + public static Set<TargetDeviceFamily> fromBuildSetting(String targetedDevice) { + ImmutableSet.Builder<TargetDeviceFamily> result = ImmutableSet.builder(); + for (String numericSetting : Splitter.on(",").split(targetedDevice)) { + numericSetting = numericSetting.trim(); + switch (numericSetting) { + case "1": + result.add(IPHONE); + break; + case "2": + result.add(IPAD); + break; + default: + throw new IllegalArgumentException( + "Expect comma-separated list containing only '1' and/or '2' for " + + "TARGETED_DEVICE_FAMILY: " + targetedDevice); + } + } + return result.build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Value.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Value.java new file mode 100644 index 0000000000..6974d6badd --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Value.java @@ -0,0 +1,70 @@ +// Copyright 2014 Google Inc. 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.objc; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +/** + * Represents a type whose equality, hash code, and string representation are defined by a single + * immutable array. This class is designed to be extended by a final class, and to pass the member + * data to this class's constructor. + * + * @param <V> the base class that extends {@code Value} + */ +// TODO(bazel-team): Replace with AutoValue once that is supported in bazel. +public class Value<V extends Value<V>> { + private final Object memberData; + + /** + * Constructs a new instance with the given member data. Generally, all member data should be + * reflected in final fields in the child class. + * @throws NullPointerException if any element in {@code memberData} is null + */ + public Value(Object... memberData) { + Preconditions.checkArgument(memberData.length > 0); + this.memberData = (memberData.length == 1) + ? Preconditions.checkNotNull(memberData[0]) : ImmutableList.copyOf(memberData); + } + + /** + * A type-safe alternative to calling {@code a.equals(b)}. When using {@code a.equals(b)}, + * {@code b} may accidentally be a different class from {@code a}, in which case there will be no + * compiler warning and the result will always be false. This method requires both values to have + * compatible types and to be non-null. + */ + public boolean equalsOther(V other) { + return equals(Preconditions.checkNotNull(other)); + } + + @Override + public boolean equals(Object o) { + if ((o == null) || (o.getClass() != getClass())) { + return false; + } + Value<?> other = (Value<?>) o; + return memberData.equals(other.memberData); + } + + @Override + public int hashCode() { + return memberData.hashCode(); + } + + @Override + public String toString() { + return getClass().getSimpleName() + ":" + memberData.toString(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java index 5b29435d36..ef2c1fa5a5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java @@ -21,7 +21,6 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.xcode.util.Value; /** * Represents an .xcdatamodel[d] directory - knowing all {@code Artifact}s contained therein - and diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java index 5597eefe83..5bdaf865b2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java @@ -43,7 +43,6 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.objc.ObjcProvider.Flag; import com.google.devtools.build.lib.syntax.Label; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.xcode.util.Interspersing; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.DependencyControl; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.TargetControl; import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting; |