aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/fabricmc/loom/LoomGradleExtension.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/fabricmc/loom/LoomGradleExtension.java')
-rw-r--r--src/main/java/net/fabricmc/loom/LoomGradleExtension.java551
1 files changed, 36 insertions, 515 deletions
diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java
index 6ea1a3ed..2705898c 100644
--- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java
+++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java
@@ -25,563 +25,84 @@
package net.fabricmc.loom;
import java.io.File;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Objects;
import java.util.Set;
-import java.util.function.Consumer;
-import java.util.function.Function;
import java.util.function.Supplier;
-import java.util.stream.Collectors;
import org.cadixdev.lorenz.MappingSet;
import org.cadixdev.mercury.Mercury;
-import org.gradle.api.Action;
-import org.gradle.api.NamedDomainObjectContainer;
+import org.gradle.api.NamedDomainObjectProvider;
import org.gradle.api.Project;
-import org.gradle.api.artifacts.Dependency;
+import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.ConfigurableFileCollection;
-import org.gradle.api.plugins.BasePluginConvention;
-import org.gradle.api.plugins.JavaPluginConvention;
-import org.gradle.api.tasks.SourceSet;
-import org.jetbrains.annotations.ApiStatus;
-import net.fabricmc.loom.api.decompilers.LoomDecompiler;
+import net.fabricmc.loom.api.LoomGradleExtensionAPI;
import net.fabricmc.loom.configuration.InstallerData;
import net.fabricmc.loom.configuration.LoomDependencyManager;
-import net.fabricmc.loom.configuration.LoomProjectData;
-import net.fabricmc.loom.configuration.ide.RunConfig;
-import net.fabricmc.loom.configuration.ide.RunConfigSettings;
-import net.fabricmc.loom.configuration.launch.LaunchProviderSettings;
-import net.fabricmc.loom.configuration.processors.JarProcessor;
import net.fabricmc.loom.configuration.processors.JarProcessorManager;
import net.fabricmc.loom.configuration.providers.MinecraftProviderImpl;
-import net.fabricmc.loom.configuration.providers.forge.FieldMigratedMappingsProvider;
-import net.fabricmc.loom.configuration.providers.forge.ForgeProvider;
-import net.fabricmc.loom.configuration.providers.forge.ForgeUniversalProvider;
-import net.fabricmc.loom.configuration.providers.forge.ForgeUserdevProvider;
-import net.fabricmc.loom.configuration.providers.forge.McpConfigProvider;
-import net.fabricmc.loom.configuration.providers.forge.PatchProvider;
-import net.fabricmc.loom.configuration.providers.forge.SrgProvider;
-import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider;
-import net.fabricmc.loom.configuration.providers.mappings.GradleMappingContext;
-import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec;
-import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder;
-import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl;
-import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta;
-import net.fabricmc.loom.util.ModPlatform;
-import net.fabricmc.loom.util.function.LazyBool;
-
-public class LoomGradleExtension {
- private static final String FORGE_PROPERTY = "loom.forge";
- private static final String PLATFORM_PROPERTY = "loom.platform";
- private static final String INCLUDE_PROPERTY = "loom.forge.include";
-
- public String refmapName;
- public String loaderLaunchMethod;
- public boolean remapMod = true;
- public String customManifest = null;
- public File accessWidener = null;
- public Set<File> accessTransformers = new HashSet<>();
- public Function<String, Object> intermediaryUrl = mcVer -> "https://maven.fabricmc.net/net/fabricmc/intermediary/" + mcVer + "/intermediary-" + mcVer + "-v2.jar";
- public boolean shareCaches = false;
- public List<String> mixinConfigs = new ArrayList<>(); // FORGE: Passed to Minecraft
- public boolean useFabricMixin = true; // FORGE: Use Fabric Mixin for better refmap resolutions
-
- private final ConfigurableFileCollection unmappedMods;
- private final ConfigurableFileCollection log4jConfigs;
-
- final List<LoomDecompiler> decompilers = new ArrayList<>();
- private final List<JarProcessor> jarProcessors = new ArrayList<>();
- private boolean silentMojangMappingsLicense = false;
- public Boolean generateSrgTiny = null;
-
- // Not to be set in the build.gradle
- private final Project project;
- private List<String> dataGenMods = new ArrayList<>();
- private LoomDependencyManager dependencyManager;
- private JarProcessorManager jarProcessorManager;
- private InstallerData installerData;
- private MappingSet[] srcMappingCache = new MappingSet[2];
- private Mercury[] srcMercuryCache = new Mercury[2];
- private ModPlatform platform;
- private final LazyBool supportsInclude;
- private Set<File> mixinMappings = Collections.synchronizedSet(new HashSet<>());
- private final List<String> tasksBeforeRun = Collections.synchronizedList(new ArrayList<>());
- public final List<Supplier<SourceSet>> forgeLocalMods = Collections.synchronizedList(new ArrayList<>(Collections.singletonList(new Supplier<SourceSet>() {
- @Override
- public SourceSet get() {
- return project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().getByName("main");
- }
- })));
- @ApiStatus.Experimental
- public final List<Consumer<RunConfig>> settingsPostEdit = new ArrayList<>();
-
- @ApiStatus.Internal
- private final LoomProjectData projectData;
-
- private NamedDomainObjectContainer<RunConfigSettings> runConfigs;
- private NamedDomainObjectContainer<LaunchProviderSettings> launchConfigs;
-
- /**
- * Loom will generate a new genSources task (with a new name, based off of {@link LoomDecompiler#name()})
- * that uses the specified decompiler instead.
- */
- public void addDecompiler(LoomDecompiler decompiler) {
- decompilers.add(decompiler);
- }
-
- /**
- * Add a transformation over the mapped mc jar.
- * Adding any jar processor will cause mapped mc jars to be stored per-project so that
- * different transformation can be applied in different projects.
- * This means remapping will need to be done individually per-project, which is slower when developing
- * more than one project using the same minecraft version.
- */
- public void addJarProcessor(JarProcessor processor) {
- jarProcessors.add(processor);
- }
-
- public MappingSet getOrCreateSrcMappingCache(int id, Supplier<MappingSet> factory) {
- if (id < 0 || id >= srcMappingCache.length) return factory.get();
- return srcMappingCache[id] != null ? srcMappingCache[id] : (srcMappingCache[id] = factory.get());
- }
-
- public Mercury getOrCreateSrcMercuryCache(int id, Supplier<Mercury> factory) {
- if (id < 0 || id >= srcMercuryCache.length) return factory.get();
- return srcMercuryCache[id] != null ? srcMercuryCache[id] : (srcMercuryCache[id] = factory.get());
- }
-
- public void localMods(Action<SourceSetConsumer> action) {
- if (!isForge()) {
- throw new UnsupportedOperationException("Not running with Forge support.");
- }
-
- action.execute(new SourceSetConsumer());
- }
-
- public boolean isDataGenEnabled() {
- return isForge() && !dataGenMods.isEmpty();
- }
-
- public List<String> getDataGenMods() {
- return dataGenMods;
- }
-
- public class SourceSetConsumer {
- public void add(Object... sourceSets) {
- for (Object sourceSet : sourceSets) {
- if (sourceSet instanceof SourceSet) {
- forgeLocalMods.add(() -> (SourceSet) sourceSet);
- } else {
- forgeLocalMods.add(() -> project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().findByName(String.valueOf(forgeLocalMods)));
- }
- }
- }
- }
-
- public void dataGen(Action<DataGenConsumer> action) {
- if (!isForge()) {
- throw new UnsupportedOperationException("Not running with Forge support.");
- }
-
- action.execute(new DataGenConsumer());
- }
-
- public class DataGenConsumer {
- public void mod(String... modIds) {
- dataGenMods.addAll(Arrays.asList(modIds));
-
- if (modIds.length > 0 && getRunConfigs().findByName("data") == null) {
- getRunConfigs().create("data", RunConfigSettings::data);
- }
- }
- }
-
- public void addTaskBeforeRun(String task) {
- this.tasksBeforeRun.add(task);
- }
-
- public List<String> getTasksBeforeRun() {
- return tasksBeforeRun;
- }
-
- public void mixinConfig(String... config) {
- mixinConfigs.addAll(Arrays.asList(config));
- }
-
- public void silentMojangMappingsLicense() {
- this.silentMojangMappingsLicense = true;
- }
-
- public boolean isSilentMojangMappingsLicenseEnabled() {
- return silentMojangMappingsLicense;
- }
-
- public Dependency officialMojangMappings() {
- return layered(LayeredMappingSpecBuilder::officialMojangMappings);
- }
-
- public Dependency layered(Action<LayeredMappingSpecBuilder> action) {
- LayeredMappingSpecBuilder builder = new LayeredMappingSpecBuilder(this);
- action.execute(builder);
- LayeredMappingSpec builtSpec = builder.build();
- return new LayeredMappingsDependency(new GradleMappingContext(project, () -> {
- MinecraftVersionMeta versionInfo = getMinecraftProvider().getVersionInfo();
- return "layers/" + versionInfo.id() + "_" + builtSpec.getVersion().replace("+", "_").replace(".", "_");
- }), builtSpec, builtSpec.getVersion());
- }
-
- public LoomGradleExtension(Project project) {
- this.project = project;
- this.unmappedMods = project.files();
- this.supportsInclude = new LazyBool(() -> Boolean.parseBoolean(Objects.toString(project.findProperty(INCLUDE_PROPERTY))));
- this.runConfigs = project.container(RunConfigSettings.class,
- baseName -> new RunConfigSettings(project, baseName));
- this.launchConfigs = project.container(LaunchProviderSettings.class,
- baseName -> new LaunchProviderSettings(project, baseName));
- this.log4jConfigs = project.files(getDefaultLog4jConfigFile());
- projectData = new LoomProjectData(project);
- }
-
- /**
- * @see ConfigurableFileCollection#from(Object...)
- * @deprecated use {@link #getUnmappedModCollection()}{@code .from()} instead
- */
- @Deprecated
- public void addUnmappedMod(Path file) {
- getUnmappedModCollection().from(file);
- }
-
- /**
- * @deprecated use {@link #getUnmappedModCollection()} instead
- */
- @Deprecated
- public List<Path> getUnmappedMods() {
- return unmappedMods.getFiles().stream()
- .map(File::toPath)
- .collect(Collectors.toList());
- }
-
- public ConfigurableFileCollection getUnmappedModCollection() {
- return unmappedMods;
- }
-
- public void setInstallerData(InstallerData data) {
- this.installerData = data;
- }
-
- public InstallerData getInstallerData() {
- return installerData;
- }
-
- public void accessWidener(Object file) {
- this.accessWidener = project.file(file);
- }
-
- public void accessTransformer(Object file) {
- this.accessTransformers.add(project.file(file));
- }
-
- public File getUserCache() {
- File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "fabric-loom");
-
- if (!userCache.exists()) {
- userCache.mkdirs();
- }
-
- return userCache;
- }
-
- public File getRootProjectPersistentCache() {
- File projectCache = new File(project.getRootProject().file(".gradle"), "loom-cache");
-
- if (!projectCache.exists()) {
- projectCache.mkdirs();
- }
-
- return projectCache;
- }
-
- public File getProjectPersistentCache() {
- File projectCache = new File(project.file(".gradle"), "loom-cache");
-
- if (!projectCache.exists()) {
- projectCache.mkdirs();
- }
-
- return projectCache;
- }
-
- public File getRootProjectBuildCache() {
- File projectCache = new File(project.getRootProject().getBuildDir(), "loom-cache");
-
- if (!projectCache.exists()) {
- projectCache.mkdirs();
- }
-
- return projectCache;
- }
-
- public File getProjectBuildCache() {
- File projectCache = new File(project.getBuildDir(), "loom-cache");
-
- if (!projectCache.exists()) {
- projectCache.mkdirs();
- }
-
- return projectCache;
- }
-
- public File getRemappedModCache() {
- File remappedModCache = new File(getRootProjectPersistentCache(), "remapped_mods");
-
- if (!remappedModCache.exists()) {
- remappedModCache.mkdir();
- }
-
- return remappedModCache;
- }
-
- public File getNestedModCache() {
- File nestedModCache = new File(getRootProjectPersistentCache(), "nested_mods");
-
- if (!nestedModCache.exists()) {
- nestedModCache.mkdir();
- }
+import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider;
+import net.fabricmc.loom.extension.LoomFiles;
+import net.fabricmc.loom.extension.LoomGradleExtensionImpl;
+import net.fabricmc.loom.extension.MixinApExtension;
- return nestedModCache;
+public interface LoomGradleExtension extends LoomGradleExtensionAPI {
+ static LoomGradleExtension get(Project project) {
+ return project.getExtensions().getByType(LoomGradleExtensionImpl.class);
}
- public File getNativesJarStore() {
- File natives = new File(getUserCache(), "natives/jars");
+ LoomFiles getFiles();
- if (!natives.exists()) {
- natives.mkdirs();
- }
+ NamedDomainObjectProvider<Configuration> createLazyConfiguration(String name);
- return natives;
- }
+ NamedDomainObjectProvider<Configuration> getLazyConfigurationProvider(String name);
- public File getNativesDirectory() {
- if (project.hasProperty("fabric.loom.natives.dir")) {
- return new File((String) project.property("fabric.loom.natives.dir"));
- }
+ MappingSet getOrCreateSrcMappingCache(int id, Supplier<MappingSet> factory);
- File natives = new File(getUserCache(), "natives/" + getMinecraftProvider().minecraftVersion());
+ Mercury getOrCreateSrcMercuryCache(int id, Supplier<Mercury> factory);
- if (!natives.exists()) {
- natives.mkdirs();
- }
+ ConfigurableFileCollection getUnmappedModCollection();
- return natives;
- }
+ void setInstallerData(InstallerData data);
- public boolean hasCustomNatives() {
- return project.getProperties().get("fabric.loom.natives.dir") != null;
- }
+ InstallerData getInstallerData();
- public File getDevLauncherConfig() {
- return new File(getProjectPersistentCache(), "launch.cfg");
- }
+ void setDependencyManager(LoomDependencyManager dependencyManager);
- public String getLoaderLaunchMethod() {
- return loaderLaunchMethod != null ? loaderLaunchMethod : "";
- }
+ LoomDependencyManager getDependencyManager();
- public LoomDependencyManager getDependencyManager() {
- return dependencyManager;
- }
+ void setJarProcessorManager(JarProcessorManager jarProcessorManager);
- public PatchProvider getPatchProvider() {
- return getDependencyManager().getProvider(PatchProvider.class);
- }
+ JarProcessorManager getJarProcessorManager();
- public MinecraftProviderImpl getMinecraftProvider() {
+ default MinecraftProviderImpl getMinecraftProvider() {
return getDependencyManager().getProvider(MinecraftProviderImpl.class);
}
- public MinecraftMappedProvider getMinecraftMappedProvider() {
- return getMappingsProvider().mappedProvider;
- }
-
- public MappingsProviderImpl getMappingsProvider() {
- return getDependencyManager().getProvider(isForge() ? FieldMigratedMappingsProvider.class : MappingsProviderImpl.class);
- }
-
- public McpConfigProvider getMcpConfigProvider() {
- return getDependencyManager().getProvider(McpConfigProvider.class);
+ default MappingsProviderImpl getMappingsProvider() {
+ return getDependencyManager().getProvider(MappingsProviderImpl.class);
}
- public SrgProvider getSrgProvider() {
- return getDependencyManager().getProvider(SrgProvider.class);
- }
-
- public ForgeUniversalProvider getForgeUniversalProvider() {
- return getDependencyManager().getProvider(ForgeUniversalProvider.class);
- }
-
- public ForgeUserdevProvider getForgeUserdevProvider() {
- return getDependencyManager().getProvider(ForgeUserdevProvider.class);
- }
-
- public ForgeProvider getForgeProvider() {
- return getDependencyManager().getProvider(ForgeProvider.class);
- }
-
- public void setDependencyManager(LoomDependencyManager dependencyManager) {
- this.dependencyManager = dependencyManager;
- }
-
- public JarProcessorManager getJarProcessorManager() {
- return jarProcessorManager;
- }
-
- public void setJarProcessorManager(JarProcessorManager jarProcessorManager) {
- this.jarProcessorManager = jarProcessorManager;
- }
-
- public List<JarProcessor> getJarProcessors() {
- return jarProcessors;
+ default MinecraftMappedProvider getMinecraftMappedProvider() {
+ return getMappingsProvider().mappedProvider;
}
- public String getRefmapName() {
- if (refmapName == null || refmapName.isEmpty()) {
- String defaultRefmapName;
+ File getNextMixinMappings();
- if (isRootProject()) {
- defaultRefmapName = project.getConvention().getPlugin(BasePluginConvention.class).getArchivesBaseName() + "-refmap.json";
- } else {
- defaultRefmapName = project.getConvention().getPlugin(BasePluginConvention.class).getArchivesBaseName() + "-" + project.getPath().replaceFirst(":", "").replace(':', '_') + "-refmap.json";
- }
+ Set<File> getAllMixinMappings();
- project.getLogger().info("Could not find refmap definition, will be using default name: " + defaultRefmapName);
- refmapName = defaultRefmapName;
- }
+ boolean isRootProject();
- return refmapName;
- }
+ boolean isShareCaches();
- public boolean ideSync() {
+ default boolean ideSync() {
return Boolean.parseBoolean(System.getProperty("idea.sync.active", "false"));
}
- // Ideally this should use maven, but this is a lot easier
- public Function<String, String> getIntermediaryUrl() {
- // Done like this to work around this possibly not being a java string...
- return s -> intermediaryUrl.apply(s).toString();
- }
-
- public boolean isRootProject() {
- return project.getRootProject() == project;
- }
-
- public LoomGradleExtension getRootGradleExtension() {
- if (isRootProject()) {
- return this;
- }
-
- return project.getRootProject().getExtensions().getByType(LoomGradleExtension.class);
- }
-
- public LoomGradleExtension getSharedGradleExtension() {
- return isShareCaches() ? getRootGradleExtension() : this;
- }
-
- public boolean isShareCaches() {
- return shareCaches;
- }
-
- @ApiStatus.Experimental
- public ModPlatform getPlatform() {
- if (platform == null) {
- Object platformProperty = project.findProperty(PLATFORM_PROPERTY);
-
- if (platformProperty != null) {
- return platform = ModPlatform.valueOf(Objects.toString(platformProperty).toUpperCase(Locale.ROOT));
- }
-
- Object forgeProperty = project.findProperty(FORGE_PROPERTY);
-
- if (forgeProperty != null) {
- project.getLogger().warn("Project " + project.getPath() + " is using property " + FORGE_PROPERTY + " to enable forge mode. Please use '" + PLATFORM_PROPERTY + " = forge' instead!");
- return platform = Boolean.parseBoolean(Objects.toString(forgeProperty)) ? ModPlatform.FORGE : ModPlatform.FABRIC;
- }
-
- platform = ModPlatform.FABRIC;
- }
-
- return platform;
- }
-
- public boolean isForge() {
- return getPlatform() == ModPlatform.FORGE;
- }
-
- public boolean supportsInclude() {
- return !isForge() || supportsInclude.getAsBoolean();
- }
-
- public boolean shouldGenerateSrgTiny() {
- if (generateSrgTiny != null) {
- return generateSrgTiny;
- }
-
- return isForge();
- }
-
- // Creates a new file each time its called, this is then held onto later when remapping the output jar
- // Required as now when using parallel builds the old single file could be written by another sourceset compile task
- public synchronized File getNextMixinMappings() {
- File mixinMapping = new File(getProjectBuildCache(), "mixin-map-" + getMinecraftProvider().minecraftVersion() + "-" + getMappingsProvider().mappingsVersion + "." + mixinMappings.size() + ".tiny");
- mixinMappings.add(mixinMapping);
- return mixinMapping;
- }
-
- public Set<File> getAllMixinMappings() {
- return Collections.unmodifiableSet(mixinMappings);
- }
-
- public List<LoomDecompiler> getDecompilers() {
- return decompilers;
- }
-
- public File getDefaultLog4jConfigFile() {
- return new File(getProjectPersistentCache(), "log4j.xml");
- }
-
- public File getUnpickLoggingConfigFile() {
- return new File(getProjectPersistentCache(), "unpick-logging.properties");
- }
-
- public ConfigurableFileCollection getLog4jConfigs() {
- return log4jConfigs;
- }
-
- public void runs(Action<NamedDomainObjectContainer<RunConfigSettings>> action) {
- action.execute(runConfigs);
- }
-
- public void launches(Action<NamedDomainObjectContainer<LaunchProviderSettings>> action) {
- action.execute(launchConfigs);
+ default String getIntermediaryUrl(String minecraftVersion) {
+ // TODO reimplement a way to change this, was never really supported api anyway
+ return String.format("https://maven.fabricmc.net/net/fabricmc/intermediary/%1$s/intermediary-%1$s-v2.jar", minecraftVersion);
}
- public NamedDomainObjectContainer<RunConfigSettings> getRunConfigs() {
- return runConfigs;
- }
-
- public NamedDomainObjectContainer<LaunchProviderSettings> getLaunchConfigs() {
- return launchConfigs;
- }
-
- @ApiStatus.Internal
- public LoomProjectData getProjectData() {
- return projectData;
- }
+ MixinApExtension getMixinApExtension();
}