diff options
Diffstat (limited to 'src/main/java/net/fabricmc/loom/LoomGradleExtension.java')
-rw-r--r-- | src/main/java/net/fabricmc/loom/LoomGradleExtension.java | 551 |
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(); } |