wasm gc: improve gradle plugin settings

This commit is contained in:
Alexey Andreev 2024-10-15 15:15:46 +02:00
parent 312d8abee8
commit 1fadc71536
15 changed files with 164 additions and 54 deletions

View File

@ -50,7 +50,7 @@ val jsOutputPackageDir = jsOutputDir.map { it.dir("org/teavm/backend/wasm") }
val jsInputDir = layout.projectDirectory.dir("src/main/js/wasm-gc-runtime") val jsInputDir = layout.projectDirectory.dir("src/main/js/wasm-gc-runtime")
val jsInput = jsInputDir.file("runtime.js") val jsInput = jsInputDir.file("runtime.js")
fun registerRuntimeTasks(taskName: String, wrapperType: String, outputName: String) { fun registerRuntimeTasks(taskName: String, wrapperType: String, outputName: String, module: Boolean) {
val generateTask by tasks.register<DefaultTask>("generate${taskName}Runtime") { val generateTask by tasks.register<DefaultTask>("generate${taskName}Runtime") {
dependsOn(tasks.npmInstall) dependsOn(tasks.npmInstall)
val wrapperFile = jsInputDir.file(wrapperType) val wrapperFile = jsInputDir.file(wrapperType)
@ -80,7 +80,9 @@ fun registerRuntimeTasks(taskName: String, wrapperType: String, outputName: Stri
args.addAll(provider { args.addAll(provider {
listOf( listOf(
"--", "--",
"-m", "--module", "--toplevel", "-m", "--toplevel",
*(if (module) arrayOf("--module") else emptyArray()),
"--mangle", "reserved=['TeaVM']",
inputFiles.singleFile.absolutePath, inputFiles.singleFile.absolutePath,
"-o", outputFile.get().asFile.absolutePath "-o", outputFile.get().asFile.absolutePath
) )
@ -93,8 +95,8 @@ fun registerRuntimeTasks(taskName: String, wrapperType: String, outputName: Stri
} }
} }
registerRuntimeTasks("Simple", "simple-wrapper.js", "wasm-gc-runtime") registerRuntimeTasks("Simple", "simple-wrapper.js", "wasm-gc-runtime", module = false)
registerRuntimeTasks("Module", "module-wrapper.js", "wasm-gc-module-runtime") registerRuntimeTasks("Module", "module-wrapper.js", "wasm-gc-module-runtime", module = true)
teavmPublish { teavmPublish {
artifactId = "teavm-core" artifactId = "teavm-core"

View File

@ -371,7 +371,7 @@ public class WasmGCTarget implements TeaVMTarget, TeaVMWasmGCHost {
null, null, debugLines, null, WasmBinaryStatsCollector.EMPTY); null, null, debugLines, null, WasmBinaryStatsCollector.EMPTY);
optimizeIndexes(module); optimizeIndexes(module);
module.prepareForRendering(); module.prepareForRendering();
if (debugLocation == WasmDebugInfoLocation.EMBEDDED) { if (debugLocation == WasmDebugInfoLocation.EMBEDDED && debugInfo) {
binaryRenderer.render(module, debugInfoBuilder::build); binaryRenderer.render(module, debugInfoBuilder::build);
} else { } else {
binaryRenderer.render(module); binaryRenderer.render(module);
@ -380,7 +380,7 @@ public class WasmGCTarget implements TeaVMTarget, TeaVMWasmGCHost {
try (var output = buildTarget.createResource(outputName)) { try (var output = buildTarget.createResource(outputName)) {
output.write(data); output.write(data);
} }
if (debugLocation == WasmDebugInfoLocation.EXTERNAL) { if (debugLocation == WasmDebugInfoLocation.EXTERNAL && debugInfo) {
var debugInfoData = ExternalDebugFile.write(debugInfoBuilder.build()); var debugInfoData = ExternalDebugFile.write(debugInfoBuilder.build());
if (debugInfoData != null) { if (debugInfoData != null) {
try (var output = buildTarget.createResource(outputName + ".teadbg")) { try (var output = buildTarget.createResource(outputName + ".teadbg")) {

View File

@ -54,7 +54,7 @@ teavm {
wasmGC { wasmGC {
addedToWebApp = true addedToWebApp = true
mainClass = "org.teavm.samples.benchmark.teavm.BenchmarkStarter" mainClass = "org.teavm.samples.benchmark.teavm.BenchmarkStarter"
sourceMap = true debugInformation = true
} }
wasm { wasm {
addedToWebApp = true addedToWebApp = true

View File

@ -22,7 +22,11 @@
</head> </head>
<script type="text/javascript"> <script type="text/javascript">
function launch() { function launch() {
TeaVM.wasmGC.load("wasm-gc/benchmark.wasm").then(teavm => teavm.exports.main([])); TeaVM.wasmGC.load("wasm-gc/benchmark.wasm", {
stackDeobfuscator: {
enabled: true
}
}).then(teavm => teavm.exports.main([]));
} }
</script> </script>
<body onload="launch()"> <body onload="launch()">

View File

@ -16,9 +16,10 @@
plugins { plugins {
`java-library` `java-library`
`teavm-publish`
} }
description = "JavaScript deobfuscator" description = "WebAssembly deobfuscator"
configurations { configurations {
val teavmCompile = create("teavmCompile") val teavmCompile = create("teavmCompile")
@ -42,21 +43,18 @@ val generateWasm by tasks.register<JavaExec>("generateWasm") {
mainClass = "org.teavm.tooling.deobfuscate.wasmgc.Compiler" mainClass = "org.teavm.tooling.deobfuscate.wasmgc.Compiler"
args( args(
"org.teavm.tooling.deobfuscate.wasmgc.DeobfuscatorFactory", "org.teavm.tooling.deobfuscate.wasmgc.DeobfuscatorFactory",
layout.buildDirectory.dir("teavm").get().asFile.absolutePath, layout.buildDirectory.dir("teavm/org/teavm/backend/wasm/").get().asFile.absolutePath,
"deobfuscator.wasm" "deobfuscator.wasm"
) )
} }
val zipWithWasm by tasks.register<Jar>("zipWithWasm") { tasks.withType<Jar> {
dependsOn(generateWasm) dependsOn(generateWasm)
archiveClassifier = "wasm" from(layout.buildDirectory.dir("teavm"))
from(layout.buildDirectory.dir("teavm"), layout.buildDirectory.dir("teavm-lib")) include("**/*.wasm")
include("*.wasm") includeEmptyDirs = false
entryCompression = ZipEntryCompression.DEFLATED
} }
tasks.assemble.configure { teavmPublish {
dependsOn(zipWithWasm) artifactId = "teavm-wasm-gc-deobfuscator"
} }
artifacts.add("wasm", zipWithWasm)

View File

@ -26,6 +26,7 @@ description = "TeaVM Gradle plugin"
dependencies { dependencies {
implementation(project(":core")) implementation(project(":core"))
implementation(project(":tools:core")) implementation(project(":tools:core"))
implementation(project(":tools:deobfuscator-wasm-gc"))
} }
gradlePlugin { gradlePlugin {

View File

@ -80,7 +80,7 @@ class TeaVMExtensionImpl extends TeaVMBaseExtensionImpl implements TeaVMExtensio
.orElse(OptimizationLevel.BALANCED)); .orElse(OptimizationLevel.BALANCED));
js.getSourceFilePolicy().convention(property("js.sourceFilePolicy") js.getSourceFilePolicy().convention(property("js.sourceFilePolicy")
.map(SourceFilePolicy::valueOf) .map(SourceFilePolicy::valueOf)
.orElse(SourceFilePolicy.DO_NOTHING)); .orElse(SourceFilePolicy.LINK_LOCAL_FILES));
js.getDevServer().getStackDeobfuscated().convention(property("js.devServer.stackDeobfuscated") js.getDevServer().getStackDeobfuscated().convention(property("js.devServer.stackDeobfuscated")
.map(Boolean::parseBoolean)); .map(Boolean::parseBoolean));
js.getDevServer().getIndicator().convention(property("js.devServer.indicator").map(Boolean::parseBoolean)); js.getDevServer().getIndicator().convention(property("js.devServer.indicator").map(Boolean::parseBoolean));
@ -120,6 +120,11 @@ class TeaVMExtensionImpl extends TeaVMBaseExtensionImpl implements TeaVMExtensio
wasmGC.getDebugInfoLevel().convention(property("wasm-gc.debugInformation.level") wasmGC.getDebugInfoLevel().convention(property("wasm-gc.debugInformation.level")
.map(v -> WasmDebugInfoLevel.valueOf(v.toUpperCase())).orElse(WasmDebugInfoLevel.DEOBFUSCATION)); .map(v -> WasmDebugInfoLevel.valueOf(v.toUpperCase())).orElse(WasmDebugInfoLevel.DEOBFUSCATION));
wasmGC.getSourceMap().convention(property("wasm-gc.sourceMap").map(Boolean::parseBoolean).orElse(false)); wasmGC.getSourceMap().convention(property("wasm-gc.sourceMap").map(Boolean::parseBoolean).orElse(false));
wasmGC.getSourceFilePolicy().convention(property("wasm-gc.sourceFilePolicy")
.map(SourceFilePolicy::valueOf)
.orElse(SourceFilePolicy.LINK_LOCAL_FILES));
wasmGC.getModularRuntime().convention(property("wasm-gc.modularRuntime")
.map(Boolean::parseBoolean).orElse(false));
} }
private void setupWasiDefaults() { private void setupWasiDefaults() {

View File

@ -57,6 +57,7 @@ public class TeaVMPlugin implements Plugin<Project> {
public static final String WASM_TASK_NAME = "generateWasm"; public static final String WASM_TASK_NAME = "generateWasm";
public static final String WASI_TASK_NAME = "generateWasi"; public static final String WASI_TASK_NAME = "generateWasi";
public static final String WASM_GC_TASK_NAME = "generateWasmGC"; public static final String WASM_GC_TASK_NAME = "generateWasmGC";
public static final String BUILD_WASM_GC_TASK_NAME = "buildWasmGC";
public static final String WASM_GC_COPY_RUNTIME_TASK_NAME = "copyWasmGCRuntime"; public static final String WASM_GC_COPY_RUNTIME_TASK_NAME = "copyWasmGCRuntime";
public static final String WASM_GC_DISASSEMBLY_TASK_NAME = "disasmWasmGC"; public static final String WASM_GC_DISASSEMBLY_TASK_NAME = "disasmWasmGC";
public static final String C_TASK_NAME = "generateC"; public static final String C_TASK_NAME = "generateC";
@ -219,6 +220,9 @@ public class TeaVMPlugin implements Plugin<Project> {
private void registerWasmGCTask(Project project, Configuration configuration) { private void registerWasmGCTask(Project project, Configuration configuration) {
var extension = project.getExtensions().getByType(TeaVMExtension.class); var extension = project.getExtensions().getByType(TeaVMExtension.class);
var buildTask = project.getTasks().create(BUILD_WASM_GC_TASK_NAME, task -> {
task.setGroup(TASK_GROUP);
});
project.getTasks().create(WASM_GC_TASK_NAME, GenerateWasmGCTask.class, task -> { project.getTasks().create(WASM_GC_TASK_NAME, GenerateWasmGCTask.class, task -> {
var wasmGC = extension.getWasmGC(); var wasmGC = extension.getWasmGC();
applyToTask(wasmGC, task, configuration); applyToTask(wasmGC, task, configuration);
@ -226,6 +230,9 @@ public class TeaVMPlugin implements Plugin<Project> {
task.getObfuscated().convention(wasmGC.getObfuscated()); task.getObfuscated().convention(wasmGC.getObfuscated());
task.getStrict().convention(wasmGC.getStrict()); task.getStrict().convention(wasmGC.getStrict());
task.getSourceMap().convention(wasmGC.getSourceMap()); task.getSourceMap().convention(wasmGC.getSourceMap());
task.getSourceFilePolicy().convention(wasmGC.getSourceFilePolicy());
setupSources(task.getSourceFiles(), project);
buildTask.dependsOn(task);
}); });
project.getTasks().create(WASM_GC_COPY_RUNTIME_TASK_NAME, CopyWasmGCRuntimeTask.class, task -> { project.getTasks().create(WASM_GC_COPY_RUNTIME_TASK_NAME, CopyWasmGCRuntimeTask.class, task -> {
task.setGroup(TASK_GROUP); task.setGroup(TASK_GROUP);
@ -234,6 +241,15 @@ public class TeaVMPlugin implements Plugin<Project> {
task.getOutputFile().convention(extension.getWasmGC().getOutputDir() task.getOutputFile().convention(extension.getWasmGC().getOutputDir()
.flatMap(d -> d.dir(extension.getWasmGC().getRelativePathInOutputDir())) .flatMap(d -> d.dir(extension.getWasmGC().getRelativePathInOutputDir()))
.flatMap(d -> d.file(fileName))); .flatMap(d -> d.file(fileName)));
task.getDeobfuscator().convention(extension.getWasmGC().getDebugInformation());
var deobfuscatorFileName = extension.getWasmGC().getTargetFileName()
.map(x -> x + "-deobfuscator.wasm");
task.getDeobfuscatorOutputFile().convention(extension.getWasmGC().getOutputDir()
.flatMap(d -> d.dir(extension.getWasmGC().getRelativePathInOutputDir()))
.flatMap(d -> d.file(deobfuscatorFileName)));
task.getModular().convention(extension.getWasmGC().getModularRuntime());
task.getObfuscated().convention(extension.getWasmGC().getObfuscated());
buildTask.dependsOn(task);
}); });
project.getTasks().create(WASM_GC_DISASSEMBLY_TASK_NAME, DisasmWebAssemblyTask.class, task -> { project.getTasks().create(WASM_GC_DISASSEMBLY_TASK_NAME, DisasmWebAssemblyTask.class, task -> {
task.setGroup(TASK_GROUP); task.setGroup(TASK_GROUP);
@ -251,7 +267,9 @@ public class TeaVMPlugin implements Plugin<Project> {
}); });
task.getOutputFile().convention(project.getLayout().dir(genTask.getOutputDir()) task.getOutputFile().convention(project.getLayout().dir(genTask.getOutputDir())
.flatMap(d -> d.file(fileName))); .flatMap(d -> d.file(fileName)));
buildTask.dependsOn(task);
}); });
} }
private void registerCTask(Project project, Configuration configuration) { private void registerCTask(Project project, Configuration configuration) {
@ -301,9 +319,7 @@ public class TeaVMPlugin implements Plugin<Project> {
})); }));
} }
if (wasmGCAddedToWebApp) { if (wasmGCAddedToWebApp) {
task.dependsOn(project.getTasks().named(WASM_GC_TASK_NAME)); task.dependsOn(project.getTasks().named(BUILD_WASM_GC_TASK_NAME));
task.dependsOn(project.getTasks().named(WASM_GC_COPY_RUNTIME_TASK_NAME));
task.dependsOn(project.getTasks().named(WASM_GC_DISASSEMBLY_TASK_NAME));
var outDir = extension.getWasmGC().getOutputDir(); var outDir = extension.getWasmGC().getOutputDir();
var relPath = extension.getWasmGC().getRelativePathInOutputDir(); var relPath = extension.getWasmGC().getRelativePathInOutputDir();
task.with(project.copySpec(spec -> { task.with(project.copySpec(spec -> {

View File

@ -33,4 +33,8 @@ public interface TeaVMWasmGCConfiguration extends TeaVMCommonConfiguration, TeaV
Property<WasmDebugInfoLevel> getDebugInfoLevel(); Property<WasmDebugInfoLevel> getDebugInfoLevel();
Property<Boolean> getSourceMap(); Property<Boolean> getSourceMap();
Property<SourceFilePolicy> getSourceFilePolicy();
Property<Boolean> getModularRuntime();
} }

View File

@ -20,20 +20,56 @@ import java.nio.file.Files;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import org.gradle.api.DefaultTask; import org.gradle.api.DefaultTask;
import org.gradle.api.file.RegularFileProperty; import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.provider.Property;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskAction;
public abstract class CopyWasmGCRuntimeTask extends DefaultTask { public abstract class CopyWasmGCRuntimeTask extends DefaultTask {
public CopyWasmGCRuntimeTask() {
getModular().convention(false);
getObfuscated().convention(true);
getDeobfuscator().convention(false);
}
@Input
public abstract Property<Boolean> getModular();
@Input
public abstract Property<Boolean> getObfuscated();
@OutputFile @OutputFile
public abstract RegularFileProperty getOutputFile(); public abstract RegularFileProperty getOutputFile();
@Input
public abstract Property<Boolean> getDeobfuscator();
@OutputFile
public abstract RegularFileProperty getDeobfuscatorOutputFile();
@TaskAction @TaskAction
public void copyRuntime() throws IOException { public void copyRuntime() throws IOException {
var resourceName = "org/teavm/backend/wasm/wasm-gc-runtime.min.js"; var name = new StringBuilder("wasm-gc");
if (getModular().get()) {
name.append("-modular");
}
name.append("-runtime");
if (getObfuscated().get()) {
name.append(".min");
}
var resourceName = "org/teavm/backend/wasm/" + name + ".js";
var classLoader = CopyWasmGCRuntimeTask.class.getClassLoader(); var classLoader = CopyWasmGCRuntimeTask.class.getClassLoader();
var output = getOutputFile().get().getAsFile(); var output = getOutputFile().get().getAsFile();
try (var input = classLoader.getResourceAsStream(resourceName)) { try (var input = classLoader.getResourceAsStream(resourceName)) {
Files.copy(input, output.toPath(), StandardCopyOption.REPLACE_EXISTING); Files.copy(input, output.toPath(), StandardCopyOption.REPLACE_EXISTING);
} }
if (getDeobfuscator().get()) {
resourceName = "org/teavm/backend/wasm/deobfuscator.wasm";
output = getDeobfuscatorOutputFile().get().getAsFile();
try (var input = classLoader.getResourceAsStream(resourceName)) {
Files.copy(input, output.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
}
} }
} }

View File

@ -22,7 +22,6 @@ import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.Optional;
import org.teavm.gradle.api.JSModuleType; import org.teavm.gradle.api.JSModuleType;
import org.teavm.gradle.api.SourceFilePolicy; import org.teavm.gradle.api.SourceFilePolicy;
import org.teavm.tooling.TeaVMSourceFilePolicy;
import org.teavm.tooling.TeaVMTargetType; import org.teavm.tooling.TeaVMTargetType;
import org.teavm.tooling.builder.BuildStrategy; import org.teavm.tooling.builder.BuildStrategy;
@ -32,7 +31,7 @@ public abstract class GenerateJavaScriptTask extends TeaVMTask {
getStrict().convention(false); getStrict().convention(false);
getModuleType().convention(JSModuleType.UMD); getModuleType().convention(JSModuleType.UMD);
getSourceMap().convention(false); getSourceMap().convention(false);
getSourceFilePolicy().convention(SourceFilePolicy.DO_NOTHING); getSourceFilePolicy().convention(SourceFilePolicy.LINK_LOCAL_FILES);
getEntryPointName().convention("main"); getEntryPointName().convention("main");
} }
@ -91,25 +90,7 @@ public abstract class GenerateJavaScriptTask extends TeaVMTask {
} }
builder.setSourceMapsFileGenerated(getSourceMap().get()); builder.setSourceMapsFileGenerated(getSourceMap().get());
builder.setEntryPointName(getEntryPointName().get()); builder.setEntryPointName(getEntryPointName().get());
for (var file : getSourceFiles()) { TaskUtils.applySourceFiles(getSourceFiles(), builder);
if (file.isFile()) { TaskUtils.applySourceFilePolicy(getSourceFilePolicy(), builder);
if (file.getName().endsWith(".jar") || file.getName().endsWith(".zip")) {
builder.addSourcesJar(file.getAbsolutePath());
}
} else if (file.isDirectory()) {
builder.addSourcesDirectory(file.getAbsolutePath());
}
}
switch (getSourceFilePolicy().get()) {
case DO_NOTHING:
builder.setSourceFilePolicy(TeaVMSourceFilePolicy.DO_NOTHING);
break;
case COPY:
builder.setSourceFilePolicy(TeaVMSourceFilePolicy.COPY);
break;
case LINK_LOCAL_FILES:
builder.setSourceFilePolicy(TeaVMSourceFilePolicy.LINK_LOCAL_FILES);
break;
}
} }
} }

View File

@ -15,8 +15,12 @@
*/ */
package org.teavm.gradle.tasks; package org.teavm.gradle.tasks;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.provider.Property; import org.gradle.api.provider.Property;
import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Optional;
import org.teavm.gradle.api.SourceFilePolicy;
import org.teavm.gradle.api.WasmDebugInfoLevel; import org.teavm.gradle.api.WasmDebugInfoLevel;
import org.teavm.gradle.api.WasmDebugInfoLocation; import org.teavm.gradle.api.WasmDebugInfoLocation;
import org.teavm.tooling.TeaVMTargetType; import org.teavm.tooling.TeaVMTargetType;
@ -26,10 +30,10 @@ public abstract class GenerateWasmGCTask extends TeaVMTask {
public GenerateWasmGCTask() { public GenerateWasmGCTask() {
getStrict().convention(true); getStrict().convention(true);
getObfuscated().convention(true); getObfuscated().convention(true);
getDebugInfo().convention(true);
getDebugInfoLevel().convention(WasmDebugInfoLevel.DEOBFUSCATION); getDebugInfoLevel().convention(WasmDebugInfoLevel.DEOBFUSCATION);
getDebugInfoLocation().convention(WasmDebugInfoLocation.EXTERNAL); getDebugInfoLocation().convention(WasmDebugInfoLocation.EXTERNAL);
getSourceMap().convention(false); getSourceMap().convention(false);
getSourceFilePolicy().convention(SourceFilePolicy.LINK_LOCAL_FILES);
} }
@Input @Input
@ -38,9 +42,6 @@ public abstract class GenerateWasmGCTask extends TeaVMTask {
@Input @Input
public abstract Property<Boolean> getObfuscated(); public abstract Property<Boolean> getObfuscated();
@Input
public abstract Property<Boolean> getDebugInfo();
@Input @Input
public abstract Property<WasmDebugInfoLevel> getDebugInfoLevel(); public abstract Property<WasmDebugInfoLevel> getDebugInfoLevel();
@ -50,11 +51,18 @@ public abstract class GenerateWasmGCTask extends TeaVMTask {
@Input @Input
public abstract Property<Boolean> getSourceMap(); public abstract Property<Boolean> getSourceMap();
@InputFiles
public abstract ConfigurableFileCollection getSourceFiles();
@Input
@Optional
public abstract Property<SourceFilePolicy> getSourceFilePolicy();
@Override @Override
protected void setupBuilder(BuildStrategy builder) { protected void setupBuilder(BuildStrategy builder) {
builder.setStrict(getStrict().get()); builder.setStrict(getStrict().get());
builder.setObfuscated(getObfuscated().get()); builder.setObfuscated(getObfuscated().get());
builder.setDebugInformationGenerated(getDebugInfo().get()); builder.setDebugInformationGenerated(getDebugInformation().get());
builder.setSourceMapsFileGenerated(getSourceMap().get()); builder.setSourceMapsFileGenerated(getSourceMap().get());
switch (getDebugInfoLevel().get()) { switch (getDebugInfoLevel().get()) {
case FULL: case FULL:
@ -73,5 +81,7 @@ public abstract class GenerateWasmGCTask extends TeaVMTask {
break; break;
} }
builder.setTargetType(TeaVMTargetType.WEBASSEMBLY_GC); builder.setTargetType(TeaVMTargetType.WEBASSEMBLY_GC);
TaskUtils.applySourceFiles(getSourceFiles(), builder);
TaskUtils.applySourceFilePolicy(getSourceFilePolicy(), builder);
} }
} }

View File

@ -0,0 +1,53 @@
/*
* Copyright 2024 konsoletyper.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.gradle.tasks;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.provider.Property;
import org.teavm.gradle.api.SourceFilePolicy;
import org.teavm.tooling.TeaVMSourceFilePolicy;
import org.teavm.tooling.builder.BuildStrategy;
final class TaskUtils {
private TaskUtils() {
}
static void applySourceFiles(ConfigurableFileCollection sourceFiles, BuildStrategy builder) {
for (var file : sourceFiles) {
if (file.isFile()) {
if (file.getName().endsWith(".jar") || file.getName().endsWith(".zip")) {
builder.addSourcesJar(file.getAbsolutePath());
}
} else if (file.isDirectory()) {
builder.addSourcesDirectory(file.getAbsolutePath());
}
}
}
static void applySourceFilePolicy(Property<SourceFilePolicy> policy, BuildStrategy builder) {
switch (policy.get()) {
case DO_NOTHING:
builder.setSourceFilePolicy(TeaVMSourceFilePolicy.DO_NOTHING);
break;
case COPY:
builder.setSourceFilePolicy(TeaVMSourceFilePolicy.COPY);
break;
case LINK_LOCAL_FILES:
builder.setSourceFilePolicy(TeaVMSourceFilePolicy.LINK_LOCAL_FILES);
break;
}
}
}

View File

@ -31,7 +31,7 @@ dependencies {
implementation(project(":core")) implementation(project(":core"))
implementation(project(":tools:core")) implementation(project(":tools:core"))
implementation(project(":tools:browser-runner")) implementation(project(":tools:browser-runner"))
runtimeOnly(project(":tools:deobfuscator-wasm-gc", "wasm")) runtimeOnly(project(":tools:deobfuscator-wasm-gc"))
} }
teavmPublish { teavmPublish {

View File

@ -169,7 +169,7 @@ class WebAssemblyGCPlatformSupport extends TestPlatformSupport<WasmGCTarget> {
getExtension() + "-deobfuscator.wasm"); getExtension() + "-deobfuscator.wasm");
try { try {
TestUtil.resourceToFile("org/teavm/backend/wasm/wasm-gc-runtime.js", testPath, Map.of()); TestUtil.resourceToFile("org/teavm/backend/wasm/wasm-gc-runtime.js", testPath, Map.of());
TestUtil.resourceToFile("deobfuscator.wasm", testDeobfuscatorPath, Map.of()); TestUtil.resourceToFile("org/teavm/backend/wasm/deobfuscator.wasm", testDeobfuscatorPath, Map.of());
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }