Allow objc_{library,binary} to depend on cc_library.
This is an early version of support for this feature, likely still missing
a number of edge cases. However the basic functionality should work.
To allow a dependency from objc to cc, the following flags will have to be
passed to bazel:
--experimental_enable_objc_cc_deps --experimental_disable_java --cpu=ios_i386 --crosstool_top=//tools/objc/crosstool:crosstool
The feature is also compatible with --ios_multi_cpus, with the familiar
values for --ios_cpu (i386, x86_64, armv7, arm64). However, using this
crosstool and any CPU defined in it (legal values are ios_i386, ios_x86_64,
ios_armv7, ios_arm64) will make it impossible to use genrules with java make
variables in the same build: Obviously they require java support and no that
is not available for iOS CPUs.
The new flag --experimental_disable_java has not been tested in any
circumstances but the one enabled by this CL so use it with caution.
This CL does not contain any Xcode support for CC dependencies yet, they
will just not show up in the generated Xcode project.
--
MOS_MIGRATED_REVID=94116942
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
index eef56df..4720ad2 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
@@ -25,6 +25,8 @@
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses.JavaRule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
+import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
+import com.google.devtools.build.lib.rules.java.JavaConfiguration;
/**
* Common attributes for Java rules.
@@ -34,6 +36,7 @@
public RuleClass build(Builder builder, final RuleDefinitionEnvironment env) {
return builder
+ .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class)
/* <!-- #BLAZE_RULE(java_library).IMPLICIT_OUTPUTS -->
<ul>
<li><code>lib<var>name</var>.jar</code>: A Java archive containing the class files.</li>
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
index eac26d8..f0b4140 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
@@ -37,7 +37,9 @@
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
import com.google.devtools.build.lib.packages.RuleClass.PackageNameConstraint;
import com.google.devtools.build.lib.packages.TriState;
+import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.Jvm;
import com.google.devtools.build.lib.util.FileTypeSet;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -65,6 +67,9 @@
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
return builder
+ // Fail analysis if --disable_java is enabled.
+ .failIfMissingConfigurationFragment()
+ .requiresConfigurationFragments(JavaConfiguration.class, Jvm.class)
.add(attr("$ijar", LABEL).cfg(HOST).exec().value(env.getLabel("//tools/defaults:ijar")))
.setPreferredDependencyPredicate(JavaSemantics.JAVA_SOURCE)
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java
index 3d83a92..0edf18b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.java;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.RedirectChaser;
@@ -47,6 +48,10 @@
throws InvalidConfigurationException {
JavaOptions javaOptions = buildOptions.get(JavaOptions.class);
+ if (javaOptions.disableJava) {
+ return null;
+ }
+
Label javaToolchain = RedirectChaser.followRedirects(env, javaOptions.javaToolchain,
"java_toolchain");
return create(javaOptions, javaToolchain, cpuSupplier.getJavaCpu(buildOptions, env));
@@ -56,9 +61,10 @@
public Class<? extends Fragment> creates() {
return JavaConfiguration.class;
}
-
+
+ @VisibleForTesting
public JavaConfiguration create(JavaOptions javaOptions, Label javaToolchain, String javaCpu)
- throws InvalidConfigurationException {
+ throws InvalidConfigurationException {
boolean generateJavaDeps = javaOptions.javaDeps ||
javaOptions.experimentalJavaClasspath != JavaClasspathMode.OFF;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
index 5cbfe13..286ccce 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
@@ -27,6 +27,7 @@
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
+import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
/**
* A base rule for building the java_import rule.
@@ -36,6 +37,7 @@
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
return builder
+ .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class)
.add(attr(":host_jdk", LABEL)
.cfg(HOST)
.value(JavaSemantics.HOST_JDK))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
index d35c0ef..f94eaf5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
@@ -288,6 +288,12 @@
help = "Check the listed constraint.")
public List<String> checkedConstraints;
+ @Option(name = "experimental_disable_java",
+ defaultValue = "false",
+ category = "undocumented",
+ help = "Disables java support entirely.")
+ public boolean disableJava;
+
@Override
public FragmentOptions getHost(boolean fallback) {
JavaOptions host = (JavaOptions) getDefault();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
index a68dcd4..1b035e0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
@@ -82,6 +82,9 @@
new LateBoundLabel<BuildConfiguration>(JAVA_TOOLCHAIN_LABEL) {
@Override
public Label getDefault(Rule rule, BuildConfiguration configuration) {
+ if (!configuration.hasFragment(JavaConfiguration.class)) {
+ return null;
+ }
return configuration.getFragment(JavaConfiguration.class).getToolchainLabel();
}
};
@@ -132,6 +135,9 @@
new LateBoundLabel<BuildConfiguration>(JDK_LABEL) {
@Override
public Label getDefault(Rule rule, BuildConfiguration configuration) {
+ if (!configuration.hasFragment(Jvm.class)) {
+ return null;
+ }
return configuration.getFragment(Jvm.class).getJvmLabel();
}
};
@@ -148,6 +154,9 @@
@Override
public Label getDefault(Rule rule, BuildConfiguration configuration) {
+ if (!configuration.hasFragment(Jvm.class)) {
+ return null;
+ }
return configuration.getFragment(Jvm.class).getJvmLabel();
}
};
@@ -160,6 +169,9 @@
new LateBoundLabel<BuildConfiguration>() {
@Override
public Label getDefault(Rule rule, BuildConfiguration configuration) {
+ if (!configuration.hasFragment(JavaConfiguration.class)) {
+ return null;
+ }
return configuration.getFragment(JavaConfiguration.class).getJavaLauncherLabel();
}
};
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
index 4a45461..837ffb4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
@@ -45,6 +45,7 @@
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
return builder.setUndocumented()
+ .requiresConfigurationFragments(JavaConfiguration.class)
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(source_version) -->
The Java source version (e.g., '6' or '7'). It specifies which set of code structures
are allowed in the Java source code.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
index a19461a..3cf01b2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
@@ -66,6 +66,11 @@
public Jvm create(ConfigurationEnvironment env, BuildOptions buildOptions)
throws InvalidConfigurationException {
JavaOptions javaOptions = buildOptions.get(JavaOptions.class);
+
+ if (javaOptions.disableJava) {
+ return null;
+ }
+
String javaHome = javaOptions.javaBase;
String cpu = cpuSupplier.getJavaCpu(buildOptions, env);
if (cpu == null) {
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 9d165b5..b59bbe3 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
@@ -29,6 +29,8 @@
import com.google.devtools.build.lib.analysis.RunfilesSupport;
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.CcLinkParamsProvider;
+import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -169,6 +171,10 @@
.setCompilationArtifacts(compilationArtifacts)
.addDefines(ruleContext.getTokenizedStringListAttr("defines"))
.addDepObjcProviders(ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
+ .addDepCcHeaderProviders(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
+ .addDepCcLinkProviders(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, CcLinkParamsProvider.class))
.addDepObjcProviders(
ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
.addNonPropagatedDepObjcProviders(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 2c8220b..803090b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -49,6 +49,7 @@
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder;
import com.google.devtools.build.lib.shell.ShellUtils;
@@ -78,6 +79,8 @@
static final ImmutableList<String> CLANG_COVERAGE_FLAGS =
ImmutableList.of("-fprofile-arcs", "-ftest-coverage", "-fprofile-dir=./coverage_output");
+ private static final String FRAMEWORK_SUFFIX = ".framework";
+
/**
* Iterable wrapper providing strong type safety for arguments to binary linking.
*/
@@ -282,27 +285,37 @@
Artifact linkedBinary =
ObjcRuleClasses.intermediateArtifacts(ruleContext).singleArchitectureBinary();
+ ImmutableList<Artifact> ccLibraries = ccLibraries(objcProvider);
ruleContext.registerAction(
ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("ObjcLink")
.setShellCommand(ImmutableList.of("/bin/bash", "-c"))
- .setCommandLine(linkCommandLine(extraLinkArgs, objcProvider, linkedBinary, dsymBundle))
+ .setCommandLine(
+ linkCommandLine(extraLinkArgs, objcProvider, linkedBinary, dsymBundle, ccLibraries))
.addOutput(linkedBinary)
.addOutputs(dsymBundle.asSet())
.addTransitiveInputs(objcProvider.get(LIBRARY))
.addTransitiveInputs(objcProvider.get(IMPORTED_LIBRARY))
.addTransitiveInputs(objcProvider.get(FRAMEWORK_FILE))
+ .addInputs(ccLibraries)
.addInputs(extraLinkInputs)
.build(ruleContext));
}
- private static final String FRAMEWORK_SUFFIX = ".framework";
+ private ImmutableList<Artifact> ccLibraries(ObjcProvider objcProvider) {
+ ImmutableList.Builder<Artifact> ccLibraryBuilder = ImmutableList.builder();
+ for (LinkerInputs.LibraryToLink libraryToLink : objcProvider.get(ObjcProvider.CC_LIBRARY)) {
+ ccLibraryBuilder.add(libraryToLink.getArtifact());
+ }
+ return ccLibraryBuilder.build();
+ }
private CommandLine linkCommandLine(ExtraLinkArgs extraLinkArgs,
- ObjcProvider objcProvider, Artifact linkedBinary, Optional<Artifact> dsymBundle) {
+ ObjcProvider objcProvider, Artifact linkedBinary, Optional<Artifact> dsymBundle,
+ ImmutableList<Artifact> ccLibraries) {
ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
- final CustomCommandLine.Builder commandLine = CustomCommandLine.builder();
+ CustomCommandLine.Builder commandLine = CustomCommandLine.builder();
if (objcProvider.is(USES_CPP)) {
commandLine
@@ -322,6 +335,7 @@
.addExecPath("-o", linkedBinary)
.addExecPaths(objcProvider.get(LIBRARY))
.addExecPaths(objcProvider.get(IMPORTED_LIBRARY))
+ .addExecPaths(ccLibraries)
.add(dylibPaths(objcProvider))
.addBeforeEach("-force_load", Artifact.toExecPaths(objcProvider.get(FORCE_LOAD_LIBRARY)))
.add(extraLinkArgs)
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 9d9d173..6fa5ff9 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
@@ -129,6 +129,16 @@
help = "Whether to add include path entries for every individual proto file.")
public boolean perProtoIncludes;
+ @Option(name = "experimental_enable_objc_cc_deps",
+ defaultValue = "false",
+ category = "undocumented",
+ help = "Allows objc_* rules to depend on cc_library and causes any objc dependencies to be "
+ + "built with --cpu set to \"ios_<--ios_cpu>\" for any values in --ios_multi_cpu. For "
+ + "most values of ios_cpu this means that this option requires the use of "
+ + "--experimental_disable_java as java does not support these new --cpu values. Note "
+ + "that this may affect genrules if they depend on java make variables.")
+ public boolean enableCcDeps;
+
// This option exists because two configurations are not allowed to have the same cache key
// (partially derived from options). Since we have multiple transitions (see
// getPotentialSplitTransitions below) that may result in the same configuration values at runtime
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 e3ed076..e311bc3 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
@@ -18,6 +18,7 @@
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.BREAKPAD_FILE;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.BUNDLE_FILE;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.BUNDLE_IMPORT_DIR;
+import static com.google.devtools.build.lib.rules.objc.ObjcProvider.CC_LIBRARY;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DEFINE;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FLAG;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FORCE_LOAD_FOR_XCODEGEN;
@@ -57,6 +58,8 @@
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.packages.Type;
import com.google.devtools.build.lib.rules.cpp.CcCommon;
+import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
+import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.RegexFilter;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -237,6 +240,8 @@
private Iterable<Artifact> extraImportLibraries = ImmutableList.of();
private Optional<Artifact> linkedBinary = Optional.absent();
private Optional<Artifact> breakpadFile = Optional.absent();
+ private Iterable<CppCompilationContext> depCcHeaderProviders = ImmutableList.of();
+ private Iterable<CcLinkParamsProvider> depCcLinkProviders = ImmutableList.of();
Builder(RuleContext context) {
this.context = Preconditions.checkNotNull(context);
@@ -354,6 +359,22 @@
return this;
}
+ /**
+ * Sets information from {@code cc_library} dependencies to be used during compilation.
+ */
+ public Builder addDepCcHeaderProviders(Iterable<CppCompilationContext> depCcHeaderProviders) {
+ this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, depCcHeaderProviders);
+ return this;
+ }
+
+ /**
+ * Sets information from {@code cc_library} dependencies to be used during linking.
+ */
+ public Builder addDepCcLinkProviders(Iterable<CcLinkParamsProvider> depCcLinkProviders) {
+ this.depCcLinkProviders = Iterables.concat(this.depCcLinkProviders, depCcLinkProviders);
+ return this;
+ }
+
ObjcCommon build() {
Iterable<BundleableFile> bundleImports = BundleableFile.bundleImportsFromRule(context);
@@ -373,6 +394,15 @@
.addTransitiveAndPropagate(depObjcProviders)
.addTransitiveWithoutPropagating(directDepObjcProviders);
+ for (CppCompilationContext headerProvider : depCcHeaderProviders) {
+ // TODO(bazel-team): Also account for custom include settings to go into header search paths
+ objcProvider.addTransitiveAndPropagate(HEADER, headerProvider.getDeclaredIncludeSrcs());
+ }
+ for (CcLinkParamsProvider linkProvider : depCcLinkProviders) {
+ objcProvider.addTransitiveAndPropagate(
+ CC_LIBRARY, linkProvider.getCcLinkParams(true, false).getLibraries());
+ }
+
if (compilationAttributes.isPresent()) {
CompilationAttributes attributes = compilationAttributes.get();
ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(context);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 38c0719..522a35b7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -24,6 +24,8 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.Type;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
+import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -68,6 +70,10 @@
ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
.addNonPropagatedDepObjcProviders(ruleContext.getPrerequisites("non_propagated_deps",
Mode.TARGET, ObjcProvider.class))
+ .addDepCcHeaderProviders(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
+ .addDepCcLinkProviders(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, CcLinkParamsProvider.class))
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
.setAlwayslink(alwayslink)
.addExtraImportLibraries(extraImportLibraries)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index ce344cf..e2fc6e9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -27,6 +27,7 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.TargetControl;
@@ -159,7 +160,7 @@
public static final Key<Bundling> NESTED_BUNDLE = new Key<>(STABLE_ORDER);
/**
- * Artifact containing information on debug symbols
+ * Artifact containing information on debug symbols.
*/
public static final Key<Artifact> DEBUG_SYMBOLS = new Key<>(STABLE_ORDER);
@@ -185,6 +186,11 @@
public static final Key<Artifact> STRINGS = new Key<>(STABLE_ORDER);
/**
+ * Linking information from cc dependencies.
+ */
+ public static final Key<LinkerInputs.LibraryToLink> CC_LIBRARY = new Key<>(LINK_ORDER);
+
+ /**
* Flags that apply to a transitive build dependency tree. Each item in the enum corresponds to a
* flag. If the item is included in the key {@link #FLAG}, then the flag is considered set.
*/
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 4844892..9e5b824 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
@@ -606,7 +606,8 @@
"objc_import",
"objc_framework",
"objc_proto_library",
- "j2objc_library");
+ "j2objc_library",
+ "cc_library");
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
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 289b3b9..0f9869a 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
@@ -37,6 +37,7 @@
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -223,29 +224,30 @@
.add("-c")
.add(
"VERSION=\"$("
- + "grep \"^" + BuildInfo.BUILD_EMBED_LABEL + "\" " + buildInfo.getExecPathString()
- + " | cut -d' ' -f2- | sed -e 's#\"#\\\"#g')\" && "
- + "cat >" + getGeneratedVersionPlist().getExecPathString() + " <<EOF\n"
- + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- + "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
- + "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
- + "<plist version=\"1.0\">\n"
- + "<dict>\n"
- + "EOF\n"
+ + "grep \"^" + BuildInfo.BUILD_EMBED_LABEL + "\" " + buildInfo
+ .getExecPathString()
+ + " | cut -d' ' -f2- | sed -e 's#\"#\\\"#g')\" && "
+ + "cat >" + getGeneratedVersionPlist().getExecPathString() + " <<EOF\n"
+ + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ + "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
+ + "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+ + "<plist version=\"1.0\">\n"
+ + "<dict>\n"
+ + "EOF\n"
- + "if [[ -n \"${VERSION}\" ]]; then\n"
- + " for KEY in CFBundleVersion CFBundleShortVersionString; do\n"
- + " echo \" <key>${KEY}</key>\n\" >> "
- + getGeneratedVersionPlist().getExecPathString() + "\n"
- + " echo \" <string>${VERSION}</string>\n\" >> "
- + getGeneratedVersionPlist().getExecPathString() + "\n"
- + " done\n"
- + "fi\n"
+ + "if [[ -n \"${VERSION}\" ]]; then\n"
+ + " for KEY in CFBundleVersion CFBundleShortVersionString; do\n"
+ + " echo \" <key>${KEY}</key>\n\" >> "
+ + getGeneratedVersionPlist().getExecPathString() + "\n"
+ + " echo \" <string>${VERSION}</string>\n\" >> "
+ + getGeneratedVersionPlist().getExecPathString() + "\n"
+ + " done\n"
+ + "fi\n"
- + "cat >>" + getGeneratedVersionPlist().getExecPathString() + " <<EOF\n"
- + "</dict>\n"
- + "</plist>\n"
- + "EOF\n"
+ + "cat >>" + getGeneratedVersionPlist().getExecPathString() + " <<EOF\n"
+ + "</dict>\n"
+ + "</plist>\n"
+ + "EOF\n"
)
.build())
.addInput(buildInfo)
@@ -818,6 +820,9 @@
private void setArchitectureOptions(BuildOptions splitOptions, String iosCpu) {
splitOptions.get(ObjcCommandLineOptions.class).iosSplitCpu = iosCpu;
splitOptions.get(ObjcCommandLineOptions.class).iosCpu = iosCpu;
+ if (splitOptions.get(ObjcCommandLineOptions.class).enableCcDeps) {
+ splitOptions.get(BuildConfiguration.Options.class).cpu = "ios_" + iosCpu;
+ }
}
@Override