diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 7d3d29f7..3c50c976 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -110,14 +110,6 @@ public interface LoomGradleExtension extends LoomGradleExtensionAPI { void setRefreshDeps(boolean refreshDeps); - /** - * If true, multi-project optimisation mode is enabled. This mode makes builds with many Loom projects - * much faster by increasing sharing and disabling some functionality. - * - *

You can enable it by setting the Gradle property {@code fabric.loom.multiProjectOptimisation} to {@code true}. - */ - boolean multiProjectOptimisation(); - ListProperty getLibraryProcessors(); ListProperty getRemapperExtensions(); diff --git a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java index f90f7e49..c1f93855 100644 --- a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java @@ -45,7 +45,6 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.configuration.ide.idea.IdeaUtils; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; import net.fabricmc.loom.extension.MixinExtension; -import net.fabricmc.loom.task.PrepareJarRemapTask; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.LoomVersions; @@ -121,11 +120,6 @@ public abstract class AnnotationProcessorInvoker { args.put("MSG_" + key, value); }); - if (loomExtension.multiProjectOptimisation()) { - // Ensure that all of the mixin mappings have been generated before we create the mixin mappings. - runBeforePrepare(project, task); - } - project.getLogger().debug("Outputting refmap to dir: " + getRefmapDestinationDir(task) + " for compile task: " + task); args.forEach((k, v) -> passArgument(task, k, v)); } catch (IOException e) { @@ -157,12 +151,6 @@ public abstract class AnnotationProcessorInvoker { } } - private void runBeforePrepare(Project project, Task compileTask) { - project.getGradle().allprojects(otherProject -> { - otherProject.getTasks().withType(PrepareJarRemapTask.class, prepareRemapTask -> prepareRemapTask.mustRunAfter(compileTask)); - }); - } - private static void checkPattern(String input, Pattern pattern) { final Matcher matcher = pattern.matcher(input); diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java index 139bd39f..c32c472e 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java @@ -39,7 +39,6 @@ import org.gradle.api.configuration.BuildFeatures; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; import org.gradle.api.provider.ListProperty; -import org.gradle.api.provider.Provider; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.api.mappings.intermediate.IntermediateMappingsProvider; @@ -55,10 +54,8 @@ import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.library.LibraryProcessorManager; import net.fabricmc.loom.configuration.providers.minecraft.mapped.IntermediaryMinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.mapped.NamedMinecraftProvider; -import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.download.Download; import net.fabricmc.loom.util.download.DownloadBuilder; -import net.fabricmc.loom.util.gradle.GradleUtils; public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implements LoomGradleExtension { private final Project project; @@ -75,7 +72,6 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl private IntermediaryMinecraftProvider intermediaryMinecraftProvider; private InstallerData installerData; private boolean refreshDeps; - private final Provider multiProjectOptimisation; private final ListProperty libraryProcessorFactories; private final LoomProblemReporter problemReporter; private final boolean configurationCacheActive; @@ -103,7 +99,6 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl }); refreshDeps = manualRefreshDeps(); - multiProjectOptimisation = GradleUtils.getBooleanPropertyProvider(project, Constants.Properties.MULTI_PROJECT_OPTIMISATION); libraryProcessorFactories = project.getObjects().listProperty(LibraryProcessorManager.LibraryProcessorFactory.class); libraryProcessorFactories.addAll(LibraryProcessorManager.DEFAULT_LIBRARY_PROCESSORS); libraryProcessorFactories.finalizeValueOnRead(); @@ -111,15 +106,6 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl configurationCacheActive = getBuildFeatures().getConfigurationCache().getActive().get(); isolatedProjectsActive = getBuildFeatures().getIsolatedProjects().getActive().get(); - // Fundamentally impossible to support multi-project optimisation with the configuration cache and/or isolated projects. - if (multiProjectOptimisation.get() && configurationCacheActive) { - throw new UnsupportedOperationException("Multi-project optimisation is not supported with the configuration cache"); - } - - if (multiProjectOptimisation.get() && isolatedProjectsActive) { - throw new UnsupportedOperationException("Isolated projects are not supported with multi-project optimisation"); - } - if (configurationCacheActive) { project.getLogger().warn("Loom support for the Gradle configuration cache is highly experimental and may not work as expected. Please report any issues you encounter."); } @@ -274,11 +260,6 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl this.refreshDeps = refreshDeps; } - @Override - public boolean multiProjectOptimisation() { - return multiProjectOptimisation.getOrElse(false); - } - @Override public ListProperty getLibraryProcessors() { return libraryProcessorFactories; diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java index e0f2abf1..12f5511a 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java @@ -83,12 +83,6 @@ public abstract class AbstractRemapJarTask extends Jar { @Input public abstract Property getTargetNamespace(); - /** - * When enabled the TinyRemapperService will not be shared across sub projects. - */ - @Input - public abstract Property getRemapperIsolation(); - @Inject protected abstract WorkerExecutor getWorkerExecutor(); @@ -116,7 +110,6 @@ public abstract class AbstractRemapJarTask extends Jar { public AbstractRemapJarTask() { getSourceNamespace().convention(MappingsNamespace.NAMED.toString()).finalizeValueOnRead(); getTargetNamespace().convention(MappingsNamespace.INTERMEDIARY.toString()).finalizeValueOnRead(); - getRemapperIsolation().convention(false).finalizeValueOnRead(); getIncludesClientOnlyClasses().convention(false).finalizeValueOnRead(); getJarType().finalizeValueOnRead(); diff --git a/src/main/java/net/fabricmc/loom/task/PrepareJarRemapTask.java b/src/main/java/net/fabricmc/loom/task/PrepareJarRemapTask.java deleted file mode 100644 index a774ac25..00000000 --- a/src/main/java/net/fabricmc/loom/task/PrepareJarRemapTask.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2022 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.task; - -import java.nio.file.Path; - -import javax.inject.Inject; - -import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.provider.Property; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.TaskAction; -import org.gradle.workers.WorkAction; -import org.gradle.workers.WorkParameters; -import org.gradle.workers.WorkQueue; -import org.gradle.workers.WorkerExecutor; - -import net.fabricmc.loom.task.service.TinyRemapperService; -import net.fabricmc.loom.util.service.UnsafeWorkQueueHelper; - -/** - * The prepare remap task runs before all other jar remap tasks, should be used to setup tiny remapper. - */ -public abstract class PrepareJarRemapTask extends AbstractLoomTask { - private final RemapJarTask remapJarTask; - @InputFile - public abstract RegularFileProperty getInputFile(); - - @Inject - public PrepareJarRemapTask(RemapJarTask remapJarTask) { - this.remapJarTask = remapJarTask; - - getInputFile().set(remapJarTask.getInputFile()); - // TODO can this be up-to-date when the main task is up-to date? - getOutputs().upToDateWhen((o) -> false); - - getProject().getGradle().allprojects(project -> { - project.getTasks().withType(PrepareJarRemapTask.class, otherTask -> { - if (otherTask == this) return; - - // Ensure that all other prepare tasks inputs have completed - dependsOn(otherTask.getInputs()); - mustRunAfter(otherTask.getInputs()); - }); - }); - } - - @Inject - protected abstract WorkerExecutor getWorkerExecutor(); - - @TaskAction - public void run() { - final WorkQueue workQueue = getWorkerExecutor().noIsolation(); - - workQueue.submit(ReadInputsAction.class, params -> { - params.getTinyRemapperBuildServiceUuid().set(UnsafeWorkQueueHelper.create(remapJarTask.getTinyRemapperService())); - params.getInputFile().set(getInputFile()); - }); - } - - public interface ReadInputsParams extends WorkParameters { - Property getTinyRemapperBuildServiceUuid(); - RegularFileProperty getInputFile(); - } - - public abstract static class ReadInputsAction implements WorkAction { - private final TinyRemapperService tinyRemapperService; - - public ReadInputsAction() { - this.tinyRemapperService = UnsafeWorkQueueHelper.get(getParameters().getTinyRemapperBuildServiceUuid(), TinyRemapperService.class); - } - - @Override - public void execute() { - final Path inputFile = getParameters().getInputFile().getAsFile().get().toPath(); - prepare(tinyRemapperService, inputFile); - } - } - - static void prepare(TinyRemapperService tinyRemapperService, Path inputFile) { - tinyRemapperService.getTinyRemapperForInputs().readInputsAsync(tinyRemapperService.getOrCreateTag(inputFile), inputFile); - } -} diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index d986c6ed..0061af65 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -117,10 +117,6 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { getUseMixinAP().set(LoomGradleExtension.get(getProject()).getMixin().getUseLegacyMixinAp()); - if (getLoomExtension().multiProjectOptimisation()) { - setupPreparationTask(); - } - // Make outputs reproducible by default setReproducibleFileOrder(true); setPreserveFileTimestamps(false); @@ -128,19 +124,6 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { getJarType().set("classes"); } - private void setupPreparationTask() { - PrepareJarRemapTask prepareJarTask = getProject().getTasks().create("prepare" + getName().substring(0, 1).toUpperCase() + getName().substring(1), PrepareJarRemapTask.class, this); - - dependsOn(prepareJarTask); - mustRunAfter(prepareJarTask); - - getProject().getGradle().allprojects(project -> { - project.getTasks() - .withType(PrepareJarRemapTask.class) - .configureEach(this::mustRunAfter); - }); - } - @TaskAction public void run() { submitWork(RemapAction.class, params -> { @@ -152,8 +135,6 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { params.getTinyRemapperBuildServiceUuid().set(UnsafeWorkQueueHelper.create(getTinyRemapperService())); params.getRemapClasspath().from(getClasspath()); - params.getMultiProjectOptimisation().set(getLoomExtension().multiProjectOptimisation()); - final boolean mixinAp = getUseMixinAP().get(); params.getUseMixinExtension().set(!mixinAp); @@ -209,7 +190,6 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { ConfigurableFileCollection getRemapClasspath(); Property getUseMixinExtension(); - Property getMultiProjectOptimisation(); Property getOptimizeFmj(); record RefmapData(List mixinConfigs, String refmapName) implements Serializable { } @@ -235,9 +215,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { try { LOGGER.info("Remapping {} to {}", inputFile, outputFile); - if (!getParameters().getMultiProjectOptimisation().getOrElse(false)) { - prepare(); - } + prepare(); if (tinyRemapperService != null) { tinyRemapper = tinyRemapperService.getTinyRemapperForRemapping(); @@ -261,7 +239,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { optimizeFMJ(); } - if (tinyRemapperService != null && !getParameters().getMultiProjectOptimisation().get()) { + if (tinyRemapperService != null) { tinyRemapperService.close(); } @@ -281,7 +259,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { final Path inputFile = getParameters().getInputFile().getAsFile().get().toPath(); if (tinyRemapperService != null) { - PrepareJarRemapTask.prepare(tinyRemapperService, inputFile); + tinyRemapperService.getTinyRemapperForInputs().readInputsAsync(tinyRemapperService.getOrCreateTag(inputFile), inputFile); } } diff --git a/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java b/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java index 4d2c4098..7c0697cd 100644 --- a/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java +++ b/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java @@ -46,7 +46,6 @@ import org.gradle.api.tasks.SourceSet; import org.jetbrains.annotations.Nullable; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.build.mixin.AnnotationProcessorInvoker; import net.fabricmc.loom.extension.RemapperExtensionHolder; import net.fabricmc.loom.task.AbstractRemapJarTask; @@ -70,7 +69,6 @@ public class TinyRemapperService implements SharedService { final LoomGradleExtension extension = LoomGradleExtension.get(project); final boolean legacyMixin = extension.getMixin().getUseLegacyMixinAp().get(); final @Nullable KotlinClasspathService kotlinClasspathService = KotlinClasspathService.getOrCreateIfRequired(serviceManager, project); - boolean multiProjectOptimisation = extension.multiProjectOptimisation(); // Generates an id that is used to share the remapper across projects. This tasks in the remap jar task name to handle custom remap jar tasks separately. final var joiner = new StringJoiner(":"); @@ -81,9 +79,8 @@ public class TinyRemapperService implements SharedService { joiner.add("kotlin-" + kotlinClasspathService.version()); } - if (remapJarTask.getRemapperIsolation().get() || !multiProjectOptimisation) { - joiner.add(project.getPath()); - } + // TODO remove this when removing shared service manager. + joiner.add(project.getPath()); extension.getKnownIndyBsms().get().stream().sorted().forEach(joiner::add); @@ -103,20 +100,6 @@ public class TinyRemapperService implements SharedService { final ConfigurationContainer configurations = project.getConfigurations(); ConfigurableFileCollection excludedMinecraftJars = project.files(); - // Exclude none root minecraft jars. - if (multiProjectOptimisation && !extension.isRootProject()) { - MappingsNamespace mappingsNamespace = MappingsNamespace.of(from); - - if (mappingsNamespace != null) { - for (Path minecraftJar : extension.getMinecraftJars(mappingsNamespace)) { - excludedMinecraftJars.from(minecraftJar.toFile()); - } - } else { - // None fatal as this is a performance optimisation. - project.getLogger().warn("Unable to find minecraft jar for namespace {}", from); - } - } - List classPath = remapJarTask.getClasspath() .minus(configurations.getByName(Constants.Configurations.MINECRAFT_COMPILE_LIBRARIES)) .minus(configurations.getByName(Constants.Configurations.MINECRAFT_RUNTIME_LIBRARIES)) diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 05798ebe..4d192ab2 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -128,7 +128,6 @@ public class Constants { } public static final class Properties { - public static final String MULTI_PROJECT_OPTIMISATION = "fabric.loom.multiProjectOptimisation"; public static final String DONT_REMAP = "fabric.loom.dontRemap"; public static final String DISABLE_REMAPPED_VARIANTS = "fabric.loom.disableRemappedVariants"; public static final String DISABLE_PROJECT_DEPENDENT_MODS = "fabric.loom.disableProjectDependentMods"; diff --git a/src/test/groovy/net/fabricmc/loom/test/benchmark/FabricAPIBenchmark.groovy b/src/test/groovy/net/fabricmc/loom/test/benchmark/FabricAPIBenchmark.groovy index 6857224d..9be4cdbb 100644 --- a/src/test/groovy/net/fabricmc/loom/test/benchmark/FabricAPIBenchmark.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/benchmark/FabricAPIBenchmark.groovy @@ -48,8 +48,6 @@ class FabricAPIBenchmark implements GradleProjectTestTrait { patch: "fabric_api" ) - gradle.enableMultiProjectOptimisation() - if (!gradle.buildGradle.text.contains("loom.mixin.useLegacyMixinAp")) { gradle.buildGradle << """ allprojects { diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy index 8d94b6aa..a116bfcc 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy @@ -49,8 +49,6 @@ class FabricAPITest extends Specification implements GradleProjectTestTrait { patch: "fabric_api" ) - gradle.enableMultiProjectOptimisation() - // Disable the mixin ap if needed. Fabric API is a large enough test project to see if something breaks. if (disableMixinAp) { gradle.buildGradle << """ @@ -103,7 +101,6 @@ class FabricAPITest extends Specification implements GradleProjectTestTrait { then: result.task(":build").outcome == SUCCESS - result.task(":prepareRemapJar").outcome == SUCCESS def biomeApiJar = new File(gradle.mavenLocalDir, "net/fabricmc/fabric-api/fabric-biome-api-v1/999.0.0/fabric-biome-api-v1-999.0.0.jar") new File(gradle.mavenLocalDir, "net/fabricmc/fabric-api/fabric-biome-api-v1/999.0.0/fabric-biome-api-v1-999.0.0-sources.jar").exists() diff --git a/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy b/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy index 9cf2e7b9..9356a8a5 100644 --- a/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy @@ -33,7 +33,6 @@ import org.gradle.util.GradleVersion import spock.lang.Shared import net.fabricmc.loom.test.LoomTestConstants -import net.fabricmc.loom.util.Constants import net.fabricmc.loom.util.ZipUtils trait GradleProjectTestTrait { @@ -332,9 +331,5 @@ trait GradleProjectTestTrait { } """ } - - void enableMultiProjectOptimisation() { - getGradleProperties() << "\n${Constants.Properties.MULTI_PROJECT_OPTIMISATION}=true" - } } } \ No newline at end of file