diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java index 40dfaa80..e05847cb 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java @@ -156,7 +156,11 @@ public class RunConfig { configName = ""; String srcName = sourceSet.getName(); - if (!srcName.equals(SourceSet.MAIN_SOURCE_SET_NAME)) { + final boolean isSplitClientSourceSet = extension.areEnvironmentSourceSetsSplit() + && srcName.equals("client") + && environment.equals("client"); + + if (!srcName.equals(SourceSet.MAIN_SOURCE_SET_NAME) && !isSplitClientSourceSet) { configName += capitalizeCamelCaseName(srcName) + " "; } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java index b82ca2dc..94d33a8d 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java @@ -29,13 +29,10 @@ import java.util.regex.Pattern; import org.gradle.api.Project; import org.gradle.api.artifacts.ExternalModuleDependency; -import org.gradle.api.tasks.TaskContainer; -import org.gradle.api.tasks.TaskProvider; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomRepositoryPlugin; import net.fabricmc.loom.configuration.providers.BundleMetadata; -import net.fabricmc.loom.task.ExtractNativesTask; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.OperatingSystem; @@ -57,15 +54,7 @@ public class MinecraftLibraryProvider { } if (versionInfo.hasNativesToExtract()) { - final TaskContainer tasks = project.getTasks(); - extension.createLazyConfiguration(Constants.Configurations.MINECRAFT_NATIVES, configuration -> configuration.setTransitive(false)); - - TaskProvider extractNativesTask = tasks.register("extractNatives", ExtractNativesTask.class, t -> { - t.setDescription("Extracts the minecraft platform specific natives."); - }); - - tasks.named("configureClientLaunch", configureClientLaunch -> configureClientLaunch.dependsOn(extractNativesTask)); } for (MinecraftVersionMeta.Library library : versionInfo.libraries()) { diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java index c78b1e9f..0df1e4e9 100644 --- a/src/main/java/net/fabricmc/loom/task/LoomTasks.java +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -52,10 +52,6 @@ public final class LoomTasks { }); RemapTaskConfiguration.setupRemap(project); - - tasks.register("downloadAssets", DownloadAssetsTask.class, t -> { - t.setDescription("Downloads required assets for Fabric."); - }); tasks.register("generateDLIConfig", GenerateDLIConfigTask.class, t -> { t.setDescription("Generate the DevLaunchInjector config file"); @@ -79,14 +75,6 @@ public final class LoomTasks { task.setGroup(Constants.TaskGroup.FABRIC); }); - tasks.register("configureClientLaunch", task -> { - task.dependsOn(tasks.named("downloadAssets")); - task.dependsOn(tasks.named("configureLaunch")); - - task.setDescription("Setup the required files to launch the Minecraft client"); - task.setGroup(Constants.TaskGroup.FABRIC); - }); - TaskProvider validateAccessWidener = tasks.register("validateAccessWidener", ValidateAccessWidenerTask.class, t -> { t.setDescription("Validate all the rules in the access widener against the Minecraft jar"); t.setGroup("verification"); @@ -97,6 +85,18 @@ public final class LoomTasks { registerIDETasks(tasks); registerRunTasks(tasks, project); registerLaunchSettings(project); + + // Must be done in afterEvaluate to allow time for the build script to configure the jar config. + project.afterEvaluate(p -> { + LoomGradleExtension extension = LoomGradleExtension.get(project); + + if (extension.getMinecraftJarConfiguration().get() == MinecraftJarConfiguration.SERVER_ONLY) { + // Server only, nothing more to do. + return; + } + + registerClientSetupTasks(project.getTasks(), extension.getMinecraftProvider().getVersionInfo().hasNativesToExtract()); + }); } private static void registerIDETasks(TaskContainer tasks) { @@ -158,6 +158,30 @@ public final class LoomTasks { }); } + private static void registerClientSetupTasks(TaskContainer tasks, boolean extractNatives) { + tasks.register("downloadAssets", DownloadAssetsTask.class, t -> { + t.setDescription("Downloads required game assets for Minecraft."); + }); + + if (extractNatives) { + tasks.register("extractNatives", ExtractNativesTask.class, t -> { + t.setDescription("Extracts the Minecraft platform specific natives."); + }); + } + + tasks.register("configureClientLaunch", task -> { + task.dependsOn(tasks.named("downloadAssets")); + task.dependsOn(tasks.named("configureLaunch")); + + if (extractNatives) { + task.dependsOn(tasks.named("extractNatives")); + } + + task.setDescription("Setup the required files to launch the Minecraft client"); + task.setGroup(Constants.TaskGroup.FABRIC); + }); + } + private static void registerLaunchSettings(Project project) { LoomGradleExtension extension = LoomGradleExtension.get(project); Preconditions.checkArgument(extension.getLaunchConfigs().size() == 0, "Launch configurations must not be registered before loom"); diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index baa9573c..258dba80 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -120,6 +120,9 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { @Input public abstract Property getAddNestedDependencies(); + @Input + public abstract Property getIncludesClientOnlyClasses(); + /** * Gets the jar paths to the access wideners that will be converted to ATs for Forge runtime. * If you specify multiple files, they will be merged into one. @@ -159,6 +162,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { getClasspath().from(getProject().getConfigurations().getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME)); getAddNestedDependencies().convention(true).finalizeValueOnRead(); + getIncludesClientOnlyClasses().convention(false).finalizeValueOnRead(); getReadMixinConfigsFromManifest().convention(LoomGradleExtension.get(getProject()).isForge()).finalizeValueOnRead(); getInjectAccessWidener().convention(false); @@ -221,7 +225,11 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { params.getMappingBuildServiceUuid().set(UnsafeWorkQueueHelper.create(getProject(), MappingsService.createDefault(getProject(), getSourceNamespace().get(), getTargetNamespace().get()))); } - if (extension.areEnvironmentSourceSetsSplit()) { + if (getIncludesClientOnlyClasses().get()) { + if (!extension.areEnvironmentSourceSetsSplit()) { + throw new UnsupportedOperationException("Jar cannot include client only classes as the sources are not split"); + } + final List clientOnlyJarEntries = getClientOnlyJarEntries(); params.getManifestAttributes().set(Map.of( "Fabric-Loom-Split-Environment", "true", diff --git a/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java b/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java index 61ed6599..a612943b 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java +++ b/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java @@ -72,6 +72,7 @@ public class RemapTaskConfiguration { // Setup the input file and the nested deps task.getInputFile().convention(jarTask.getArchiveFile()); task.dependsOn(tasks.named(JavaPlugin.JAR_TASK_NAME)); + task.getIncludesClientOnlyClasses().set(project.provider(extension::areEnvironmentSourceSetsSplit)); }); // Configure the default jar task diff --git a/src/main/kotlin/net/fabricmc/loom/kotlin/remapping/KotlinClassMetadataRemappingAnnotationVisitor.kt b/src/main/kotlin/net/fabricmc/loom/kotlin/remapping/KotlinClassMetadataRemappingAnnotationVisitor.kt index 57fca33b..b8a10620 100644 --- a/src/main/kotlin/net/fabricmc/loom/kotlin/remapping/KotlinClassMetadataRemappingAnnotationVisitor.kt +++ b/src/main/kotlin/net/fabricmc/loom/kotlin/remapping/KotlinClassMetadataRemappingAnnotationVisitor.kt @@ -61,7 +61,7 @@ class KotlinClassMetadataRemappingAnnotationVisitor(private val remapper: Remapp val klass = metadata.toKmClass() val writer = KotlinClassMetadata.Class.Writer() klass.accept(RemappingKmVisitors(remapper).RemappingKmClassVisitor(writer)) - val remapped = writer.write(header.metadataVersion).header + val remapped = writer.write(header.metadataVersion, header.extraInt).header writeClassHeader(remapped) validateKotlinClassHeader(remapped, header) } @@ -71,7 +71,7 @@ class KotlinClassMetadataRemappingAnnotationVisitor(private val remapper: Remapp if (klambda != null) { val writer = KotlinClassMetadata.SyntheticClass.Writer() klambda.accept(RemappingKmVisitors(remapper).RemappingKmLambdaVisitor(writer)) - val remapped = writer.write(header.metadataVersion).header + val remapped = writer.write(header.metadataVersion, header.extraInt).header writeClassHeader(remapped) validateKotlinClassHeader(remapped, header) } else { @@ -82,7 +82,7 @@ class KotlinClassMetadataRemappingAnnotationVisitor(private val remapper: Remapp val kpackage = metadata.toKmPackage() val writer = KotlinClassMetadata.FileFacade.Writer() kpackage.accept(RemappingKmVisitors(remapper).RemappingKmPackageVisitor(writer)) - val remapped = writer.write(header.metadataVersion).header + val remapped = writer.write(header.metadataVersion, header.extraInt).header writeClassHeader(remapped) validateKotlinClassHeader(remapped, header) } diff --git a/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy b/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy index ddad9497..ea5c33ec 100644 --- a/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy @@ -27,8 +27,22 @@ package net.fabricmc.loom.test import org.gradle.util.GradleVersion class LoomTestConstants { - public final static String DEFAULT_GRADLE = GradleVersion.current().getVersion() - public final static String PRE_RELEASE_GRADLE = "7.6-20220516224938+0000" + private final static String NIGHTLY_VERSION = "7.6-20220519002827+0000" + private final static boolean NIGHTLY_EXISTS = nightlyExists(NIGHTLY_VERSION) - public final static String[] STANDARD_TEST_VERSIONS = [DEFAULT_GRADLE, PRE_RELEASE_GRADLE] + public final static String DEFAULT_GRADLE = GradleVersion.current().getVersion() + // Tests that depend specifically on the nightly will run on the current version when the nightly is not available. + public final static String PRE_RELEASE_GRADLE = NIGHTLY_EXISTS ? "7.6-20220516224938+0000" : DEFAULT_GRADLE + public final static String[] STANDARD_TEST_VERSIONS = NIGHTLY_EXISTS ? [DEFAULT_GRADLE, PRE_RELEASE_GRADLE] : [DEFAULT_GRADLE] + + /** + * Nightly gradle versions get removed after a certain amount of time, lets check to see if its still online before running the tests. + */ + private static boolean nightlyExists(String version) { + def url = "https://services.gradle.org/distributions-snapshots/gradle-${version}-bin.zip" + def con = new URL(url).openConnection() as HttpURLConnection + con.setRequestMethod("HEAD") // No need to request the whole file. + + return con.getResponseCode() == HttpURLConnection.HTTP_OK + } } diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/MCJarConfigTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/MCJarConfigTest.groovy index d58d0741..66deb25f 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/MCJarConfigTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/MCJarConfigTest.groovy @@ -50,7 +50,7 @@ class MCJarConfigTest extends Specification implements GradleProjectTestTrait { ''' when: - def result = gradle.run(task: "build") + def result = gradle.run(tasks: ["build", "ideaSyncTask"]) then: result.task(":build").outcome == SUCCESS @@ -77,7 +77,7 @@ class MCJarConfigTest extends Specification implements GradleProjectTestTrait { ''' when: - def result = gradle.run(task: "build") + def result = gradle.run(tasks: ["build", "ideaSyncTask"]) then: result.task(":build").outcome == SUCCESS @@ -104,7 +104,7 @@ class MCJarConfigTest extends Specification implements GradleProjectTestTrait { ''' when: - def result = gradle.run(task: "build") + def result = gradle.run(tasks: ["build", "ideaSyncTask"]) then: result.task(":build").outcome == SUCCESS @@ -131,7 +131,7 @@ class MCJarConfigTest extends Specification implements GradleProjectTestTrait { ''' when: - def result = gradle.run(task: "build") + def result = gradle.run(tasks: ["build", "ideaSyncTask"]) then: result.task(":build").outcome == SUCCESS diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy index 2ceb2a01..ced58f6b 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy @@ -56,9 +56,7 @@ class SimpleProjectTest extends Specification implements GradleProjectTestTrait serverResult.successful() serverResult.output.contains("Hello simple Fabric mod") // A check to ensure our mod init was actually called where: - version | _ - DEFAULT_GRADLE | _ - PRE_RELEASE_GRADLE | _ + version << STANDARD_TEST_VERSIONS } @Unroll