fabric-loom/src/main/java/net/fabricmc/loom/AbstractPlugin.java

267 lines
11 KiB
Java
Raw Normal View History

/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
2018-10-27 14:14:05 +00:00
* Copyright (c) 2016, 2017, 2018 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom;
2016-08-15 10:22:14 +00:00
2016-08-17 16:38:54 +00:00
import com.google.common.collect.ImmutableMap;
import net.fabricmc.loom.providers.MappingsProvider;
import net.fabricmc.loom.providers.MinecraftProvider;
import net.fabricmc.loom.providers.ModRemapperProvider;
import net.fabricmc.loom.task.RemapJar;
import net.fabricmc.loom.task.RemapSourcesJar;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.LoomDependencyManager;
import net.fabricmc.loom.util.SetupIntelijRunConfigs;
2016-08-15 10:22:14 +00:00
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.UnknownTaskException;
import org.gradle.api.artifacts.Configuration;
2016-08-15 10:22:14 +00:00
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.bundling.AbstractArchiveTask;
2018-05-14 10:22:50 +00:00
import org.gradle.api.tasks.compile.JavaCompile;
2016-08-15 10:22:14 +00:00
import org.gradle.api.tasks.javadoc.Javadoc;
import org.gradle.plugins.ide.eclipse.model.EclipseModel;
import org.gradle.plugins.ide.idea.model.IdeaModel;
2016-08-29 10:08:23 +00:00
import java.io.File;
import java.io.IOException;
2018-05-14 10:22:50 +00:00
import java.util.Map;
import java.util.Set;
2016-08-15 10:22:14 +00:00
public class AbstractPlugin implements Plugin<Project> {
2016-08-17 16:38:54 +00:00
protected Project project;
@Override
public void apply(Project target) {
this.project = target;
2018-11-03 18:03:43 +00:00
project.getLogger().lifecycle("Fabric Loom: " + AbstractPlugin.class.getPackage().getImplementationVersion());
2016-08-17 16:38:54 +00:00
// Apply default plugins
project.apply(ImmutableMap.of("plugin", "java"));
project.apply(ImmutableMap.of("plugin", "eclipse"));
project.apply(ImmutableMap.of("plugin", "idea"));
project.getExtensions().create("minecraft", LoomGradleExtension.class, project);
2016-08-17 16:38:54 +00:00
2016-09-28 15:51:31 +00:00
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
2016-08-17 16:38:54 +00:00
// Force add Mojang repository
addMavenRepo(target, "Mojang", "https://libraries.minecraft.net/");
Configuration compileModsConfig = project.getConfigurations().maybeCreate(Constants.COMPILE_MODS);
2018-11-05 09:40:34 +00:00
compileModsConfig.setTransitive(false); // Dont get transitive deps of mods
Configuration minecraftConfig = project.getConfigurations().maybeCreate(Constants.MINECRAFT);
minecraftConfig.setTransitive(false); // The launchers do not recurse dependencies
2016-08-17 16:38:54 +00:00
2018-11-05 15:54:14 +00:00
project.getConfigurations().maybeCreate(Constants.MAPPINGS);
Configuration minecraftMappedConfig = project.getConfigurations().maybeCreate(Constants.MINECRAFT_MAPPED);
minecraftMappedConfig.setTransitive(false); // The launchers do not recurse dependencies
2016-08-17 16:38:54 +00:00
configureIDEs();
configureCompile();
2018-12-12 06:10:30 +00:00
if(extension.refmapName == null || extension.refmapName.isEmpty()){
project.getLogger().warn("Could not find refmap definition, will be using default name: " + project.getName() + "-refmap.json");
extension.refmapName = project.getName() + "-refmap.json";
}
Map<Project, Set<Task>> taskMap = project.getAllTasks(true);
for (Map.Entry<Project, Set<Task>> entry : taskMap.entrySet()) {
Project project = entry.getKey();
Set<Task> taskSet = entry.getValue();
for (Task task : taskSet) {
if (task instanceof JavaCompile
&& !(task.getName().contains("Test")) && !(task.getName().contains("test"))) {
JavaCompile javaCompileTask = (JavaCompile) task;
javaCompileTask.doFirst(task1 -> {
project.getLogger().lifecycle(":setting java compiler args");
try {
2018-12-09 21:22:35 +00:00
javaCompileTask.getOptions().getCompilerArgs().add("-AinMapFileNamedIntermediary=" + extension.getMappingsProvider().MAPPINGS_TINY.getCanonicalPath());
javaCompileTask.getOptions().getCompilerArgs().add("-AoutMapFileNamedIntermediary=" + extension.getMappingsProvider().MAPPINGS_MIXIN_EXPORT.getCanonicalPath());
javaCompileTask.getOptions().getCompilerArgs().add("-AoutRefMapFile=" + new File(javaCompileTask.getDestinationDir(), extension.refmapName).getCanonicalPath());
2018-11-02 16:19:57 +00:00
javaCompileTask.getOptions().getCompilerArgs().add("-AdefaultObfuscationEnv=named:intermediary");
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
2016-08-17 16:38:54 +00:00
}
/**
* Permit to create a Task instance of the type in the project
*
* @param name The name of the task
* @param type The type of the task that will be used to create an instance
* @return The created task object for the project
*/
public <T extends Task> T makeTask(String name, Class<T> type) {
return makeTask(project, name, type);
}
/**
* Permit to create a Task instance of the type in a project
*
* @param target The target project
* @param name The name of the task
* @param type The type of the task that will be used to create an instance
* @return The created task object for the specified project
*/
public static <T extends Task> T makeTask(Project target, String name, Class<T> type) {
return target.getTasks().create(name, type);
}
/**
* Permit to add a Maven repository to a target project
*
* @param target The garget project
* @param name The name of the repository
* @param url The URL of the repository
* @return An object containing the name and the URL of the repository that can be modified later
*/
public MavenArtifactRepository addMavenRepo(Project target, final String name, final String url) {
return target.getRepositories().maven(repo -> {
repo.setName(name);
repo.setUrl(url);
});
}
/**
* Add Minecraft dependencies to IDE dependencies
*/
protected void configureIDEs() {
// IDEA
2018-11-01 11:15:09 +00:00
IdeaModel ideaModel = (IdeaModel) project.getExtensions().getByName("idea");
2016-08-17 16:38:54 +00:00
2018-11-01 11:15:09 +00:00
ideaModel.getModule().getExcludeDirs().addAll(project.files(".gradle", "build", ".idea", "out").getFiles());
ideaModel.getModule().setDownloadJavadoc(true);
ideaModel.getModule().setDownloadSources(true);
ideaModel.getModule().setInheritOutputDirs(true);
2016-08-17 16:38:54 +00:00
// ECLIPSE
2018-11-01 11:15:09 +00:00
EclipseModel eclipseModel = (EclipseModel) project.getExtensions().getByName("eclipse");
2016-08-17 16:38:54 +00:00
}
/**
* Add Minecraft dependencies to compile time
*/
protected void configureCompile() {
JavaPluginConvention javaModule = (JavaPluginConvention) project.getConvention().getPlugins().get("java");
SourceSet main = javaModule.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME);
SourceSet test = javaModule.getSourceSets().getByName(SourceSet.TEST_SOURCE_SET_NAME);
Javadoc javadoc = (Javadoc) project.getTasks().getByName(JavaPlugin.JAVADOC_TASK_NAME);
javadoc.setClasspath(main.getOutput().plus(main.getCompileClasspath()));
project.afterEvaluate(project1 -> {
LoomGradleExtension extension = project1.getExtensions().getByType(LoomGradleExtension.class);
project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> {
2018-05-13 01:43:40 +00:00
flatDirectoryArtifactRepository.dir(extension.getUserCache());
flatDirectoryArtifactRepository.setName("UserCacheFiles");
});
2016-08-29 10:08:23 +00:00
project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> {
flatDirectoryArtifactRepository.dir(extension.getProjectCache());
2016-08-29 10:08:23 +00:00
flatDirectoryArtifactRepository.setName("UserLocalCacheFiles");
});
project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> {
flatDirectoryArtifactRepository.dir(extension.getRemappedModCache());
flatDirectoryArtifactRepository.setName("UserLocalRemappedMods");
});
project1.getRepositories().maven(mavenArtifactRepository -> {
2018-12-09 07:21:32 +00:00
mavenArtifactRepository.setName("Fabric");
mavenArtifactRepository.setUrl("https://maven.fabricmc.net/");
});
2018-12-09 07:21:32 +00:00
/* project1.getRepositories().maven(mavenArtifactRepository -> {
mavenArtifactRepository.setName("SpongePowered");
mavenArtifactRepository.setUrl("http://repo.spongepowered.org/maven");
2018-12-09 07:21:32 +00:00
}); */
2016-08-17 16:38:54 +00:00
project1.getRepositories().maven(mavenArtifactRepository -> {
mavenArtifactRepository.setName("Mojang");
mavenArtifactRepository.setUrl("https://libraries.minecraft.net/");
});
project1.getRepositories().mavenCentral();
project1.getRepositories().jcenter();
LoomDependencyManager dependencyManager = new LoomDependencyManager();
extension.setDependencyManager(dependencyManager);
2016-08-17 16:38:54 +00:00
dependencyManager.addProvider(new MinecraftProvider());
2018-12-09 21:22:35 +00:00
dependencyManager.addProvider(new MappingsProvider());
dependencyManager.addProvider(new ModRemapperProvider());
dependencyManager.handleDependencies(project1);
project1.getTasks().getByName("idea").finalizedBy(project1.getTasks().getByName("genIdeaWorkspace"));
2018-12-12 13:43:42 +00:00
project1.getTasks().getByName("eclipse").finalizedBy(project1.getTasks().getByName("genEclipseRuns"));
if(extension.autoGenIDERuns){
SetupIntelijRunConfigs.setup(project1);
}
//Enables the default mod remapper
if (extension.remapMod) {
AbstractArchiveTask jarTask = (AbstractArchiveTask) project1.getTasks().getByName("jar");
RemapJar remapJarTask = (RemapJar) project1.getTasks().findByName("remapJar");
remapJarTask.jar = jarTask.getArchivePath();
remapJarTask.doLast(task -> project1.getArtifacts().add("archives", remapJarTask.jar));
remapJarTask.dependsOn(project1.getTasks().getByName("jar"));
project1.getTasks().getByName("build").dependsOn(remapJarTask);
try {
AbstractArchiveTask sourcesTask = (AbstractArchiveTask) project1.getTasks().getByName("sourcesJar");
RemapSourcesJar remapSourcesJarTask = (RemapSourcesJar) project1.getTasks().findByName("remapSourcesJar");
remapSourcesJarTask.jar = sourcesTask.getArchivePath();
remapSourcesJarTask.doLast(task -> project1.getArtifacts().add("archives", remapSourcesJarTask.jar));
remapSourcesJarTask.dependsOn(project1.getTasks().getByName("sourcesJar"));
project1.getTasks().getByName("build").dependsOn(remapSourcesJarTask);
} catch (UnknownTaskException e) {
// pass
}
2018-12-12 06:10:30 +00:00
} else {
AbstractArchiveTask jarTask = (AbstractArchiveTask) project1.getTasks().getByName("jar");
extension.addUnmappedMod(jarTask.getArchivePath());
2016-10-12 09:44:31 +00:00
}
});
2016-08-29 10:08:23 +00:00
}
2016-08-15 10:22:14 +00:00
}