diff options
author | shedaniel <daniel@shedaniel.me> | 2020-12-27 13:02:10 +0800 |
---|---|---|
committer | shedaniel <daniel@shedaniel.me> | 2020-12-27 13:02:10 +0800 |
commit | 6647f77d95ba870e07adc83cc32ac78faf8415b6 (patch) | |
tree | ce2984a2bbface3872b6a2f082eaec2f14193eaf | |
parent | 4b93054ddbc64bce9b9e37a0e1f23122fa2c50b2 (diff) | |
download | architectury-loom-6647f77d95ba870e07adc83cc32ac78faf8415b6.tar.gz architectury-loom-6647f77d95ba870e07adc83cc32ac78faf8415b6.tar.bz2 architectury-loom-6647f77d95ba870e07adc83cc32ac78faf8415b6.zip |
Proper mod depending
9 files changed, 110 insertions, 70 deletions
diff --git a/build.gradle b/build.gradle index 20e0a16d..0230a622 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,8 @@ def baseVersion = '0.5' def build = "release #${System.getenv("GITHUB_RUN_NUMBER") == null ? "custom" : System.getenv("GITHUB_RUN_NUMBER")}" version = baseVersion + "." + (System.getenv("GITHUB_RUN_NUMBER") == null ? (((short) new Random().nextInt()).abs() + 1000).toString() : System.getenv("GITHUB_RUN_NUMBER")) +logger.lifecycle(":building plugin v${version}") + configurations { forgeInjectShadow forgeInjectCompileClasspath.extendsFrom(forgeInjectShadow) diff --git a/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java b/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java index a2aafaba..48fe2e50 100644 --- a/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java @@ -81,7 +81,10 @@ public class LaunchProvider extends DependencyProvider { .argument("client", "fmluserdevclient") .argument("server", "--launchTarget") - .argument("server", "fmluserdevserver"); + .argument("server", "fmluserdevserver") + + .property("mixin.env.remapRefMap", "true") + .property("net.minecraftforge.gradle.GradleStart.srg.srg-mcp", getExtension().getMappingsProvider().srgToNamedSrg.getAbsolutePath()); String mixinConfig = getExtension().mixinConfig; diff --git a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java b/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java index 9c944595..88b3be0e 100644 --- a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java @@ -40,6 +40,7 @@ import java.util.function.Consumer; import com.google.common.base.Preconditions; import com.google.common.net.UrlEscapers; +import net.fabricmc.loom.util.srg.SrgNamedWriter; import org.apache.commons.io.FileUtils; import org.apache.tools.ant.util.StringUtils; import org.gradle.api.Project; @@ -83,6 +84,7 @@ public class MappingsProvider extends DependencyProvider { public File mappingsMixinExport; public Path tinyMappingsWithSrg; public File mixinTinyMappingsWithSrg; // FORGE: The mixin mappings have srg names in intermediary. + public File srgToNamedSrg; // FORGE: srg to named in srg file format public MappingsProvider(Project project) { super(project); @@ -152,6 +154,7 @@ public class MappingsProvider extends DependencyProvider { tinyMappingsJar = new File(getExtension().getUserCache(), mappingsJar.getName().replace(".jar", "-" + jarClassifier + ".jar")); tinyMappingsWithSrg = mappingsDir.resolve(StringUtils.removeSuffix(mappingsJar.getName(), ".jar") + "-srg.tiny"); mixinTinyMappingsWithSrg = mappingsDir.resolve(StringUtils.removeSuffix(mappingsJar.getName(), ".jar") + "-mixin-srg.tiny").toFile(); + srgToNamedSrg = mappingsDir.resolve(StringUtils.removeSuffix(mappingsJar.getName(), ".jar") + "-srg-named.srg").toFile(); if (!tinyMappings.exists() || isRefreshDeps()) { storeMappings(getProject(), minecraftProvider, mappingsJar.toPath()); @@ -172,6 +175,10 @@ public class MappingsProvider extends DependencyProvider { Files.deleteIfExists(mixinTinyMappingsWithSrg.toPath()); Files.write(mixinTinyMappingsWithSrg.toPath(), lines); } + + if (!srgToNamedSrg.exists() || isRefreshDeps()) { + SrgNamedWriter.writeTo(getProject().getLogger(), srgToNamedSrg.toPath(), getMappingsWithSrg()); + } } addDependency(tinyMappingsJar, Constants.Configurations.MAPPINGS_FINAL); diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java index decc6223..be4f5cbc 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java @@ -24,11 +24,20 @@ package net.fabricmc.loom.providers; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import com.google.common.collect.ImmutableMap; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.DependencyProvider; +import net.fabricmc.loom.util.TinyRemapperMappingsHelper; +import net.fabricmc.loom.util.srg.AtRemapper; +import net.fabricmc.loom.util.srg.CoreModClassRemapper; +import net.fabricmc.mapping.tree.TinyTree; +import net.fabricmc.tinyremapper.NonClassCopyMode; +import net.fabricmc.tinyremapper.OutputConsumerPath; +import net.fabricmc.tinyremapper.TinyRemapper; +import org.gradle.api.Project; +import org.zeroturnaround.zip.ZipUtil; + +import java.io.*; import java.net.URI; import java.nio.file.FileSystem; import java.nio.file.FileSystems; @@ -41,19 +50,6 @@ import java.util.function.Consumer; import java.util.jar.Attributes; import java.util.jar.Manifest; -import com.google.common.collect.ImmutableMap; -import org.gradle.api.Project; - -import net.fabricmc.loom.util.TinyRemapperMappingsHelper; -import net.fabricmc.loom.util.srg.AtRemapper; -import net.fabricmc.loom.util.srg.CoreModClassRemapper; -import net.fabricmc.mapping.tree.TinyTree; -import net.fabricmc.tinyremapper.NonClassCopyMode; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.DependencyProvider; - public class MinecraftMappedProvider extends DependencyProvider { private static final Map<String, String> JSR_TO_JETBRAINS = new ImmutableMap.Builder<String, String>() .put("javax/annotation/Nullable", "org/jetbrains/annotations/Nullable") @@ -64,6 +60,7 @@ public class MinecraftMappedProvider extends DependencyProvider { private File inputJar; private File minecraftMappedJar; private File minecraftIntermediaryJar; + private File minecraftSrgJar; private MinecraftProvider minecraftProvider; @@ -83,7 +80,7 @@ public class MinecraftMappedProvider extends DependencyProvider { boolean isForgeAtDirty = getExtension().isForge() && getExtension().getMappingsProvider().patchedProvider.isAtDirty(); - if (!minecraftMappedJar.exists() || !getIntermediaryJar().exists() || isRefreshDeps() || isForgeAtDirty) { + if (!minecraftMappedJar.exists() || !getIntermediaryJar().exists() || (getExtension().isForge() && !getSrgJar().exists()) || isRefreshDeps() || isForgeAtDirty) { if (minecraftMappedJar.exists()) { minecraftMappedJar.delete(); } @@ -93,6 +90,10 @@ public class MinecraftMappedProvider extends DependencyProvider { if (minecraftIntermediaryJar.exists()) { minecraftIntermediaryJar.delete(); } + + if (getExtension().isForge() && minecraftSrgJar.exists()) { + minecraftSrgJar.delete(); + } try { mapMinecraftJar(); @@ -100,6 +101,9 @@ public class MinecraftMappedProvider extends DependencyProvider { // Cleanup some some things that may be in a bad state now minecraftMappedJar.delete(); minecraftIntermediaryJar.delete(); + if (getExtension().isForge()) { + minecraftSrgJar.delete(); + } getExtension().getMappingsProvider().cleanFiles(); throw new RuntimeException("Failed to remap minecraft", t); } @@ -120,9 +124,10 @@ public class MinecraftMappedProvider extends DependencyProvider { Path input = inputJar.toPath(); Path outputMapped = minecraftMappedJar.toPath(); Path outputIntermediary = minecraftIntermediaryJar.toPath(); + Path outputSrg = minecraftSrgJar == null ? null : minecraftSrgJar.toPath(); - for (String toM : Arrays.asList("named", "intermediary")) { - Path output = "named".equals(toM) ? outputMapped : outputIntermediary; + for (String toM : (getExtension().isForge() ? Arrays.asList("named", "intermediary", "srg") : Arrays.asList("named", "intermediary"))) { + Path output = "named".equals(toM) ? outputMapped : "srg".equals(toM) ? outputSrg : outputIntermediary; getProject().getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); @@ -144,7 +149,7 @@ public class MinecraftMappedProvider extends DependencyProvider { remapper.finish(); } - if (getExtension().isForge()) { + if (getExtension().isForge() && !"srg".equals(toM)) { getProject().getLogger().lifecycle(":running forge finalising tasks"); // TODO: Relocate this to its own class @@ -183,7 +188,7 @@ public class MinecraftMappedProvider extends DependencyProvider { public TinyRemapper getTinyRemapper(String fromM, String toM) throws IOException { TinyRemapper.Builder builder = TinyRemapper.newRemapper() - .withMappings(TinyRemapperMappingsHelper.create(getExtension().getMappingsProvider().getMappings(), fromM, toM, true)) + .withMappings(TinyRemapperMappingsHelper.create(getExtension().isForge() ? getExtension().getMappingsProvider().getMappingsWithSrg() : getExtension().getMappingsProvider().getMappings(), fromM, toM, true)) .renameInvalidLocals(true) .rebuildSourceFilenames(true); @@ -213,6 +218,7 @@ public class MinecraftMappedProvider extends DependencyProvider { public void initFiles(MinecraftProvider minecraftProvider, MappingsProvider mappingsProvider) { this.minecraftProvider = minecraftProvider; minecraftIntermediaryJar = new File(getExtension().getUserCache(), "minecraft-" + getJarVersionString("intermediary") + ".jar"); + minecraftSrgJar = !getExtension().isForge() ? null : new File(getExtension().getUserCache(), "minecraft-" + getJarVersionString("srg") + ".jar"); minecraftMappedJar = new File(getJarDirectory(getExtension().getUserCache(), "mapped"), "minecraft-" + getJarVersionString("mapped") + ".jar"); inputJar = getExtension().isForge() ? mappingsProvider.patchedProvider.getMergedJar() : minecraftProvider.getMergedJar(); } @@ -232,6 +238,10 @@ public class MinecraftMappedProvider extends DependencyProvider { public File getIntermediaryJar() { return minecraftIntermediaryJar; } + + public File getSrgJar() { + return minecraftSrgJar; + } public File getMappedJar() { return minecraftMappedJar; diff --git a/src/main/java/net/fabricmc/loom/util/ModProcessor.java b/src/main/java/net/fabricmc/loom/util/ModProcessor.java index f6d08935..a835ff61 100644 --- a/src/main/java/net/fabricmc/loom/util/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/util/ModProcessor.java @@ -139,7 +139,7 @@ public class ModProcessor { MinecraftMappedProvider mappedProvider = extension.getMinecraftMappedProvider(); MappingsProvider mappingsProvider = extension.getMappingsProvider(); - Path mc = mappedProvider.getIntermediaryJar().toPath(); + Path mc = extension.isForge() ? mappedProvider.getSrgJar().toPath() : mappedProvider.getIntermediaryJar().toPath(); Path[] mcDeps = mappedProvider.getMapperPaths().stream().map(File::toPath).toArray(Path[]::new); List<ModDependencyInfo> remapList = processList.stream().filter(ModDependencyInfo::requiresRemapping).collect(Collectors.toList()); diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 1f901aea..a1c04887 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -178,6 +178,9 @@ public class SourceRemapper { m.getClassPath().add(extension.getMinecraftMappedProvider().getMappedJar().toPath()); m.getClassPath().add(extension.getMinecraftMappedProvider().getIntermediaryJar().toPath()); + if (extension.isForge()) { + m.getClassPath().add(extension.getMinecraftMappedProvider().getSrgJar().toPath()); + } Dependency annotationDependency = extension.getDependencyManager().getProvider(LaunchProvider.class).annotationDependency; Set<File> files = project.getConfigurations().getByName("compileOnly") diff --git a/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java index 5795fd4e..38b2a0a8 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java @@ -24,21 +24,19 @@ package net.fabricmc.loom.util.srg; -import java.io.IOException; -import java.net.URI; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import com.google.common.collect.ImmutableMap; - import net.fabricmc.loom.util.function.CollectionUtil; import net.fabricmc.mapping.tree.TinyTree; import org.apache.commons.lang3.StringUtils; import org.gradle.api.logging.Logger; +import org.zeroturnaround.zip.ZipUtil; +import org.zeroturnaround.zip.transform.StringZipEntryTransformer; +import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; /** * Remaps AT classes from SRG to Yarn. @@ -47,21 +45,20 @@ import org.gradle.api.logging.Logger; */ public final class AtRemapper { public static void remap(Logger logger, Path jar, TinyTree mappings) throws IOException { - try (FileSystem fs = FileSystems.newFileSystem(URI.create("jar:" + jar.toUri()), ImmutableMap.of("create", false))) { - Path atPath = fs.getPath("META-INF", "accesstransformer.cfg"); - - if (Files.exists(atPath)) { - List<String> lines = Files.readAllLines(atPath); - List<String> output = new ArrayList<>(lines.size()); - - for (int i = 0; i < lines.size(); i++) { - String line = lines.get(i).trim(); - + ZipUtil.transformEntries(jar.toFile(), new ZipEntryTransformerEntry[]{(new ZipEntryTransformerEntry("META-INF/accesstransformer.cfg", new StringZipEntryTransformer() { + @Override + protected String transform(ZipEntry zipEntry, String input) { + String[] lines = input.split("\n"); + List<String> output = new ArrayList<>(lines.length); + + for (int i = 0; i < lines.length; i++) { + String line = lines[i].trim(); + if (line.startsWith("#") || StringUtils.isBlank(line)) { output.add(i, line); continue; } - + String[] parts = line.split(" "); if (parts.length < 2) { logger.warn("Invalid AT Line: " + line); @@ -73,15 +70,12 @@ public final class AtRemapper { mappings.getClasses(), def -> def.getName("srg").equals(name) ).map(def -> def.getName("named")).orElse(name).replace('/', '.'); - + output.add(i, String.join(" ", parts)); } - - if (!lines.equals(output)) { - Files.delete(atPath); - Files.write(atPath, output); - } + + return String.join("\n", output); } - } + }))}); } } diff --git a/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java index bb36794e..2ee9b69c 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java @@ -24,28 +24,27 @@ package net.fabricmc.loom.util.srg; +import com.google.common.collect.ImmutableMap; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.fabricmc.loom.util.function.CollectionUtil; +import net.fabricmc.mapping.tree.TinyTree; +import org.apache.logging.log4j.util.Strings; +import org.gradle.api.logging.Logger; + import java.io.IOException; import java.io.Reader; +import java.io.Writer; import java.net.URI; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import org.gradle.api.logging.Logger; - -import net.fabricmc.loom.util.function.CollectionUtil; -import net.fabricmc.mapping.tree.TinyTree; - /** * Remaps coremod class names from SRG to Yarn. * @@ -102,10 +101,11 @@ public final class CoreModClassRemapper { } } } - + if (!lines.equals(output)) { - Files.delete(js); - Files.write(js, output); + try (Writer writer = Files.newBufferedWriter(js, StandardCharsets.UTF_8, StandardOpenOption.WRITE)) { + writer.write(String.join(Strings.LINE_SEPARATOR, output)); + } } } } diff --git a/src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java b/src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java new file mode 100644 index 00000000..98315615 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java @@ -0,0 +1,21 @@ +package net.fabricmc.loom.util.srg; + +import net.fabricmc.lorenztiny.TinyMappingsReader; +import net.fabricmc.mapping.tree.TinyTree; +import org.cadixdev.lorenz.io.srg.SrgWriter; +import org.gradle.api.logging.Logger; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class SrgNamedWriter { + public static void writeTo(Logger logger, Path srgFile, TinyTree mappings) throws IOException { + Files.deleteIfExists(srgFile); + try (SrgWriter writer = new SrgWriter(Files.newBufferedWriter(srgFile))) { + try (TinyMappingsReader reader = new TinyMappingsReader(mappings, "srg", "named")) { + writer.write(reader.read()); + } + } + } +} |