From deecd6c6f872f2855a879d8006dfb97f63134f84 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Sat, 20 May 2023 11:19:33 -0700 Subject: [PATCH] Support JS dependency embedding on Emscripten output --- templates/emscripten/output.js | 3 ++ templates/emscripten/template/index.html | 1 - tools/platforms/EmscriptenPlatform.hx | 38 ++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 templates/emscripten/output.js diff --git a/templates/emscripten/output.js b/templates/emscripten/output.js new file mode 100644 index 000000000..f452049f3 --- /dev/null +++ b/templates/emscripten/output.js @@ -0,0 +1,3 @@ +::SOURCE_FILE:: +::if embeddedLibraries::::foreach (embeddedLibraries):: +::__current__::::end::::end:: \ No newline at end of file diff --git a/templates/emscripten/template/index.html b/templates/emscripten/template/index.html index 747566187..57bbeea72 100644 --- a/templates/emscripten/template/index.html +++ b/templates/emscripten/template/index.html @@ -65,7 +65,6 @@ }, true);::end::::end:: - ::if DEBUG::::end:: diff --git a/tools/platforms/EmscriptenPlatform.hx b/tools/platforms/EmscriptenPlatform.hx index 3b7e219f9..51396756c 100644 --- a/tools/platforms/EmscriptenPlatform.hx +++ b/tools/platforms/EmscriptenPlatform.hx @@ -23,6 +23,7 @@ import sys.FileSystem; class EmscriptenPlatform extends PlatformTarget { + private var dependencyPath:String; private var outputFile:String; public function new(command:String, _project:HXProject, targetFlags:Map) @@ -94,6 +95,7 @@ class EmscriptenPlatform extends PlatformTarget project = defaults; targetDirectory = Path.combine(project.app.path, project.config.getString("emscripten.output-directory", "emscripten")); + dependencyPath = project.config.getString("emscripten.dependency-path", "lib"); outputFile = targetDirectory + "/bin/" + project.app.file + ".js"; } @@ -262,6 +264,24 @@ class EmscriptenPlatform extends PlatformTarget System.runCommand(targetDirectory + "/obj", "emcc", args, true, false, true); + if (FileSystem.exists(outputFile)) + { + var context = project.templateContext; + context.SOURCE_FILE = File.getContent(outputFile); + context.embeddedLibraries = []; + + for (dependency in project.dependencies) + { + if (dependency.embed && StringTools.endsWith(dependency.path, ".js") && FileSystem.exists(dependency.path)) + { + var script = File.getContent(dependency.path); + context.embeddedLibraries.push(script); + } + } + + System.copyFileTemplate(project.templatePaths, "emscripten/output.js", outputFile, context); + } + if (project.targetFlags.exists("minify")) { HTML5Helper.minify(project, targetDirectory + "/bin/" + project.app.file + ".js"); @@ -409,6 +429,24 @@ class EmscriptenPlatform extends PlatformTarget context.favicons.push({rel: "shortcut icon", type: "image/png", href: "./favicon.png"}); } + for (dependency in project.dependencies) + { + if (!dependency.embed) + { + if (StringTools.endsWith(dependency.name, ".js")) + { + context.linkedLibraries.push(dependency.name); + } + else if (StringTools.endsWith(dependency.path, ".js") && FileSystem.exists(dependency.path)) + { + var name = Path.withoutDirectory(dependency.path); + + context.linkedLibraries.push("./" + dependencyPath + "/" + name); + System.copyIfNewer(dependency.path, Path.combine(destination, Path.combine(dependencyPath, name))); + } + } + } + for (asset in project.assets) { var path = Path.combine(targetDirectory + "/obj/assets", asset.targetPath);