aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2017-09-18 20:16:10 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-09-19 09:32:19 +0200
commit63caed61251cb3922efddc9985a44e13282f3f7d (patch)
tree05aa185829c5c43813162c375e18130bca70e842 /src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
parent0ee3aa622fc13b8a5072ebddf5cd65823413b4ff (diff)
Move some more tests from the legacy case to the crosstool case.
PiperOrigin-RevId: 169116918
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java')
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java307
1 files changed, 305 insertions, 2 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
index e80930840d..4e426c3d5e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
@@ -25,14 +25,17 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.CC_LIBRARY;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.SDK_DYLIB;
+import static com.google.devtools.build.lib.rules.objc.ObjcProvider.SDK_FRAMEWORK;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.WEAK_SDK_FRAMEWORK;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.XCASSETS_DIR;
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.NON_ARC_SRCS_TYPE;
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SRCS_TYPE;
import static org.junit.Assert.fail;
+import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.ActionExecutionException;
@@ -42,20 +45,24 @@ import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.analysis.util.ScratchAttributeWriter;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.util.MockObjcSupport;
import com.google.devtools.build.lib.rules.apple.ApplePlatform;
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
import com.google.devtools.build.lib.rules.cpp.CppCompileAction;
import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction;
+import com.google.devtools.build.lib.rules.cpp.LinkerInput;
import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions.ObjcCrosstoolMode;
import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.common.options.OptionsParsingException;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -394,6 +401,12 @@ public class ObjcLibraryTest extends ObjcRuleTestCase {
.containsAllOf("objc2/a.h", "objc3/b.h", "objc4/c.h", "objc4/a.m", "objc4/private.h");
}
+ static Iterable<String> iquoteArgs(ObjcProvider provider, BuildConfiguration configuration) {
+ return Interspersing.beforeEach(
+ "-iquote",
+ PathFragment.safePathStrings(ObjcCommon.userHeaderSearchPaths(provider, configuration)));
+ }
+
@Test
public void testCompilationActions_simulator() throws Exception {
useConfiguration(
@@ -686,6 +699,32 @@ public class ObjcLibraryTest extends ObjcRuleTestCase {
}
@Test
+ public void testCompilationActionsWithCoptFmodules() throws Exception {
+ createLibraryTargetWriter("//objc:lib")
+ .setAndCreateFiles("srcs", "a.m", "b.m", "private.h")
+ .setAndCreateFiles("hdrs", "c.h")
+ .setList("copts", "-fmodules")
+ .write();
+ CommandAction compileActionA = compileAction("//objc:lib", "a.o");
+ assertThat(compileActionA.getArguments()).containsAllOf("-fmodules",
+ "-fmodules-cache-path=" + getModulesCachePath());
+ }
+
+ @Test
+ public void testCompilationActionsWithCoptFmodulesCachePath() throws Exception {
+ checkWarning("objc", "lib", CompilationSupport.MODULES_CACHE_PATH_WARNING,
+ "objc_library(",
+ " name = 'lib',",
+ " srcs = ['a.m'],",
+ " copts = ['-fmodules', '-fmodules-cache-path=foobar']",
+ ")");
+
+ CommandAction compileActionA = compileAction("//objc:lib", "a.o");
+ assertThat(compileActionA.getArguments()).containsAllOf("-fmodules",
+ "-fmodules-cache-path=" + getModulesCachePath());
+ }
+
+ @Test
public void testArchiveAction_simulator() throws Exception {
useConfiguration(
"--cpu=ios_i386",
@@ -1290,8 +1329,272 @@ public class ObjcLibraryTest extends ObjcRuleTestCase {
}
@Test
- public void testSdkIncludesUsedInCompileActionsOfDependers() throws Exception {
- checkSdkIncludesUsedInCompileActionsOfDependers(RULE_TYPE);
+ public void testCompilationActionsWithPch() throws Exception {
+ ApplePlatform platform = ApplePlatform.IOS_SIMULATOR;
+ scratch.file("objc/foo.pch");
+ createLibraryTargetWriter("//objc:lib")
+ .setAndCreateFiles("srcs", "a.m", "b.m", "private.h")
+ .setAndCreateFiles("hdrs", "c.h")
+ .set("pch", "'some.pch'")
+ .write();
+
+ CommandAction compileActionA = compileAction("//objc:lib", "a.o");
+
+ assertThat(compileActionA.getArguments())
+ .containsAllIn(
+ new ImmutableList.Builder<String>()
+ .addAll(AppleToolchain.DEFAULT_WARNINGS.values())
+ .add("-fexceptions")
+ .add("-fasm-blocks")
+ .add("-fobjc-abi-version=2")
+ .add("-fobjc-legacy-dispatch")
+ .addAll(CompilationSupport.DEFAULT_COMPILER_FLAGS)
+ .add("-mios-simulator-version-min=" + DEFAULT_IOS_SDK_VERSION)
+ .add("-arch x86_64")
+ .add("-isysroot", AppleToolchain.sdkDir())
+ .add("-F" + AppleToolchain.sdkDir() + "/Developer/Library/Frameworks")
+ .add("-F" + frameworkDir(platform))
+ .addAll(FASTBUILD_COPTS)
+ .addAll(
+ iquoteArgs(
+ getConfiguredTarget("//objc:lib").get(ObjcProvider.SKYLARK_CONSTRUCTOR),
+ getAppleCrosstoolConfiguration()))
+ .add("-include", "objc/some.pch")
+ .add("-fobjc-arc")
+ .add("-c", "objc/a.m")
+ .addAll(outputArgs(compileActionA.getOutputs()))
+ .build());
+
+ assertThat(compileActionA.getPossibleInputsForTesting()).contains(
+ getFileConfiguredTarget("//objc:some.pch").getArtifact());
+ }
+
+ // Converts output artifacts into expected command-line arguments.
+ protected List<String> outputArgs(Set<Artifact> outputs) {
+ ImmutableList.Builder<String> result = new ImmutableList.Builder<>();
+ for (String output : Artifact.toExecPaths(outputs)) {
+ if (output.endsWith(".o")) {
+ result.add("-o", output);
+ } else if (output.endsWith(".d")) {
+ result.add("-MD", "-MF", output);
+ } else {
+ throw new IllegalArgumentException(
+ "output " + output + " has unknown ending (not in (.d, .o)");
+ }
+ }
+ return result.build();
+ }
+
+ @Test
+ public void checkStoresCcLibsAsCc() throws Exception {
+ ScratchAttributeWriter.fromLabelString(this, "cc_library", "//cc:lib")
+ .setAndCreateFiles("srcs", "a.cc")
+ .write();
+ scratch.file(
+ "third_party/cc_lib/BUILD",
+ "licenses(['unencumbered'])",
+ "cc_library(",
+ " name = 'cc_lib_impl',",
+ " srcs = [",
+ " 'v1/a.c',",
+ " 'v1/a.h',",
+ " ],",
+ ")",
+ "",
+ "cc_inc_library(",
+ " name = 'cc_lib',",
+ " hdrs = ['v1/a.h'],",
+ " prefix = 'v1',",
+ " deps = [':cc_lib_impl'],",
+ ")");
+ createLibraryTargetWriter("//objc2:lib")
+ .setAndCreateFiles("srcs", "a.m", "b.m")
+ .setAndCreateFiles("hdrs", "c.h", "d.h")
+ .setList("deps", "//cc:lib", "//third_party/cc_lib:cc_lib_impl")
+ .write();
+ ObjcProvider objcProvider = providerForTarget("//objc2:lib");
+
+ Iterable<Artifact> linkerInputArtifacts =
+ Iterables.transform(objcProvider.get(CC_LIBRARY), new Function<LinkerInput, Artifact>() {
+ @Override
+ public Artifact apply(LinkerInput library) {
+ return library.getArtifact();
+ }
+ });
+
+ assertThat(linkerInputArtifacts)
+ .containsAllOf(
+ getBinArtifact(
+ "liblib.a", getConfiguredTarget("//cc:lib", getAppleCrosstoolConfiguration())),
+ getBinArtifact(
+ "libcc_lib_impl.a",
+ getConfiguredTarget(
+ "//third_party/cc_lib:cc_lib_impl", getAppleCrosstoolConfiguration())));
+ }
+
+ @Test
+ public void testCollectsSdkFrameworksTransitively() throws Exception {
+ createLibraryTargetWriter("//base_lib:lib")
+ .setAndCreateFiles("srcs", "a.m", "b.m", "private.h")
+ .setList("sdk_frameworks", "foo")
+ .write();
+ createLibraryTargetWriter("//depender_lib:lib")
+ .setAndCreateFiles("srcs", "a.m", "b.m", "private.h")
+ .setList("sdk_frameworks", "bar")
+ .setList("deps", "//base_lib:lib")
+ .write();
+
+ ObjcProvider baseProvider = providerForTarget("//base_lib:lib");
+ ObjcProvider dependerProvider = providerForTarget("//depender_lib:lib");
+
+ Set<SdkFramework> baseFrameworks = ImmutableSet.of(new SdkFramework("foo"));
+ Set<SdkFramework> dependerFrameworks =
+ ImmutableSet.of(new SdkFramework("foo"), new SdkFramework("bar"));
+ assertThat(baseProvider.get(SDK_FRAMEWORK)).containsExactlyElementsIn(baseFrameworks);
+ assertThat(dependerProvider.get(SDK_FRAMEWORK)).containsExactlyElementsIn(dependerFrameworks);
+
+ // Make sure that the archive action does not actually include the frameworks. This is needed
+ // for creating binaries but is ignored for libraries.
+ CommandAction archiveAction = archiveAction("//depender_lib:lib");
+ assertThat(archiveAction.getArguments())
+ .containsAllIn(
+ new ImmutableList.Builder<String>()
+ .add("-static")
+ .add("-filelist")
+ .add(
+ getBinArtifact("lib-archive.objlist", "//depender_lib:lib").getExecPathString())
+ .add("-arch_only", "x86_64")
+ .add("-syslibroot")
+ .add(AppleToolchain.sdkDir())
+ .add("-o")
+ .addAll(Artifact.toExecPaths(archiveAction.getOutputs()))
+ .build());
+ }
+
+ @Test
+ public void testMultipleRulesCompilingOneSourceGenerateUniqueObjFiles() throws Exception {
+ scratch.file("lib/a.m");
+ scratch.file("lib/BUILD",
+ "objc_library(name = 'lib1', srcs = ['a.m'], copts = ['-Ilib1flag'])",
+ "objc_library(name = 'lib2', srcs = ['a.m'], copts = ['-Ilib2flag'])");
+ Artifact obj1 = Iterables.getOnlyElement(
+ inputsEndingWith(archiveAction("//lib:lib1"), ".o"));
+ Artifact obj2 = Iterables.getOnlyElement(
+ inputsEndingWith(archiveAction("//lib:lib2"), ".o"));
+
+ // The exec paths of each obj file should be based on the objc_library target.
+ assertThat(obj1.getExecPathString()).contains("lib1");
+ assertThat(obj1.getExecPathString()).doesNotContain("lib2");
+ assertThat(obj2.getExecPathString()).doesNotContain("lib1");
+ assertThat(obj2.getExecPathString()).contains("lib2");
+
+ CommandAction compile1 = (CommandAction) getGeneratingAction(obj1);
+ CommandAction compile2 = (CommandAction) getGeneratingAction(obj2);
+ assertThat(compile1.getArguments()).contains("-Ilib1flag");
+ assertThat(compile2.getArguments()).contains("-Ilib2flag");
+ }
+
+ @Test
+ public void testIncludesDirsOfTransitiveDepsGetPassedToCompileAction() throws Exception {
+ createLibraryTargetWriter("//lib1:lib1")
+ .setAndCreateFiles("srcs", "a.m", "b.m", "private.h")
+ .setList("includes", "third_party/foo", "opensource/bar")
+ .write();
+
+ createLibraryTargetWriter("//lib2:lib2")
+ .setAndCreateFiles("srcs", "a.m", "b.m", "private.h")
+ .setList("includes", "more_includes")
+ .setList("deps", "//lib1:lib1")
+ .write();
+ CommandAction compileAction = compileAction("//lib2:lib2", "a.o");
+ // We remove spaces, since the crosstool rules do not use spaces in include paths
+ String compileActionArgs = Joiner.on("")
+ .join(compileAction.getArguments())
+ .replace(" ", "");
+ List<String> expectedIncludePaths = rootedIncludePaths(
+ getAppleCrosstoolConfiguration(),
+ "lib2/more_includes",
+ "lib1/third_party/foo",
+ "lib1/opensource/bar");
+ for (String expectedIncludePath : expectedIncludePaths) {
+ assertThat(compileActionArgs).contains("-I" + expectedIncludePath);
+ }
+ }
+
+ @Test
+ public void testIncludesDirsOfTransitiveCcDepsGetPassedToCompileAction() throws Exception {
+ scratch.file("package/BUILD",
+ "cc_library(",
+ " name = 'cc_lib',",
+ " srcs = ['a.cc'],",
+ " includes = ['foo/bar'],",
+ ")",
+ "",
+ "objc_library(",
+ " name = 'objc_lib',",
+ " srcs = ['b.m'],",
+ " deps = [':cc_lib'],",
+ ")");
+
+ CommandAction compileAction = compileAction("//package:objc_lib", "b.o");
+ assertContainsSublist(
+ compileAction.getArguments(),
+ ImmutableList.copyOf(
+ Interspersing.beforeEach(
+ "-isystem",
+ rootedIncludePaths(getAppleCrosstoolConfiguration(), "package/foo/bar"))));
+ }
+
+ @Test
+ public void testIncludesDirsOfTransitiveCcIncDepsGetPassedToCompileAction() throws Exception {
+ scratch.file(
+ "third_party/cc_lib/BUILD",
+ "licenses(['unencumbered'])",
+ "cc_library(",
+ " name = 'cc_lib_impl',",
+ " srcs = [",
+ " 'v1/a.c',",
+ " 'v1/a.h',",
+ " ],",
+ ")",
+ "",
+ "cc_inc_library(",
+ " name = 'cc_lib',",
+ " hdrs = ['v1/a.h'],",
+ " prefix = 'v1',",
+ " deps = [':cc_lib_impl'],",
+ ")");
+
+ scratch.file(
+ "package/BUILD",
+ "objc_library(",
+ " name = 'objc_lib',",
+ " srcs = ['b.m'],",
+ " deps = ['//third_party/cc_lib:cc_lib'],",
+ ")");
+
+ CommandAction compileAction = compileAction("//package:objc_lib", "b.o");
+ // We remove spaces, since the crosstool rules do not use spaces for include paths.
+ String compileActionArgs = Joiner.on("")
+ .join(compileAction.getArguments())
+ .replace(" ", "");
+ String includeDir =
+ getAppleCrosstoolConfiguration()
+ .getIncludeDirectory(RepositoryName.MAIN)
+ .getExecPathString()
+ + "/third_party/cc_lib/_/cc_lib";
+ assertThat(compileActionArgs).contains("-I" + includeDir);
+ }
+
+ @Test
+ public void testIncludesIquoteFlagForGenFilesRoot() throws Exception {
+ createLibraryTargetWriter("//lib:lib")
+ .setAndCreateFiles("srcs", "a.m", "b.m", "private.h")
+ .write();
+ CommandAction compileAction = compileAction("//lib:lib", "a.o");
+ BuildConfiguration config = getAppleCrosstoolConfiguration();
+ assertContainsSublist(compileAction.getArguments(), ImmutableList.of(
+ "-iquote", config.getGenfilesFragment().getSafePathString()));
}
@Test