diff options
author | cpeyser <cpeyser@google.com> | 2017-09-18 20:16:10 +0200 |
---|---|---|
committer | László Csomor <laszlocsomor@google.com> | 2017-09-19 09:32:19 +0200 |
commit | 63caed61251cb3922efddc9985a44e13282f3f7d (patch) | |
tree | 05aa185829c5c43813162c375e18130bca70e842 /src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java | |
parent | 0ee3aa622fc13b8a5072ebddf5cd65823413b4ff (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.java | 307 |
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 |