aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-04-12 18:30:26 +0000
committerGravatar Lukacs Berki <lberki@google.com>2016-04-13 08:09:00 +0000
commitbbf59ed1be85354457ad1d8123cc1973aa3ba298 (patch)
tree35fc9dee2613582b3e980874b34e02d337f4a871 /src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java
parent3231e78fc1f79b72b618627e32c3c5cd6d754444 (diff)
Introduces experimental_objc_library. This rule builds objc code with the c++ rule implementation backend and an OSX crosstool.
-- MOS_MIGRATED_REVID=119660101
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java
new file mode 100644
index 0000000000..4b214acd76
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java
@@ -0,0 +1,83 @@
+// Copyright 2016 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.objc;
+
+import com.google.common.collect.Sets;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
+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.cpp.CcLibraryHelper;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
+import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
+
+import java.util.Collection;
+
+/**
+ * Implementation for experimental_objc_library.
+ */
+public class ExperimentalObjcLibrary implements RuleConfiguredTargetFactory {
+
+ @Override
+ public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException {
+
+ CompilationArtifacts compilationArtifacts =
+ CompilationSupport.compilationArtifacts(ruleContext);
+ CompilationAttributes compilationAttributes = new CompilationAttributes(ruleContext);
+
+ ObjcCommon common = common(ruleContext, compilationAttributes, compilationArtifacts);
+
+ CcToolchainProvider toolchain =
+ ruleContext
+ .getPrerequisite(":cc_toolchain", Mode.TARGET)
+ .getProvider(CcToolchainProvider.class);
+ FeatureConfiguration featureConfiguration = toolchain.getFeatures().getFeatureConfiguration();
+
+ Collection<Artifact> sources = Sets.newHashSet(compilationArtifacts.getSrcs());
+ Collection<Artifact> privateHdrs = Sets.newHashSet(compilationArtifacts.getPrivateHdrs());
+ Collection<Artifact> publicHdrs = Sets.newHashSet(compilationAttributes.hdrs());
+
+ CcLibraryHelper helper =
+ new CcLibraryHelper(ruleContext, ObjcCppSemantics.INSTANCE, featureConfiguration)
+ .addSources(sources)
+ .addSources(privateHdrs)
+ .enableCompileProviders()
+ .addPublicHeaders(publicHdrs)
+ .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET));
+
+ CcLibraryHelper.Info info = helper.build();
+
+ NestedSetBuilder<Artifact> filesToBuild =
+ NestedSetBuilder.<Artifact>stableOrder().addAll(common.getCompiledArchive().asSet());
+
+ return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
+ .addProviders(info.getProviders())
+ .build();
+ }
+
+ private ObjcCommon common(
+ RuleContext ruleContext,
+ CompilationAttributes compilationAttributes,
+ CompilationArtifacts compilationArtifacts) {
+ return new ObjcCommon.Builder(ruleContext)
+ .setCompilationAttributes(compilationAttributes)
+ .setCompilationArtifacts(compilationArtifacts)
+ .addDepObjcProviders(ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
+ .build();
+ }
+}