in src/com/facebook/buck/java/DefaultJavaLibraryRule.java [506:603]
public final List<Step> getBuildSteps(BuildContext context, BuildableContext buildableContext)
throws IOException {
ImmutableList.Builder<Step> commands = ImmutableList.builder();
BuildTarget buildTarget = getBuildTarget();
JavacOptions javacOptions = this.javacOptions;
// Only override the bootclasspath if this rule is supposed to compile Android code.
if (getProperties().is(ANDROID)) {
javacOptions = JavacOptions.builder(this.javacOptions)
.setBootclasspath(context.getAndroidBootclasspathSupplier().get())
.build();
}
// If this rule depends on AndroidResourceRules, then we need to generate the R.java files that
// this rule needs in order to be able to compile itself.
androidResourceDeps = UberRDotJavaUtil.getAndroidResourceDeps(this);
boolean dependsOnAndroidResourceRules = !androidResourceDeps.isEmpty();
if (dependsOnAndroidResourceRules) {
UberRDotJavaUtil.createDummyRDotJavaFiles(androidResourceDeps, buildTarget, commands);
}
ImmutableSetMultimap<JavaLibraryRule, String> transitiveClasspathEntries =
getTransitiveClasspathEntries();
ImmutableSetMultimap<JavaLibraryRule, String> declaredClasspathEntries =
getDeclaredClasspathEntries();
// If this rule depends on AndroidResourceRules, then we need to include the compiled R.java
// files on the classpath when compiling this rule.
if (dependsOnAndroidResourceRules) {
ImmutableSetMultimap.Builder<JavaLibraryRule, String> transitiveClasspathEntriesWithRDotJava =
ImmutableSetMultimap.builder();
transitiveClasspathEntriesWithRDotJava.putAll(transitiveClasspathEntries);
ImmutableSetMultimap.Builder<JavaLibraryRule, String> declaredClasspathEntriesWithRDotJava =
ImmutableSetMultimap.builder();
declaredClasspathEntriesWithRDotJava.putAll(declaredClasspathEntries);
ImmutableSet<String> rDotJavaClasspath =
ImmutableSet.of(UberRDotJavaUtil.getRDotJavaBinFolder(buildTarget));
transitiveClasspathEntriesWithRDotJava.putAll(this, rDotJavaClasspath);
declaredClasspathEntriesWithRDotJava.putAll(this, rDotJavaClasspath);
declaredClasspathEntries = declaredClasspathEntriesWithRDotJava.build();
transitiveClasspathEntries = transitiveClasspathEntriesWithRDotJava.build();
}
// Javac requires that the root directory for generated sources already exist.
String annotationGenFolder =
javacOptions.getAnnotationProcessingData().getGeneratedSourceFolderName();
if (annotationGenFolder != null) {
MakeCleanDirectoryStep mkdirGeneratedSources =
new MakeCleanDirectoryStep(annotationGenFolder);
commands.add(mkdirGeneratedSources);
}
// Always create the output directory, even if there are no .java files to compile because there
// might be resources that need to be copied there.
String outputDirectory = getClassesDir(getBuildTarget());
commands.add(new MakeCleanDirectoryStep(outputDirectory));
Optional<JavacInMemoryStep.SuggestBuildRules> suggestBuildRule =
createSuggestBuildFunction(context,
transitiveClasspathEntries,
declaredClasspathEntries,
JAR_RESOLVER);
// This adds the javac command, along with any supporting commands.
createCommandsForJavac(
outputDirectory,
ImmutableSet.copyOf(transitiveClasspathEntries.values()),
ImmutableSet.copyOf(declaredClasspathEntries.values()),
javacOptions,
context.getBuildDependencies(),
suggestBuildRule,
commands);
// If there are resources, then link them to the appropriate place in the classes directory.
addResourceCommands(context, commands, outputDirectory, context.getJavaPackageFinder());
if (outputJar.isPresent()) {
commands.add(new MakeCleanDirectoryStep(getOutputJarDirPath(getBuildTarget())));
commands.add(new JarDirectoryStep(
outputJar.get(),
Collections.singleton(outputDirectory),
/* mainClass */ null,
/* manifestFile */ null));
}
Preconditions.checkNotNull(abiKeySupplier,
"abiKeySupplier must be set so that getAbiKey() will " +
"return a non-null value if this rule builds successfully.");
addStepsToRecordAbiToDisk(commands, buildableContext);
return commands.build();
}