From 495ca901a6c6c7130683dc88444edee2efb2c912 Mon Sep 17 00:00:00 2001 From: Mathias Westerdahl Date: Thu, 29 Jun 2017 09:50:49 +0200 Subject: [PATCH] DEF-2731 Added Win32 support (#48) * Initial Win32 support * Updated Docker files to download windows packages * DEF-2731 Win32 support added * Added missing test files * Added Win32 manifest support * Merging of all contexts (main, platform, user) * Review cleanup --- .gitignore | 3 +- server/docker-base/Dockerfile | 66 +++++-- server/docker/Dockerfile | 3 +- .../java/com/defold/extender/Extender.java | 173 ++++++++++++------ .../defold/extender/ExtenderController.java | 24 +-- .../com/defold/extender/ExtenderUtil.java | 16 ++ .../com/defold/extender/PlatformConfig.java | 8 +- .../com/defold/extender/ProcessExecutor.java | 14 +- .../com/defold/extender/ExtenderTest.java | 29 ++- .../com/defold/extender/IntegrationTest.java | 26 ++- server/test-data/build-libs.sh | 10 +- server/test-data/compile.sh | 52 +++++- server/test-data/enginelibs/engine_main.cpp | 2 +- server/test-data/ext/lib/arm64-ios/libalib.a | Bin 592 -> 592 bytes .../test-data/ext/lib/armv7-android/libalib.a | Bin 3120 -> 3120 bytes server/test-data/ext/lib/armv7-ios/libalib.a | Bin 520 -> 520 bytes server/test-data/ext/lib/js-web/libalib.a | Bin 1366 -> 1366 bytes server/test-data/ext/lib/x86-osx/libalib.a | Bin 536 -> 536 bytes server/test-data/ext/lib/x86-win32/alib.lib | Bin 0 -> 8380 bytes server/test-data/ext/lib/x86_64-osx/libalib.a | Bin 704 -> 704 bytes .../test-data/ext/lib/x86_64-win32/alib.lib | Bin 0 -> 8258 bytes server/test-data/ext2/lib/arm64-ios/libalib.a | Bin 592 -> 592 bytes server/test-data/ext2/lib/arm64-ios/libblib.a | Bin 728 -> 728 bytes .../ext2/lib/armv7-android/libalib.a | Bin 3120 -> 3120 bytes .../ext2/lib/armv7-android/libblib.a | Bin 3982 -> 3982 bytes server/test-data/ext2/lib/armv7-ios/libalib.a | Bin 520 -> 520 bytes server/test-data/ext2/lib/armv7-ios/libblib.a | Bin 632 -> 632 bytes server/test-data/ext2/lib/js-web/libalib.a | Bin 1366 -> 1366 bytes server/test-data/ext2/lib/js-web/libblib.a | Bin 1816 -> 1816 bytes server/test-data/ext2/lib/x86-osx/libalib.a | Bin 536 -> 536 bytes server/test-data/ext2/lib/x86-osx/libblib.a | Bin 664 -> 664 bytes server/test-data/ext2/lib/x86-win32/alib.lib | Bin 0 -> 8380 bytes server/test-data/ext2/lib/x86-win32/blib.lib | Bin 0 -> 9120 bytes .../test-data/ext2/lib/x86_64-osx/libalib.a | Bin 704 -> 704 bytes .../test-data/ext2/lib/x86_64-osx/libblib.a | Bin 984 -> 984 bytes .../test-data/ext2/lib/x86_64-win32/alib.lib | Bin 0 -> 8258 bytes .../test-data/ext2/lib/x86_64-win32/blib.lib | Bin 0 -> 8912 bytes .../sdk/a/defoldsdk/extender/build.yml | 105 +++++++---- .../a/defoldsdk/lib/js-web/libengine_foo.a | Bin 0 -> 1364 bytes .../a/defoldsdk/lib/js-web/libengine_main.a | Bin 0 -> 1392 bytes .../a/defoldsdk/lib/x86-win32/engine_foo.lib | Bin 0 -> 8390 bytes .../a/defoldsdk/lib/x86-win32/engine_main.lib | Bin 0 -> 8448 bytes .../defoldsdk/lib/x86_64-win32/engine_foo.lib | Bin 0 -> 8304 bytes .../lib/x86_64-win32/engine_main.lib | Bin 0 -> 8360 bytes .../ext/lib/arm64-ios/libalib.a | Bin 912 -> 912 bytes .../ext/lib/armv7-android/libalib.a | Bin 4960 -> 4960 bytes .../ext/lib/armv7-ios/libalib.a | Bin 912 -> 912 bytes .../ext/lib/js-web/libalib.a | Bin 1594 -> 1594 bytes .../ext/lib/x86-osx/libalib.a | Bin 904 -> 904 bytes .../ext/lib/x86-win32/alib.lib | Bin 0 -> 9784 bytes .../ext/lib/x86_64-osx/libalib.a | Bin 1192 -> 1192 bytes .../ext/lib/x86_64-win32/alib.lib | Bin 0 -> 9510 bytes .../ext2/lib/arm64-ios/libblib.a | Bin 1336 -> 1336 bytes .../ext2/lib/armv7-android/libblib.a | Bin 6646 -> 6646 bytes .../ext2/lib/armv7-ios/libblib.a | Bin 1200 -> 1200 bytes .../ext2/lib/js-web/libblib.a | Bin 1860 -> 1860 bytes .../ext2/lib/x86-osx/libblib.a | Bin 1200 -> 1200 bytes .../ext2/lib/x86-win32/blib.lib | Bin 0 -> 11152 bytes .../ext2/lib/x86_64-osx/libblib.a | Bin 1640 -> 1640 bytes .../ext2/lib/x86_64-win32/blib.lib | Bin 0 -> 10698 bytes 60 files changed, 374 insertions(+), 157 deletions(-) create mode 100644 server/test-data/ext/lib/x86-win32/alib.lib create mode 100644 server/test-data/ext/lib/x86_64-win32/alib.lib create mode 100644 server/test-data/ext2/lib/x86-win32/alib.lib create mode 100644 server/test-data/ext2/lib/x86-win32/blib.lib create mode 100644 server/test-data/ext2/lib/x86_64-win32/alib.lib create mode 100644 server/test-data/ext2/lib/x86_64-win32/blib.lib create mode 100644 server/test-data/sdk/a/defoldsdk/lib/js-web/libengine_foo.a create mode 100644 server/test-data/sdk/a/defoldsdk/lib/js-web/libengine_main.a create mode 100644 server/test-data/sdk/a/defoldsdk/lib/x86-win32/engine_foo.lib create mode 100644 server/test-data/sdk/a/defoldsdk/lib/x86-win32/engine_main.lib create mode 100644 server/test-data/sdk/a/defoldsdk/lib/x86_64-win32/engine_foo.lib create mode 100644 server/test-data/sdk/a/defoldsdk/lib/x86_64-win32/engine_main.lib create mode 100644 server/test-data/testproject_appmanifest/ext/lib/x86-win32/alib.lib create mode 100644 server/test-data/testproject_appmanifest/ext/lib/x86_64-win32/alib.lib create mode 100644 server/test-data/testproject_appmanifest/ext2/lib/x86-win32/blib.lib create mode 100644 server/test-data/testproject_appmanifest/ext2/lib/x86_64-win32/blib.lib diff --git a/.gitignore b/.gitignore index 985acf46..6ffad943 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /.gradle /.idea /tmp -server/test-data/sdk/** +!server/test-data/sdk/ +server/test-data/sdk/* !server/test-data/sdk/a diff --git a/server/docker-base/Dockerfile b/server/docker-base/Dockerfile index f75f398c..5bd66196 100644 --- a/server/docker-base/Dockerfile +++ b/server/docker-base/Dockerfile @@ -10,7 +10,6 @@ RUN \ echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ apt-get install -y --no-install-recommends \ oracle-java8-installer \ - wine \ gcc \ g++ \ libssl-dev \ @@ -70,16 +69,7 @@ ENV S3_URL https://s3-eu-west-1.amazonaws.com/defold-packages RUN wget -q -O - ${S3_URL}/clang%2Bllvm-3.9.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz | tar xJ -C /usr/local --strip-components=1 -# Windows -ENV PROGRAM_FILES "/root/.wine/drive_c/Program Files" - -RUN \ - mkdir -p "/root/.wine/drive_c/windows/system32" && \ - wget -P /usr/bin ${S3_URL}/prepreg-vc10-dx09-32.exe && \ - ls /root/.wine/drive_c/windows/system32 && \ - mkdir -p "${PROGRAM_FILES}" && \ - wget -q -O - ${S3_URL}/Microsoft-Visual-Studio-10.0.tar.gz | tar xz -C "${PROGRAM_FILES}" - +# Darwin RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en @@ -139,3 +129,57 @@ RUN \ sed '/TEMP_DIR =/d' ${EMSCRIPTEN_CONFIG} && \ echo TEMP_DIR = \'/var/extender/builds\' >> ${EMSCRIPTEN_CONFIG} && \ chmod -R 755 ${EMSCRIPTEN_HOME} + + +# Windows +RUN \ + apt-get install apt-transport-https + +# According to some notes, wine 1.8 is needed for Visual Studio 2015, and Ubuntu 14 only has wine 1.4 +RUN \ + wget https://dl.winehq.org/wine-builds/Release.key && \ + apt-key add Release.key && \ + rm Release.key && \ + apt-add-repository https://dl.winehq.org/wine-builds/ubuntu/ && \ + dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get install -y --install-recommends wine-devel + +ENV PATH ${PATH}:/opt/wine-devel/bin + +ENV PROGRAM_FILES "C:/Program Files (x86)" + +# Grabbed after a call to /bin/x86_amd64\vcvarsx86_amd64.bat (Can probably be trimmed further) +ENV VS140COMNTOOLS "${PROGRAM_FILES}/Microsoft Visual Studio 14.0/Common7/Tools/" +ENV VCINSTALLDIR "${PROGRAM_FILES}/Microsoft Visual Studio 14.0/VC/" +ENV VSINSTALLDIR "${PROGRAM_FILES}/Microsoft Visual Studio 14.0/" +ENV WindowsLibPath "${PROGRAM_FILES}/Windows Kits/8.1/References/CommonConfiguration/Neutral" +ENV WindowsSdkDir "${PROGRAM_FILES}/Windows Kits/8.1/" +ENV WindowsSDKLibVersion "winv6.3/" +ENV WindowsSDKVersion "/" +ENV WindowsSDK_ExecutablePath_x64 "${PROGRAM_FILES}/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.6.1 Tools/x64/" +ENV WindowsSDK_ExecutablePath_x86 "${PROGRAM_FILES}/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.6.1 Tools/" + +# Disable all debug messages +ENV WINEDEBUG "-all" + +# Set the wine home to be in a folder that extender will own (Or you'll get the "wine: is not owned by you") +ENV WINEPREFIX "/var/extender/.wine" + +# Initialize Wine (also see next Dockerfile) +# Setup symbolic links for folders to exist in the C:/ space +# Also, for the installed packages, create symlinks without spaces in the paths! +# Once we run wine, the folder is created for the root user, this needs to be chown'ed back to the extender user (see next Dockerfile) + +RUN \ + mkdir -p ${WINEPREFIX} && \ + wine cmd /c echo Initialized Wine folder && \ + chmod -R 755 ${WINEPREFIX} && \ + ln -s /tmp ${WINEPREFIX}/drive_c/tmp && \ + ln -s ${WINEPREFIX}/drive_c/Program\ Files\ \(x86\) ${WINEPREFIX}/drive_c/ProgramFilesx86 && \ + mkdir ${WINEPREFIX}/drive_c/ProgramFilesx86/WindowsKits && \ + wget -q -O - ${S3_URL}/WindowsKits-8.1.tar.gz | tar xz -C ${WINEPREFIX}/drive_c/ProgramFilesx86/WindowsKits && \ + wget -q -O - ${S3_URL}/WindowsKits-10.0.tar.gz | tar xz -C ${WINEPREFIX}/drive_c/ProgramFilesx86/WindowsKits && \ + wget -q -O - ${S3_URL}/Microsoft-Visual-Studio-14-0.tar.gz | tar xz -C ${WINEPREFIX}/drive_c/ProgramFilesx86 && \ + ln -s ${WINEPREFIX}/drive_c/ProgramFilesx86/Microsoft\ Visual\ Studio\ 14.0 ${WINEPREFIX}/drive_c/ProgramFilesx86/MicrosoftVisualStudio14.0 + diff --git a/server/docker/Dockerfile b/server/docker/Dockerfile index 60dab7bd..cebfd9d8 100644 --- a/server/docker/Dockerfile +++ b/server/docker/Dockerfile @@ -5,7 +5,8 @@ RUN \ mkdir -p /var/extender && \ chown extender: /var/extender && \ chown extender: $(readlink -f /usr/bin/java) && \ - chmod +s $(readlink -f /usr/bin/java) + chmod +s $(readlink -f /usr/bin/java) && \ + chown -R extender:extender ${WINEPREFIX} USER extender diff --git a/server/src/main/java/com/defold/extender/Extender.java b/server/src/main/java/com/defold/extender/Extender.java index f753ad32..104d50df 100644 --- a/server/src/main/java/com/defold/extender/Extender.java +++ b/server/src/main/java/com/defold/extender/Extender.java @@ -12,9 +12,6 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -27,8 +24,9 @@ class Extender { private final AppManifestConfiguration appManifest; private final String platform; private final File sdk; - private final File extensionSource; - private final File build; + private final File uploadDirectory; + private final File jobDirectory; + private final File buildDirectory; private final PlatformConfig platformConfig; private final ExtensionManifestValidator manifestValidator; private final TemplateExecutor templateExecutor = new TemplateExecutor(); @@ -48,16 +46,38 @@ class Extender { private static final String ANDROID_STL_LIB_PATH = System.getenv("ANDROID_STL_LIB"); private static final String ANDROID_SYSROOT_PATH = System.getenv("ANDROID_SYSROOT"); - Extender(String platform, File extensionSource, File sdk, String buildDirectory) throws IOException, ExtenderException { - this.extensionSource = extensionSource; + Extender(String platform, File sdk, File jobDirectory, File uploadDirectory, File buildDirectory) throws IOException, ExtenderException { + this.jobDirectory = jobDirectory; + this.uploadDirectory = uploadDirectory; + this.buildDirectory = buildDirectory; // Read config from SDK - this.config = Extender.loadYaml(this.extensionSource, new File(sdk.getPath() + "/extender/build.yml"), Configuration.class); + this.config = Extender.loadYaml(uploadDirectory, new File(sdk.getPath() + "/extender/build.yml"), Configuration.class); - // Make sure the Emscripten compiler doesn't pollute the environment - processExecutor.putEnv("EM_CACHE", buildDirectory); + this.platform = platform; + this.sdk = sdk; + this.platformConfig = getPlatformConfig(); + + // LEGACY: Make sure the Emscripten compiler doesn't pollute the environment + processExecutor.putEnv("EM_CACHE", buildDirectory.toString()); + + processExecutor.setCwd(jobDirectory); - Collection allFiles = FileUtils.listFiles(extensionSource, null, true); + if (this.platformConfig != null && this.platformConfig.env != null) { + + HashMap envContext = new HashMap<>(); + envContext.put("build_folder", buildDirectory); + + Set keys = this.platformConfig.env.keySet(); + for (String k : keys) { + String v = this.platformConfig.env.get(k); + v = templateExecutor.execute(v, envContext); + + processExecutor.putEnv(k, v); + } + } + + Collection allFiles = FileUtils.listFiles(uploadDirectory, null, true); List appManifests = allFiles.stream().filter(f -> f.getName().equals("app.manifest")).collect(Collectors.toList()); if (appManifests.size() > 1 ) { @@ -66,17 +86,9 @@ class Extender { if (appManifests.isEmpty()) { this.appManifest = new AppManifestConfiguration(); } else { - this.appManifest = Extender.loadYaml(this.extensionSource, appManifests.get(0), AppManifestConfiguration.class); + this.appManifest = Extender.loadYaml(this.uploadDirectory, appManifests.get(0), AppManifestConfiguration.class); } - this.platform = platform; - this.sdk = sdk; - this.platformConfig = getPlatformConfig(); - - Path buildPath = Paths.get(buildDirectory); - Files.createDirectories(buildPath); - this.build = Files.createTempDirectory(buildPath, "build").toFile(); - this.manifestValidator = new ExtensionManifestValidator(new WhitelistConfig(), this.platformConfig.allowedFlags, this.platformConfig.allowedLibs); // Collect extension directories (used by both buildEngine and buildClassesDex) @@ -137,7 +149,16 @@ static List collectFilesByPath(File dir, String re) { private File uniqueTmpFile(String prefix, String suffix) { File file; do { - file = new File(build, prefix + UUID.randomUUID().toString() + suffix); + file = new File(buildDirectory, prefix + UUID.randomUUID().toString() + suffix); + } while (file.exists()); + + return file; + } + + private File uniqueTmpFile(String pattern) { + File file; + do { + file = new File(buildDirectory, String.format(pattern, UUID.randomUUID().toString())); } while (file.exists()); return file; @@ -178,20 +199,25 @@ static Map mergeContexts(Map originalContext, Ma Set keys = extensionContext.keySet(); for (String k : keys) { - Object v1 = context.get(k); + Object v1 = context.getOrDefault(k, null); Object v2 = extensionContext.get(k); - if (!v1.getClass().equals(v2.getClass())) { + if (v1 != null && !v1.getClass().equals(v2.getClass())) { throw new ExtenderException(String.format("Wrong manifest context variable type for %s: Expected %s, got %s: %s", k, v1.getClass().toString(), v2.getClass().toString(), v2.toString())); } if (!Extender.isListOfStrings((List) v2)) { throw new ExtenderException(String.format("The context variables only support strings or lists of strings. Got %s (type %s)", v2.toString(), v2.getClass().getCanonicalName())); } - if (v1 instanceof List) { + if (v1 != null && v1 instanceof List) { v1 = Extender.mergeLists((List) v1, (List) v2); } - context.put(k, v1); + + if (v1 != null) { + context.put(k, v1); + } else { + context.put(k, v2); + } } return context; } @@ -214,8 +240,6 @@ private static Map createEmptyContext(Map origin @SuppressWarnings("unchecked") private Map context(Map manifestContext) throws ExtenderException { Map context = new HashMap<>(config.context); - context.put("dynamo_home", sdk.getAbsolutePath()); - context.put("platform", this.platform); if (this.platform.contains("android")) { context.put("android_ndk_path", ANDROID_NDK_PATH); @@ -226,7 +250,12 @@ private Map context(Map manifestContext) throws context.put("android_sysroot", ANDROID_SYSROOT_PATH); } - context.putAll(Extender.mergeContexts(platformConfig.context, manifestContext)); + context = Extender.mergeContexts(context, platformConfig.context); + context = Extender.mergeContexts(context, manifestContext); + + // Should not be allowed to be overridden by manifests + context.put("dynamo_home", ExtenderUtil.getRelativePath(jobDirectory, sdk)); + context.put("platform", this.platform); Set keys = context.keySet(); for (String k : keys) { @@ -279,15 +308,15 @@ private List getJars(File extDir) { private File compileFile(int index, File extDir, File src, Map manifestContext) throws IOException, InterruptedException, ExtenderException { List includes = new ArrayList<>(); - includes.add(extDir.getAbsolutePath() + File.separator + "include"); - File o = new File(build, String.format("%s_%d.o", src.getName(), index)); + includes.add( ExtenderUtil.getRelativePath(jobDirectory, new File(extDir, "include") ) ); + File o = new File(buildDirectory, String.format("%s_%d.o", src.getName(), index)); List frameworks = getFrameworks(extDir); List frameworkPaths = getFrameworkPaths(extDir); Map context = context(manifestContext); - context.put("src", src); - context.put("tgt", o); + context.put("src", ExtenderUtil.getRelativePath(jobDirectory, src)); + context.put("tgt", ExtenderUtil.getRelativePath(jobDirectory, o)); context.put("ext", ImmutableMap.of("includes", includes, "frameworks", frameworks, "frameworkPaths", frameworkPaths)); String command = templateExecutor.execute(platformConfig.compileCmd, context); @@ -298,8 +327,8 @@ private File compileFile(int index, File extDir, File src, Map m private File compileMain(File maincpp, Map manifestContext) throws IOException, InterruptedException, ExtenderException { Map context = context(manifestContext); File o = uniqueTmpFile("main_tmp", ".o"); - context.put("src", maincpp); - context.put("tgt", o); + context.put("src", ExtenderUtil.getRelativePath(jobDirectory, maincpp)); + context.put("tgt", ExtenderUtil.getRelativePath(jobDirectory, o)); String command = templateExecutor.execute(platformConfig.compileCmd, context); processExecutor.execute(command); return o; @@ -315,7 +344,7 @@ private void buildExtension(File manifest, Map manifestContext) } if (srcFiles.isEmpty()) { - throw new ExtenderException(String.format("Extension '%s' has no source!", ExtenderUtil.getRelativePath(this.extensionSource, manifest) )); + throw new ExtenderException(String.format("Extension '%s' has no source!", ExtenderUtil.getRelativePath(this.uploadDirectory, manifest) )); } List objs = new ArrayList<>(); @@ -324,12 +353,17 @@ private void buildExtension(File manifest, Map manifestContext) int i = 0; for (File src : srcFiles) { File o = compileFile(i, extDir, src, manifestContext); - objs.add(o.getAbsolutePath()); + objs.add(ExtenderUtil.getRelativePath(jobDirectory, o)); i++; } // Create c++ library - File lib = uniqueTmpFile("lib", ".a"); + File lib = null; + if (platformConfig.writeLibPattern != null) { + lib = uniqueTmpFile(platformConfig.writeLibPattern); + } else { + lib = uniqueTmpFile("lib", ".a"); // Deprecated, remove in a few versions + } Map context = context(manifestContext); context.put("tgt", lib); context.put("objs", objs); @@ -366,8 +400,7 @@ static List getAppManifestItems(AppManifestConfiguration manifest, Strin } private File linkEngine(List symbols, Map manifestContext) throws IOException, InterruptedException, ExtenderException { - File maincpp = new File(build, "main.cpp"); - File exe = new File(build, String.format("%sdmengine%s", platformConfig.exePrefix, platformConfig.exeExt)); + File maincpp = new File(buildDirectory , "main.cpp"); List extSymbols = new ArrayList<>(); extSymbols.addAll(symbols); @@ -376,7 +409,6 @@ private File linkEngine(List symbols, Map manifestContex extSymbols = ExtenderUtil.pruneItems( extSymbols, getAppManifestItems(appManifest, platform, "includeSymbols"), getAppManifestItems(appManifest, platform, "excludeSymbols") ); mainContext.put("symbols", ExtenderUtil.pruneItems( (List)mainContext.get("symbols"), getAppManifestItems(appManifest, platform, "includeSymbols"), getAppManifestItems(appManifest, platform, "excludeSymbols"))); - mainContext.put("ext", ImmutableMap.of("symbols", extSymbols)); String main = templateExecutor.execute(config.main, mainContext); @@ -385,12 +417,12 @@ private File linkEngine(List symbols, Map manifestContex File mainObject = compileMain(maincpp, manifestContext); List extLibs = new ArrayList<>(); - List extLibPaths = new ArrayList<>(Arrays.asList(build.toString())); + List extLibPaths = new ArrayList<>(Arrays.asList(buildDirectory.toString())); List extFrameworks = new ArrayList<>(); - List extFrameworkPaths = new ArrayList<>(Arrays.asList(build.toString())); + List extFrameworkPaths = new ArrayList<>(Arrays.asList(buildDirectory.toString())); List extJsLibs = new ArrayList<>(); - extLibs.addAll(Extender.collectFilesByName(build, platformConfig.stlibRe)); + extLibs.addAll(Extender.collectFilesByName(buildDirectory, platformConfig.stlibRe)); for (File extDir : this.extDirs) { File libDir = new File(extDir, "lib" + File.separator + this.platform); // e.g. arm64-ios @@ -423,23 +455,28 @@ private File linkEngine(List symbols, Map manifestContex extLibs = ExtenderUtil.pruneItems( extLibs, getAppManifestItems(appManifest, platform, "includeLibs"), getAppManifestItems(appManifest, platform, "excludeLibs")); extJsLibs = ExtenderUtil.pruneItems( extJsLibs, getAppManifestItems(appManifest, platform, "includeJsLibs"), getAppManifestItems(appManifest, platform, "excludeJsLibs")); + File exe; + if (platformConfig.writeExePattern != null ) { + exe = new File(buildDirectory, platformConfig.writeExePattern); + } else { + exe = new File(buildDirectory, String.format("%sdmengine%s", platformConfig.exePrefix, platformConfig.exeExt)); // Legacy, remove in a few versions! + } + Map context = context(manifestContext); - context.put("src", mainObject); - context.put("tgt", exe.getAbsolutePath()); + context.put("src", ExtenderUtil.getRelativePath(jobDirectory, mainObject)); + context.put("tgt", ExtenderUtil.getRelativePath(jobDirectory, exe)); context.put("ext", ImmutableMap.of("libs", extLibs, "libPaths", extLibPaths, "frameworks", extFrameworks, "frameworkPaths", extFrameworkPaths, "jsLibs", extJsLibs)); - context.put("engineLibs", ExtenderUtil.pruneItems((List) context.getOrDefault("engineLibs", new ArrayList<>()), getAppManifestItems(appManifest, platform, "includeLibs"), getAppManifestItems(appManifest, platform, "excludeLibs")) ); context.put("engineJsLibs", ExtenderUtil.pruneItems((List) context.getOrDefault("engineJsLibs", new ArrayList<>()), getAppManifestItems(appManifest, platform, "includeJsLibs"), getAppManifestItems(appManifest, platform, "excludeJsLibs")) ); String command = templateExecutor.execute(platformConfig.linkCmd, context); processExecutor.execute(command); - return exe; } private File buildRJar() throws ExtenderException { try { - File rJavaDir = new File(extensionSource, "_app/rjava/"); + File rJavaDir = new File(uploadDirectory, "_app/rjava/"); if (rJavaDir.exists() && rJavaDir.isDirectory()) { LOGGER.info("Building Android resources (R.java)."); @@ -505,7 +542,7 @@ private File buildJavaExtension(File manifest, Map manifestConte try { - LOGGER.info("Building Java sources with extension source {}", extensionSource); + LOGGER.info("Building Java sources with extension source {}", uploadDirectory); // Collect all Java source files File extDir = manifest.getParentFile(); @@ -585,7 +622,7 @@ private List buildJava(File rJar) throws ExtenderException { try { Map> manifestConfigs = new HashMap<>(); for (File manifest : this.manifests) { - ManifestConfiguration manifestConfig = Extender.loadYaml(this.extensionSource, manifest, ManifestConfiguration.class); + ManifestConfiguration manifestConfig = Extender.loadYaml(this.uploadDirectory, manifest, ManifestConfiguration.class); Map manifestContext = new HashMap<>(); if (manifestConfig.platforms != null) { @@ -627,14 +664,14 @@ private Map getManifestContext(ManifestConfiguration manifestCon } private File buildClassesDex(List extraJars) throws ExtenderException { - LOGGER.info("Building classes.dex with extension source {}", extensionSource); + LOGGER.info("Building classes.dex with extension source {}", uploadDirectory); // To support older versions of build.yml where dxCmd is not defined: if (platformConfig.dxCmd == null || platformConfig.dxCmd.isEmpty()) { return null; } - File classesDex = new File(build, "classes.dex"); + File classesDex = new File(buildDirectory, "classes.dex"); List extJars = new ArrayList<>(); for (File extDir : this.extDirs) { @@ -660,22 +697,36 @@ private File buildClassesDex(List extraJars) throws ExtenderException { return classesDex; } + private void buildWin32Manifest(File exe, Map mergedExtensionContext) throws ExtenderException { + LOGGER.info("Adding manifest file to engine"); + + Map context = context(mergedExtensionContext); + context.put("tgt", ExtenderUtil.getRelativePath(jobDirectory, exe)); + + String command = templateExecutor.execute(platformConfig.mtCmd, context); + try { + processExecutor.execute(command); + } catch (IOException | InterruptedException e) { + throw new ExtenderException(e, processExecutor.getOutput()); + } + } + private File buildEngine() throws ExtenderException { - LOGGER.info("Building engine for platform {} with extension source {}", platform, extensionSource); + LOGGER.info("Building engine for platform {} with extension source {}", platform, uploadDirectory); try { List symbols = new ArrayList<>(); Map> manifestConfigs = new HashMap<>(); for (File manifest : this.manifests) { - ManifestConfiguration manifestConfig = Extender.loadYaml(this.extensionSource, manifest, ManifestConfiguration.class); + ManifestConfiguration manifestConfig = Extender.loadYaml(this.uploadDirectory, manifest, ManifestConfiguration.class); Map manifestContext = new HashMap<>(); if (manifestConfig.platforms != null) { manifestContext = getManifestContext(manifestConfig); } - String relativePath = ExtenderUtil.getRelativePath(this.extensionSource, manifest); + String relativePath = ExtenderUtil.getRelativePath(this.uploadDirectory, manifest); this.manifestValidator.validate(relativePath, manifestContext); manifestConfigs.put(manifestConfig.name, manifestContext); @@ -693,7 +744,13 @@ private File buildEngine() throws ExtenderException { mergedExtensionContext = Extender.mergeContexts(mergedExtensionContext, extensionContext); } - return linkEngine(symbols, mergedExtensionContext); + File exe = linkEngine(symbols, mergedExtensionContext); + + if (platform.endsWith("win32")) { + buildWin32Manifest(exe, mergedExtensionContext); + } + + return exe; } catch (IOException | InterruptedException e) { throw new ExtenderException(e, processExecutor.getOutput()); } @@ -717,8 +774,4 @@ List build() throws ExtenderException { return outputFiles; } - - void dispose() throws IOException { - FileUtils.deleteDirectory(build); - } } diff --git a/server/src/main/java/com/defold/extender/ExtenderController.java b/server/src/main/java/com/defold/extender/ExtenderController.java index 2c00d4b5..04141077 100644 --- a/server/src/main/java/com/defold/extender/ExtenderController.java +++ b/server/src/main/java/com/defold/extender/ExtenderController.java @@ -34,9 +34,6 @@ public class ExtenderController { private final DefoldSdkService defoldSdkService; - @Value("${extender.build-location}") - String buildDirectory; - @Autowired public ExtenderController(DefoldSdkService defoldSdkService) { this.defoldSdkService = defoldSdkService; @@ -69,7 +66,6 @@ public void buildEngineLocal(MultipartHttpServletRequest request, HttpServletRes throws URISyntaxException, IOException, ExtenderException { if (defoldSdkService.isLocalSdkSupported()) { - buildEngine(request, response, platform, null); return; } @@ -84,7 +80,11 @@ public void buildEngine(MultipartHttpServletRequest request, @PathVariable("sdkVersion") String sdkVersion) throws ExtenderException, IOException, URISyntaxException { - File uploadDirectory = Files.createTempDirectory("upload").toFile(); + File jobDirectory = Files.createTempDirectory("job").toFile(); + File uploadDirectory = new File(jobDirectory, "upload"); + uploadDirectory.mkdir(); + File buildDirectory = new File(jobDirectory, "build"); + buildDirectory.mkdir(); try { validateFilenames(request); @@ -98,18 +98,14 @@ public void buildEngine(MultipartHttpServletRequest request, sdk = defoldSdkService.getSdk(sdkVersion); } - Extender extender = new Extender(platform, uploadDirectory, sdk, buildDirectory); + Extender extender = new Extender(platform, sdk, jobDirectory, uploadDirectory, buildDirectory); - try { - // Build and write output files to output stream - List outputFiles = extender.build(); - ZipUtils.zip(response.getOutputStream(), outputFiles); - } finally { - extender.dispose(); - } + // Build and write output files to output stream + List outputFiles = extender.build(); + ZipUtils.zip(response.getOutputStream(), outputFiles); } finally { // Delete temporary upload directory - FileUtils.deleteDirectory(uploadDirectory); + FileUtils.deleteDirectory(jobDirectory); } } diff --git a/server/src/main/java/com/defold/extender/ExtenderUtil.java b/server/src/main/java/com/defold/extender/ExtenderUtil.java index d64d8565..edba8e1c 100644 --- a/server/src/main/java/com/defold/extender/ExtenderUtil.java +++ b/server/src/main/java/com/defold/extender/ExtenderUtil.java @@ -3,6 +3,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -81,4 +82,19 @@ static List pruneItems(List input, List includePatterns, static String getRelativePath(File base, File path) { return base.toURI().relativize(path.toURI()).getPath(); } + + static void debugPrint(Map map, int indent) { + + for (String key : map.keySet()) { + Object v = map.get(key); + if (v instanceof Map) { + debugPrint((Map)v, indent+1); + } else { + for (int i = 0; i < indent; ++i) { + System.out.print(" "); + } + System.out.println(String.format("%s:\t%s", key, v.toString() ) ); + } + } + } } \ No newline at end of file diff --git a/server/src/main/java/com/defold/extender/PlatformConfig.java b/server/src/main/java/com/defold/extender/PlatformConfig.java index 678585fb..a7db26e4 100644 --- a/server/src/main/java/com/defold/extender/PlatformConfig.java +++ b/server/src/main/java/com/defold/extender/PlatformConfig.java @@ -6,9 +6,12 @@ class PlatformConfig { + public Map env; public Map context = new HashMap<>(); - public String exePrefix; - public String exeExt; + public String exePrefix; // deprecated + public String exeExt; // deprecated + public String writeLibPattern; + public String writeExePattern; public String shlibRe; public String stlibRe; public String sourceRe; @@ -19,6 +22,7 @@ class PlatformConfig { public String javacCmd; public String jarCmd; public String dxCmd; + public String mtCmd; public List allowedLibs; public List allowedFlags; } diff --git a/server/src/main/java/com/defold/extender/ProcessExecutor.java b/server/src/main/java/com/defold/extender/ProcessExecutor.java index 95a4861e..6ea9523f 100644 --- a/server/src/main/java/com/defold/extender/ProcessExecutor.java +++ b/server/src/main/java/com/defold/extender/ProcessExecutor.java @@ -1,16 +1,15 @@ package com.defold.extender; +import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; class ProcessExecutor { private final StringBuilder output = new StringBuilder(); private final HashMap env = new HashMap<>(); + private File cwd = null; int execute(String command) throws IOException, InterruptedException { output.append(command).append("\n"); @@ -21,6 +20,9 @@ int execute(String command) throws IOException, InterruptedException { .collect(Collectors.toList()); ProcessBuilder pb = new ProcessBuilder(args); + if (cwd != null ) { + pb.directory(cwd); + } pb.redirectErrorStream(true); Map pbEnv = pb.environment(); @@ -60,4 +62,8 @@ String getOutput() { void putEnv(String key, String value) { env.put(key, value); } + + void setCwd(File cwd) { + this.cwd = cwd; + } } diff --git a/server/src/test/java/com/defold/extender/ExtenderTest.java b/server/src/test/java/com/defold/extender/ExtenderTest.java index 06ec74ff..a52a8b8d 100644 --- a/server/src/test/java/com/defold/extender/ExtenderTest.java +++ b/server/src/test/java/com/defold/extender/ExtenderTest.java @@ -18,14 +18,15 @@ public class ExtenderTest { @Test public void testExtender() throws IOException, InterruptedException, ExtenderException { - File uploadDir = new File("/tmp/tmpUpload"); + File jobDir = new File("/tmp/tmpJob"); + jobDir.mkdirs(); + jobDir.deleteOnExit(); + File uploadDir = new File(jobDir, "upload"); uploadDir.mkdirs(); - uploadDir.deleteOnExit(); - File buildDir = new File("/tmp/tmpBuild"); + File buildDir = new File(jobDir, "build"); buildDir.mkdirs(); - buildDir.deleteOnExit(); File sdk = new File("test-data/sdk/a/defoldsdk"); - Extender extender = new Extender("x86-osx", uploadDir, sdk, buildDir.getAbsolutePath()); + Extender extender = new Extender("x86-osx", sdk, jobDir, uploadDir, buildDir); uploadDir.delete(); assertTrue(true); @@ -235,21 +236,18 @@ public void testMergeContext() throws IOException, InterruptedException, Extende Map a = new HashMap<>(); Map b = new HashMap<>(); - String[] a_frameworks = {"a", "b", "b", "c"}; - a.put("frameworks", Arrays.asList(a_frameworks)); - String[] a_defines = {"A", "B"}; - a.put("defines", Arrays.asList(a_defines)); + a.put("frameworks", Arrays.asList("a", "b", "b", "c")); + a.put("defines", Arrays.asList("A", "B")); - String[] b_frameworks = {"a", "d"}; - b.put("frameworks", Arrays.asList(b_frameworks)); + b.put("frameworks", Arrays.asList("a", "d")); + b.put("symbols", Arrays.asList("S1")); Map result = Extender.mergeContexts(a, b); Map expected = new HashMap<>(); - String[] expected_frameworks = {"a", "b", "b", "c", "a", "d"}; - expected.put("frameworks", Arrays.asList(expected_frameworks)); - String[] expected_defines = {"A", "B"}; - expected.put("defines", Arrays.asList(expected_defines)); + expected.put("frameworks", Arrays.asList("a", "b", "b", "c", "a", "d")); + expected.put("defines", Arrays.asList("A", "B")); + expected.put("symbols", Arrays.asList("S1")); assertEquals(expected, result); } @@ -373,6 +371,5 @@ public void testExcludeItems() throws IOException, InterruptedException, Extende assertEquals( 1, items.size() ); assertTrue( items.contains("{{dynamo_home}}/ext/share/java/facebooksdk.jar") ); } - } } diff --git a/server/src/test/java/com/defold/extender/IntegrationTest.java b/server/src/test/java/com/defold/extender/IntegrationTest.java index af25f3c2..8aa015c6 100644 --- a/server/src/test/java/com/defold/extender/IntegrationTest.java +++ b/server/src/test/java/com/defold/extender/IntegrationTest.java @@ -105,7 +105,7 @@ public static Collection data() { DefoldVersion[] versions = { // "a" is a made up sdk where we can more easily test build.yml fixes - new DefoldVersion("a", new Version(0, 0, 0), new String[] {"x86-osx", "armv7-android", "js-web"} ), + new DefoldVersion("a", new Version(0, 0, 0), new String[] {"x86-osx", "armv7-android", "js-web", "x86_64-win32"} ), new DefoldVersion("8e1d5f8a8a0e1734c9e873ec72b56bea53f25d87", new Version(1, 2, 97), new String[] {"x86-osx"}), new DefoldVersion("735ff76c8b1f93b3126ff223cd234d7ceb5b886d", new Version(1, 2, 98), new String[] {"armv7-android", "armv7-ios", "arm64-ios", "x86-osx", "x86_64-osx"}), @@ -171,7 +171,7 @@ public void buildEngineOLD() throws IOException, ExtenderClientException { List sourceFiles = Lists.newArrayList( new FileExtenderResource("test-data/ext/ext.manifest"), new FileExtenderResource("test-data/ext/src/test_ext.cpp"), - new FileExtenderResource(String.format("test-data/ext/lib/%s/libalib.a", configuration.platform)) + new FileExtenderResource(String.format("test-data/ext/lib/%s/%s", configuration.platform, getLibName(configuration.platform, "alib"))) ); File destination = Files.createTempFile("dmengine", ".zip").toFile(); File log = Files.createTempFile("dmengine", ".log").toFile(); @@ -208,8 +208,7 @@ public void buildEngineOLD() throws IOException, ExtenderClientException { FileUtils.deleteDirectory(new File("build" + File.separator + sdkVersion)); } - private String getEngineName(String platform) - { + private String getEngineName(String platform) { if (platform.endsWith("android")) { return "libdmengine.so"; } @@ -219,9 +218,19 @@ else if (platform.endsWith("ios") || platform.endsWith("osx")) { else if (platform.endsWith("web")) { return "dmengine.js"; } + else if (platform.endsWith("win32")) { + return "dmengine.exe"; + } return null; } + private String getLibName(String platform, String lib) { + if (platform.endsWith("win32")) { + return String.format("%s.lib", lib); + } + return String.format("lib%s.a", lib); + } + @Test public void buildEngine() throws IOException, ExtenderClientException { @@ -238,8 +247,8 @@ public void buildEngine() throws IOException, ExtenderClientException { List sourceFiles = Lists.newArrayList( new FileExtenderResource("test-data/ext2/ext.manifest"), new FileExtenderResource("test-data/ext2/src/test_ext.cpp"), - new FileExtenderResource(String.format("test-data/ext2/lib/%s/libalib.a", configuration.platform)), - new FileExtenderResource(String.format("test-data/ext2/lib/%s/libblib.a", configuration.platform)) + new FileExtenderResource(String.format("test-data/ext2/lib/%s/%s", configuration.platform, getLibName(configuration.platform, "alib"))), + new FileExtenderResource(String.format("test-data/ext2/lib/%s/%s", configuration.platform, getLibName(configuration.platform, "blib"))) ); File destination = Files.createTempFile("dmengine", ".zip").toFile(); File log = Files.createTempFile("dmengine", ".log").toFile(); @@ -461,6 +470,7 @@ public void buildAndroidJavaJarDependency() throws IOException, ExtenderClientEx assertTrue(dexClasses.contains("Lcom/defold/JarDep;")); assertTrue(dexClasses.contains("Lcom/defold/Test;")); } + @Test public void buildAndroidRJar() throws IOException, ExtenderClientException, InterruptedException { @@ -535,10 +545,10 @@ public void buildEngineAppManifest() throws IOException, ExtenderClientException new FileExtenderResource("test-data/testproject_appmanifest/_app/app.manifest"), new FileExtenderResource("test-data/testproject_appmanifest/ext/ext.manifest"), new FileExtenderResource("test-data/testproject_appmanifest/ext/src/test_ext.cpp"), - new FileExtenderResource(String.format("test-data/testproject_appmanifest/ext/lib/%s/libalib.a", configuration.platform)), + new FileExtenderResource(String.format("test-data/testproject_appmanifest/ext/lib/%s/%s", configuration.platform, getLibName(configuration.platform, "alib"))), new FileExtenderResource("test-data/testproject_appmanifest/ext2/ext.manifest"), new FileExtenderResource("test-data/testproject_appmanifest/ext2/src/test_ext.cpp"), - new FileExtenderResource(String.format("test-data/testproject_appmanifest/ext2/lib/%s/libblib.a", configuration.platform)) + new FileExtenderResource(String.format("test-data/testproject_appmanifest/ext2/lib/%s/%s", configuration.platform, getLibName(configuration.platform, "blib"))) ); if (isAndroid) { diff --git a/server/test-data/build-libs.sh b/server/test-data/build-libs.sh index 19f2217f..338e119b 100755 --- a/server/test-data/build-libs.sh +++ b/server/test-data/build-libs.sh @@ -1,4 +1,12 @@ +# How to build on Windows +# * Make a shared directory between OSX/Win32 for test-data in Parallels Desktop +# * On the windows machine, open an msys terminal +# * Change directory to the new drive (E.g. X: "cd x:") which was mounted for you by Parallels Desktop +# * Run "sh build-libs.sh" +# All files should be named and copied automatically by this script + + source ./compile.sh # Find all .cpp files in a folder and make a lib of each of them @@ -24,7 +32,7 @@ function Copy { CompileLibsToExtension enginelibs engineext/lib # # copy these into the "a" sdk -cp -v -r engineext/lib/ sdk/a/defoldsdk/lib +cp -v -r engineext/lib/ sdk/a/defoldsdk/ rm -rf ./engineext CompileLibsToExtension alib ext/lib diff --git a/server/test-data/compile.sh b/server/test-data/compile.sh index a5f270f0..a2ea8ce4 100755 --- a/server/test-data/compile.sh +++ b/server/test-data/compile.sh @@ -12,6 +12,10 @@ OSX_AR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctool EMCC=$DYNAMO_HOME/ext/bin/emsdk_portable/emscripten/1.35.0/em++ EMAR=$DYNAMO_HOME/ext/bin/emsdk_portable/emscripten/1.35.0/emar +WIN32_CL=cl.exe +WIN32_LIB=lib.exe + + function RemoveTarget { local name=$1 @@ -109,13 +113,53 @@ function CompileHTML5 { done } +function CompileWindows { + local name=$1 + local src=$2 + local targetdir=$3 + + archs=( "x86" "x86_64") + for arch in "${archs[@]}" + do + local archname=$arch-win32 + local target=$targetdir/$archname/$name.lib + + RemoveTarget $target + mkdir -p $(dirname $target) + + local OLDPATH=$PATH + + if [ "$arch" == "x86_64" ]; then + export PATH="/c/Program Files (x86)/MSBuild/14.0/bin:/c/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/IDE/:/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_amd64:/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN:/c/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/Tools:/c/WINDOWS/Microsoft.NET/Framework/v4.0.30319:/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/VCPackages:/c/Program Files (x86)/HTML Help Workshop:/c/Program Files (x86)/Microsoft Visual Studio 14.0/Team Tools/Performance Tools:/c/Program Files (x86)/Windows Kits/8.1/bin/x86:/c/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.6.1 Tools/:$PATH" + else + export PATH="/c/Program Files (x86)/MSBuild/14.0/bin:/c/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/IDE/:/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN:/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN:/c/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/Tools:/c/WINDOWS/Microsoft.NET/Framework/v4.0.30319:/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/VCPackages:/c/Program Files (x86)/HTML Help Workshop:/c/Program Files (x86)/Microsoft Visual Studio 14.0/Team Tools/Performance Tools:/c/Program Files (x86)/Windows Kits/8.1/bin/x86:/c/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.6.1 Tools/:$PATH" + fi + + $WIN32_CL -nologo -TP -O2 -Oy- -Z7 -MT -D__STDC_LIMIT_MACROS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -DWIN32 -D_CRT_SECURE_NO_WARNINGS -wd4200 -W3 -EHsc $src -c -Fo$name-$archname.obj + # For some reason, only the /OUT cannot be set using -OUT :/ + $WIN32_LIB -nologo $name-$archname.obj + rm $name-$archname.obj + mv -v $name-$archname.lib $target + + export PATH=$OLDPATH + + echo Wrote $target + done +} + + function Compile { local name=$1 local src=$2 local targetdir=$3 - CompileOSX $name $src $targetdir - CompileiOS $name $src $targetdir - CompileAndroid $name $src $targetdir - CompileHTML5 $name $src $targetdir + if [ "$(uname)" == "Darwin" ]; then + CompileOSX $name $src $targetdir + CompileiOS $name $src $targetdir + CompileAndroid $name $src $targetdir + CompileHTML5 $name $src $targetdir + fi + if [ "$(uname)" == "MINGW32_NT-6.2" ]; then + CompileWindows $name $src $targetdir + fi } diff --git a/server/test-data/enginelibs/engine_main.cpp b/server/test-data/enginelibs/engine_main.cpp index 95f1854d..72cb3eaa 100644 --- a/server/test-data/enginelibs/engine_main.cpp +++ b/server/test-data/enginelibs/engine_main.cpp @@ -1,4 +1,4 @@ -int engine_main(int argc, char** argv) +int engine_main(int argc, char* argv[]) { return 0; } diff --git a/server/test-data/ext/lib/arm64-ios/libalib.a b/server/test-data/ext/lib/arm64-ios/libalib.a index 2898c5d16f125f7095f48fea50f001057928b402..a64e7cb9d5bf96822328cd81c4c4740204aa5044 100644 GIT binary patch delta 49 scmcb>a)D)nG`qQlxv{yS`9!5qX$NIPeIo+}1TZwQgh(50oV1S-03@~xjsO4v delta 49 qcmcb>a)D)nG`oo<5Sm&}R0@^;plqmbWT1cmhG0pcw8_Rv`xpT_m<&b$ diff --git a/server/test-data/ext/lib/armv7-android/libalib.a b/server/test-data/ext/lib/armv7-android/libalib.a index 96038b6adffb65a743f3e259f1ef534fb59c1aca..aa23fe8e10d3070350bf3dd257995f9176101afe 100644 GIT binary patch delta 29 ecmdlWu|Z;jG`qQlxv{yS(L|-WFy_W%S=<18-Uw^} delta 29 dcmdlWu|Z;jG`oo<5Sp4yRGJH8ZakL74FG*02y_4d diff --git a/server/test-data/ext/lib/armv7-ios/libalib.a b/server/test-data/ext/lib/armv7-ios/libalib.a index 0bd2fd68e798dff510490965e122496012e5d273..a86238d6b60b71cc2dcb86fadf136d2d00ed22ec 100644 GIT binary patch delta 49 scmeBR>0p^4&2DaCZftI7K2a%DnnBr6-^f4#0SrwnA<{-0CzUY*00CwSb^rhX delta 49 qcmeBR>0p^4&2C}|gr=4gl|rQjlnwQb3=|N+5G)ClHrY6-j1d3>=n9Si diff --git a/server/test-data/ext/lib/js-web/libalib.a b/server/test-data/ext/lib/js-web/libalib.a index 0f29e3712a311b8edb79a4670e1c0766e2dab9e8..ebb301d41ca0d58a09a3f4d3b644c464f8a80706 100644 GIT binary patch delta 29 ecmcb{b&YF+G`qQlxv{yS@kFKhFy_V+eJlWiun4~Z delta 29 dcmcb{b&YF+G`oo<5Sp4yRGJTCZamS)0sw;D2*m&Z diff --git a/server/test-data/ext/lib/x86-osx/libalib.a b/server/test-data/ext/lib/x86-osx/libalib.a index d04aabb0e04bb7494beacab399dcc2bc864f36e1..059b7f0b583df19c91a56b4ec46ac7d7d7da6b7d 100644 GIT binary patch delta 49 scmbQiGJ|D;G`qQlxv{yS`9!5q=>}y(eIo+}1TZwQgh(50oYck$02c-eCIA2c delta 49 qcmbQiGJ|D;G`oo<5Sm&{R0@@LP&U*zGEhJOL$D-J+IZunHbwvsuL|q{ diff --git a/server/test-data/ext/lib/x86-win32/alib.lib b/server/test-data/ext/lib/x86-win32/alib.lib new file mode 100644 index 0000000000000000000000000000000000000000..73db8004e523a636feae01e0703f033c2da1dba4 GIT binary patch literal 8380 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 JrXrsI{|B~vASeI; literal 0 HcmV?d00001 diff --git a/server/test-data/ext/lib/x86_64-osx/libalib.a b/server/test-data/ext/lib/x86_64-osx/libalib.a index d48a28b690099a2b308981ffeb9a4fce469a18cb..d79ffa568619d0951df60cca602393aefe3017cb 100644 GIT binary patch delta 49 scmX@WdVqC;G`qQlxv{yS`9!5qX#-_LeIpA61TZwQgh(50oTSGD036i{*#H0l delta 49 qcmX@WdVqC;G`oo<5Sm&{R0@@zplqmbWTAinhG0pcwDHDCdQ1Q)-U~kf diff --git a/server/test-data/ext/lib/x86_64-win32/alib.lib b/server/test-data/ext/lib/x86_64-win32/alib.lib new file mode 100644 index 0000000000000000000000000000000000000000..50e62aa5305330d5278241caddb3cc791e4ad032 GIT binary patch literal 8258 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 ah<%P<>YO2I&$shs6F||Rb#@i;2>(AcCllTP literal 0 HcmV?d00001 diff --git a/server/test-data/ext2/lib/arm64-ios/libalib.a b/server/test-data/ext2/lib/arm64-ios/libalib.a index 6c9cf8aca54c22a2b73698c878c6069e5654e98c..029031232f3e453d8531920cf99d24527a212c82 100644 GIT binary patch delta 49 scmcb>a)D)nG`qQlxv{yS#YCl0=>TOzeIo+}1TZwQgh(52oV1S-04C21pa1{> delta 49 qcmcb>a)D)nG`oo<5Sm&}R0@@zplqmbWT1cmhG0pcw8_Rv`xpT(_zUI$ diff --git a/server/test-data/ext2/lib/arm64-ios/libblib.a b/server/test-data/ext2/lib/arm64-ios/libblib.a index bfd34cf3615de8ae32aff9a9d097ca0f2365d858..f0348106c7bdce37c172db4f9d6d13a4f2a98f60 100644 GIT binary patch delta 50 tcmcb?dV_U>G`qQlxv{yS#YCkX872m0LwzFy1q3iOv4qGQZ(OCv1OO-=3k3iG delta 50 scmcb?dV_U>G`oo<5SkfGRLYTIVNf>IH!@H_07I~>rHQHO##MSu04Jym1^@s6 diff --git a/server/test-data/ext2/lib/armv7-android/libalib.a b/server/test-data/ext2/lib/armv7-android/libalib.a index 96038b6adffb65a743f3e259f1ef534fb59c1aca..4e8acceefd05840f9aa8b815e54785d60bc7019b 100644 GIT binary patch delta 29 ecmdlWu|Z;jG`qQlxv{yS@kFJ$Fy_W%S=<18^9XJL delta 29 dcmdlWu|Z;jG`oo<5Sp4yRGJH8ZakL74FG*02y_4d diff --git a/server/test-data/ext2/lib/armv7-android/libblib.a b/server/test-data/ext2/lib/armv7-android/libblib.a index 2bdeff71acd418a48905c7cd67e59a38c64ca992..8f77abe9892ce5afe878e194dfe3e1902a37424e 100644 GIT binary patch delta 29 ecmeB^?~|V(&2DaCZftI7JW**qjJff~Ha-A&xCpBN delta 29 dcmeB^?~|V(&2C}|gr=qwmDa0p^4&2DaCZftI7F;OX0`hl{czL9|f0vMWDLZpp1PAX#r035FiSO5S3 delta 49 qcmeBR>0p^4&2C}|gr=4gl|rR2C>!b<87LrtAy^V9ZL)Dv86yB2C<{&i diff --git a/server/test-data/ext2/lib/armv7-ios/libblib.a b/server/test-data/ext2/lib/armv7-ios/libblib.a index c8949a07237579e92cc0df78a6ea36843e032e5b..509b8ebd268a1f4712d04e4f4bfc99b3c7701b39 100644 GIT binary patch delta 50 tcmeyt@`Gi9G`qQlxv{yS#YCkX872m0LwzFy1q3iOv4qGQZ(Mbb5dbwk3*rC( delta 50 scmeyt@`Gi9G`oo<5SkfGRLYTIVNf>IH!@H_07I~>rHQHO##QGS0W`-8;{X5v diff --git a/server/test-data/ext2/lib/js-web/libalib.a b/server/test-data/ext2/lib/js-web/libalib.a index 777333a3c028b0b7696c685d239e5458a03ffec7..ebb301d41ca0d58a09a3f4d3b644c464f8a80706 100644 GIT binary patch delta 29 ecmcb{b&YF+G`qQlxv{yS@kFKhFy_V+eJlWiun4~Z delta 29 dcmcb{b&YF+G`oo<5Sp4!RGJTCZamS)0sw;Y2*&^b diff --git a/server/test-data/ext2/lib/js-web/libblib.a b/server/test-data/ext2/lib/js-web/libblib.a index ee3348d1cbdf8aa424c1d4b62214a51642423432..04f7ec2e6267b120d375645145cd69e3a9ef06c1 100644 GIT binary patch delta 29 ecmbQiH-m42G`qQlxv{yS$wZ}%Fy_Wvc5DE4j|d|G delta 29 dcmbQiH-m42G`oo<5Sp4!RN4q*ZoFm31^{-v2q^#n diff --git a/server/test-data/ext2/lib/x86-osx/libalib.a b/server/test-data/ext2/lib/x86-osx/libalib.a index b5f2bbe83c7fda87796754d2989b2388c20797d7..dfdc43e155b1b5eb46d7b977a5ce803155bc1a5f 100644 GIT binary patch delta 49 scmbQiGJ|D;G`qQlxv{yS#YCl0=>^J$`bGu{2w-Sp36VD5IH`>h02>brNB{r; delta 49 qcmbQiGJ|D;G`oo<5Sm&}R0@?oplqmbWT1cmhG0pcw8_RvZHxdPSPO0d diff --git a/server/test-data/ext2/lib/x86-osx/libblib.a b/server/test-data/ext2/lib/x86-osx/libblib.a index 034eb1d305e8380bb69678f11ed0ecdd16d5a948..4dfb64da2df64db81c13c2f2234a9fbc79d23673 100644 GIT binary patch delta 50 tcmbQiI)inBG`qQlxv{yS#YCkX872m0LwzFy1q3iOv4qGQZ(Q|`5daY#3q$|_ delta 50 scmbQiI)inBG`oo<5SkfGRLYTIVNf>IH!@H_07I~>rHQHO##Qea0T8DPMF0Q* diff --git a/server/test-data/ext2/lib/x86-win32/alib.lib b/server/test-data/ext2/lib/x86-win32/alib.lib new file mode 100644 index 0000000000000000000000000000000000000000..a3a919fcf22f55f6845e8535e19f24bf56361093 GIT binary patch literal 8380 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 literal 0 HcmV?d00001 diff --git a/server/test-data/ext2/lib/x86_64-osx/libalib.a b/server/test-data/ext2/lib/x86_64-osx/libalib.a index 0c9e5290790a48f1dcee3be9bf7087fbd61c4958..2aadbc03e9e6798bfd226ff339b0659e9f32e370 100644 GIT binary patch delta 49 scmX@WdVqC;G`qQlxv{yS#YCl0=?%(;`bHKC2w-Sp36VD5I7yEQ04#nBTL1t6 delta 49 qcmX@WdVqC;G`oo<5Sm&}R0@@LP&U*zvQR((L$D-J+GOJ-JthDjR|@d} diff --git a/server/test-data/ext2/lib/x86_64-osx/libblib.a b/server/test-data/ext2/lib/x86_64-osx/libblib.a index b18705c14ca1ddd70256df855d1dbf6df02bbbb8..877a81da15ec9dbb837dc6b419d47a9d4e412451 100644 GIT binary patch delta 29 fcmcb?euI62G`qQlxv{yS#YCk>DARc3Dm`WZfGr3m delta 29 fcmcb?euI62G`oo<5SkfGRBD7UO-(nh(qjeyf8Yot diff --git a/server/test-data/ext2/lib/x86_64-win32/alib.lib b/server/test-data/ext2/lib/x86_64-win32/alib.lib new file mode 100644 index 0000000000000000000000000000000000000000..feebbf904aec49eec765704e135f48842eeab4a0 GIT binary patch literal 8258 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 literal 0 HcmV?d00001 diff --git a/server/test-data/ext2/lib/x86_64-win32/blib.lib b/server/test-data/ext2/lib/x86_64-win32/blib.lib new file mode 100644 index 0000000000000000000000000000000000000000..923303ca40f5a0b693d67624e1b6ae8a95913e30 GIT binary patch literal 8912 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 literal 0 HcmV?d00001 diff --git a/server/test-data/sdk/a/defoldsdk/extender/build.yml b/server/test-data/sdk/a/defoldsdk/extender/build.yml index 1bdff6d7..853f55e9 100644 --- a/server/test-data/sdk/a/defoldsdk/extender/build.yml +++ b/server/test-data/sdk/a/defoldsdk/extender/build.yml @@ -77,16 +77,19 @@ platforms: frameworks: [] engineLibs: ["engine_main", "engine_foo"] libPaths: ["{{dynamo_home}}/lib/darwin", "{{dynamo_home}}/ext/lib/darwin", "{{dynamo_home}}/lib/x86-osx"] - exePrefix: '' - exeExt: '' - shlibRe: 'lib(.+).dylib' - stlibRe: 'lib(.+).a' - sourceRe: '(?i).*(.cpp|.c|.cc|.mm|.m)' - allowedLibs: ['lber','apr-1.0','AVFAudio','netsnmpmibs.25','bsm','form.5.4','tk','QMIParserDynamic','gmalloc','ncurses','heimdal-asn1','iodbcinst','krb5','tidy','curl.4','pmenergy','python2.7','icucore','ecpg','ATCommandStudioDynamic','dtrace_dyld','lzma.5','pcre.0','pgtypes.3.4','pq.5.6','pam.1','netsnmp.5','energytrace','sasl2.2.0.15','python2.6','germantok','cmph','ssh-keychain','xar.1','xml2','pcreposix.0','m','pam.2','apr-1','auto','alias','c++','ipconfig','Match','crypto.35','netsnmpmibs','cups','exslt.0','iodbcinst.2.1.18','pgtypes.3','mx.A','CRFSuite','cupsmime.1','aprutil-1.0','objc.A','edit','crypto.0.9.8','pmsample','des425','gcc_s.10.5','ruby.2.0','crypto.0.9.7','CRFSuite0.12','auditd.0','edit.2','pthread','ecpg.6.5','odfde','tcl8.5','z.1.1.3','netsnmp.5.2.1','cupsppdc.1','util','lapack','extension','ffi','System','iodbcinst.2','dns_services','pcreposix','mx','panel','ldap','readline','IASUnifiedProgress','edit.3','ssl.0.9.7','csfde','python','hunspell-1.2.0.0.0','netsnmp.25','charset.1.0.0','panel.5.4','gssapi_krb5','aprutil-1','cupsimage.2','BSDPClient.A','menu.5.4','info','spindump','marisa','dl','cupsimage','pq.5','com_err','auditd','UniversalAccess','sasl2.2.0.22','ecpg.6','blas','XSEvent','z','form','ktrace','krb5support','DiagnosticMessagesClient','c++abi','expat.1','System_debug','iodbc','tk8.5','Xplugin.1','pcap.A','curl.3','dbm','iconv','ssl','gcc_s.10.4','netsnmp.15.1.2','xar','menu','exslt','odmodule','alias.A','sasl2','charset','sasl2.2','ThaiTokenizer','tidy.A','archive','bz2.1.0.5','netsnmptrapd','ncurses.5.4','pcre','Fosl_dynamic','cblas','pq','System.B_debug','mecab','ipsec.A','ecpg_compat.3.5','f77lapack','cupsppdc','ipsec','netsnmphelpers.25','edit.3.0','tls','z.1.2.5','netsnmp.15','xslt','resolv','sasl2.2.0.1','iconv.2','ecpg_compat','netsnmpagent','krb524','OpenScriptingUtil','dtrace','cupsmime','bz2','AccountPolicyTranslation','netsnmpagent.25','expat','ssl.0.9.8','cups.2','netsnmphelpers','crypto','z.1','netsnmp','sandbox','CoreStorage','util1.0','DHCPServer.A','langid','Match.1','iodbc.2.1.18','xml2.2','quit','prequelite','stdc++.6.0.9','pcap','objc','ecpg_compat.3','ruby','ScreenReader','c++.1','tls.6','System.B','ChineseTokenizer','ssl.35','sqlite3','proc','BSDPClient','k5crypto','network','hunspell-1.2.0','cupscgi.1','sysmon','bz2.1.0','IASAuthReboot','ldap_r','c','termcap','ncurses.5','archive.2','cupscgi','bsm.0','lzma','iconv.2.4.0','xcselect','poll','sandbox.1','gcc_s.1','iodbc.2','curl','Xplugin','krb4','hunspell-1.2','stdc++','netsnmptrapd.25','rpcsvc','pam','clapack','tcl','mecabra','sasl2.2.0.21','resolv.9','compression','charset.1','icucore.A','pgtypes','DHCPServer','systemstats','TelephonyUtilDynamic','ruby.2.0.0','system_notify','system_c','system_secinit','system_dnssd','removefile','system_malloc','system_blocks','copyfile','xpc','mathCommon','unwind','system_platform','dyld','system_network','system_sandbox','dispatch','system_trace','system_info','keymgr','system_kernel','mathCommon.A','system_networkextension','system_coreservices','system_asl','unc','launch','system_coretls','dispatch','system_pthread','system_m','system_configuration','kxld','quarantine','corecrypto','macho','commonCrypto','system_pthread','compiler_rt','cache','sqlite3.0','stdc++.6','xslt.1','mecab.1.0.0','curses','Accelerate','Accounts','AddressBook','AGL','AppKit','AppKitScripting','AppleScriptKit','AppleScriptObjC','ApplicationServices','AudioToolbox','AudioUnit','AudioVideoBridging','Automator','AVFoundation','AVKit','CalendarStore','Carbon','CFNetwork','CloudKit','Cocoa','Collaboration','Contacts','ContactsUI','CoreAudio','CoreAudioKit','CoreBluetooth','CoreData','CoreFoundation','CoreGraphics','CoreImage','CoreLocation','CoreMedia','CoreMediaIO','CoreMIDI','CoreMIDIServer','CoreServices','CoreTelephony','CoreText','CoreVideo','CoreWLAN','CryptoTokenKit','DirectoryService','DiscRecording','DiscRecordingUI','DiskArbitration','DrawSprocket','DVComponentGlue','DVDPlayback','EventKit','ExceptionHandling','FinderSync','ForceFeedback','Foundation','FWAUserLib','GameController','GameKit','GameplayKit','GLKit','GLUT','GSS','Hypervisor','ICADevices','ImageCaptureCore','ImageIO','IMServicePlugIn','InputMethodKit','InstallerPlugins','InstantMessage','IOBluetooth','IOBluetoothUI','IOKit','IOSurface','JavaFrameEmbedding','JavaScriptCore','JavaVM','Kerberos','Kernel','LatentSemanticMapping','LDAP','LocalAuthentication','MapKit','MediaAccessibility','MediaLibrary','MediaToolbox','Message','Metal','MetalKit','ModelIO','MultipeerConnectivity','NetFS','NetworkExtension','NotificationCenter','OpenAL','OpenCL','OpenDirectory','OpenGL','OSAKit','PCSC','Photos','PhotosUI','PreferencePanes','PubSub','Python','QTKit','QuartzCore','Quartz','QuickLook','QuickTime','Ruby','SceneKit','ScreenSaver','ScriptingBridge','Scripting','SecurityFoundation','Security','SecurityInterface','ServiceManagement','Social','SpriteKit','StoreKit','SyncServices','SystemConfiguration','System','Tcl','Tk','TWAIN','vecLib','VideoDecodeAcceleration','VideoToolbox','vmnet','WebKit'] - allowedFlags: ["-ObjC","-ObjC++","-Wa,{{comma_separated_arg}}","-W{{warning}}","-ansi","--ansi","-std-default={{arg}}","-stdlib=(libstdc\\+\\+|libc\\+\\+)","-w","-std=(c89|c99|c\\+\\+0x|c\\+\\+11|c\\+\\+14|c\\+\\+17)","-Wp,{{comma_separated_arg}}","-W{{warning}}","--extra-warnings","--warn-{{warning}}","--warn-={{warning}}","-ferror-limit={{number}}","-O([0-4]?|fast|s|z)"] - compileCmd: 'clang++ -c -arch i386 -target x86_64-apple-darwin11 -isysroot /opt/MacOSX.sdk/ -m32 -O2 -g -mmacosx-version-min=10.7 {{#defines}}-D{{{.}}} {{/defines}} {{#flags}}{{{.}}} {{/flags}} {{#ext.includes}}-I{{{.}}} {{/ext.includes}} {{#ext.frameworkPaths}}-F{{{.}}} {{/ext.frameworkPaths}} {{#includes}}-I{{{.}}} {{/includes}} {{src}} -o{{tgt}}' - linkCmd: 'clang++ -arch i386 -target x86_64-apple-darwin11 -isysroot /opt/MacOSX.sdk/ -m32 -O2 -g -mmacosx-version-min=10.7 -o {{tgt}} {{#linkFlags}}{{{.}}} {{/linkFlags}} {{#ext.libPaths}}-L{{{.}}} {{/ext.libPaths}} {{#libs}}-l{{{.}}} {{/libs}} {{#ext.libs}}-l{{{.}}} {{/ext.libs}} {{#ext.frameworkPaths}}-F{{{.}}} {{/ext.frameworkPaths}} {{#ext.frameworks}}-framework {{{.}}} {{/ext.frameworks}} {{#frameworks}}-framework {{{.}}} {{/frameworks}} {{#libPaths}}-L{{{.}}} {{/libPaths}} {{#engineLibs}}-l{{{.}}} {{/engineLibs}} {{#src}}{{{.}}} {{/src}}' - libCmd: 'llvm-ar rcs {{tgt}} {{#objs}}{{{.}}} {{/objs}}' + + exePrefix: '' + exeExt: '' + shlibRe: 'lib(.+)\.dylib' + stlibRe: 'lib(.+)\.a' + writeLibPattern: 'lib%s.a' + writeExePattern: 'dmengine' + sourceRe: '(?i).*(.cpp|.c|.cc|.mm|.m)' + allowedLibs: ['lber','apr-1.0','AVFAudio','netsnmpmibs.25','bsm','form.5.4','tk','QMIParserDynamic','gmalloc','ncurses','heimdal-asn1','iodbcinst','krb5','tidy','curl.4','pmenergy','python2.7','icucore','ecpg','ATCommandStudioDynamic','dtrace_dyld','lzma.5','pcre.0','pgtypes.3.4','pq.5.6','pam.1','netsnmp.5','energytrace','sasl2.2.0.15','python2.6','germantok','cmph','ssh-keychain','xar.1','xml2','pcreposix.0','m','pam.2','apr-1','auto','alias','c++','ipconfig','Match','crypto.35','netsnmpmibs','cups','exslt.0','iodbcinst.2.1.18','pgtypes.3','mx.A','CRFSuite','cupsmime.1','aprutil-1.0','objc.A','edit','crypto.0.9.8','pmsample','des425','gcc_s.10.5','ruby.2.0','crypto.0.9.7','CRFSuite0.12','auditd.0','edit.2','pthread','ecpg.6.5','odfde','tcl8.5','z.1.1.3','netsnmp.5.2.1','cupsppdc.1','util','lapack','extension','ffi','System','iodbcinst.2','dns_services','pcreposix','mx','panel','ldap','readline','IASUnifiedProgress','edit.3','ssl.0.9.7','csfde','python','hunspell-1.2.0.0.0','netsnmp.25','charset.1.0.0','panel.5.4','gssapi_krb5','aprutil-1','cupsimage.2','BSDPClient.A','menu.5.4','info','spindump','marisa','dl','cupsimage','pq.5','com_err','auditd','UniversalAccess','sasl2.2.0.22','ecpg.6','blas','XSEvent','z','form','ktrace','krb5support','DiagnosticMessagesClient','c++abi','expat.1','System_debug','iodbc','tk8.5','Xplugin.1','pcap.A','curl.3','dbm','iconv','ssl','gcc_s.10.4','netsnmp.15.1.2','xar','menu','exslt','odmodule','alias.A','sasl2','charset','sasl2.2','ThaiTokenizer','tidy.A','archive','bz2.1.0.5','netsnmptrapd','ncurses.5.4','pcre','Fosl_dynamic','cblas','pq','System.B_debug','mecab','ipsec.A','ecpg_compat.3.5','f77lapack','cupsppdc','ipsec','netsnmphelpers.25','edit.3.0','tls','z.1.2.5','netsnmp.15','xslt','resolv','sasl2.2.0.1','iconv.2','ecpg_compat','netsnmpagent','krb524','OpenScriptingUtil','dtrace','cupsmime','bz2','AccountPolicyTranslation','netsnmpagent.25','expat','ssl.0.9.8','cups.2','netsnmphelpers','crypto','z.1','netsnmp','sandbox','CoreStorage','util1.0','DHCPServer.A','langid','Match.1','iodbc.2.1.18','xml2.2','quit','prequelite','stdc++.6.0.9','pcap','objc','ecpg_compat.3','ruby','ScreenReader','c++.1','tls.6','System.B','ChineseTokenizer','ssl.35','sqlite3','proc','BSDPClient','k5crypto','network','hunspell-1.2.0','cupscgi.1','sysmon','bz2.1.0','IASAuthReboot','ldap_r','c','termcap','ncurses.5','archive.2','cupscgi','bsm.0','lzma','iconv.2.4.0','xcselect','poll','sandbox.1','gcc_s.1','iodbc.2','curl','Xplugin','krb4','hunspell-1.2','stdc++','netsnmptrapd.25','rpcsvc','pam','clapack','tcl','mecabra','sasl2.2.0.21','resolv.9','compression','charset.1','icucore.A','pgtypes','DHCPServer','systemstats','TelephonyUtilDynamic','ruby.2.0.0','system_notify','system_c','system_secinit','system_dnssd','removefile','system_malloc','system_blocks','copyfile','xpc','mathCommon','unwind','system_platform','dyld','system_network','system_sandbox','dispatch','system_trace','system_info','keymgr','system_kernel','mathCommon.A','system_networkextension','system_coreservices','system_asl','unc','launch','system_coretls','dispatch','system_pthread','system_m','system_configuration','kxld','quarantine','corecrypto','macho','commonCrypto','system_pthread','compiler_rt','cache','sqlite3.0','stdc++.6','xslt.1','mecab.1.0.0','curses','Accelerate','Accounts','AddressBook','AGL','AppKit','AppKitScripting','AppleScriptKit','AppleScriptObjC','ApplicationServices','AudioToolbox','AudioUnit','AudioVideoBridging','Automator','AVFoundation','AVKit','CalendarStore','Carbon','CFNetwork','CloudKit','Cocoa','Collaboration','Contacts','ContactsUI','CoreAudio','CoreAudioKit','CoreBluetooth','CoreData','CoreFoundation','CoreGraphics','CoreImage','CoreLocation','CoreMedia','CoreMediaIO','CoreMIDI','CoreMIDIServer','CoreServices','CoreTelephony','CoreText','CoreVideo','CoreWLAN','CryptoTokenKit','DirectoryService','DiscRecording','DiscRecordingUI','DiskArbitration','DrawSprocket','DVComponentGlue','DVDPlayback','EventKit','ExceptionHandling','FinderSync','ForceFeedback','Foundation','FWAUserLib','GameController','GameKit','GameplayKit','GLKit','GLUT','GSS','Hypervisor','ICADevices','ImageCaptureCore','ImageIO','IMServicePlugIn','InputMethodKit','InstallerPlugins','InstantMessage','IOBluetooth','IOBluetoothUI','IOKit','IOSurface','JavaFrameEmbedding','JavaScriptCore','JavaVM','Kerberos','Kernel','LatentSemanticMapping','LDAP','LocalAuthentication','MapKit','MediaAccessibility','MediaLibrary','MediaToolbox','Message','Metal','MetalKit','ModelIO','MultipeerConnectivity','NetFS','NetworkExtension','NotificationCenter','OpenAL','OpenCL','OpenDirectory','OpenGL','OSAKit','PCSC','Photos','PhotosUI','PreferencePanes','PubSub','Python','QTKit','QuartzCore','Quartz','QuickLook','QuickTime','Ruby','SceneKit','ScreenSaver','ScriptingBridge','Scripting','SecurityFoundation','Security','SecurityInterface','ServiceManagement','Social','SpriteKit','StoreKit','SyncServices','SystemConfiguration','System','Tcl','Tk','TWAIN','vecLib','VideoDecodeAcceleration','VideoToolbox','vmnet','WebKit'] + allowedFlags: ["-ObjC","-ObjC++","-Wa,{{comma_separated_arg}}","-W{{warning}}","-ansi","--ansi","-std-default={{arg}}","-stdlib=(libstdc\\+\\+|libc\\+\\+)","-w","-std=(c89|c99|c\\+\\+0x|c\\+\\+11|c\\+\\+14|c\\+\\+17)","-Wp,{{comma_separated_arg}}","-W{{warning}}","--extra-warnings","--warn-{{warning}}","--warn-={{warning}}","-ferror-limit={{number}}","-O([0-4]?|fast|s|z)"] + compileCmd: 'clang++ -c -arch i386 -target x86_64-apple-darwin11 -isysroot /opt/MacOSX.sdk/ -m32 -O2 -g -mmacosx-version-min=10.7 {{#defines}}-D{{{.}}} {{/defines}} {{#flags}}{{{.}}} {{/flags}} {{#ext.includes}}-I{{{.}}} {{/ext.includes}} {{#ext.frameworkPaths}}-F{{{.}}} {{/ext.frameworkPaths}} {{#includes}}-I{{{.}}} {{/includes}} {{src}} -o{{tgt}}' + linkCmd: 'clang++ -arch i386 -target x86_64-apple-darwin11 -isysroot /opt/MacOSX.sdk/ -m32 -O2 -g -mmacosx-version-min=10.7 -o {{tgt}} {{#linkFlags}}{{{.}}} {{/linkFlags}} {{#ext.libPaths}}-L{{{.}}} {{/ext.libPaths}} {{#libs}}-l{{{.}}} {{/libs}} {{#ext.libs}}-l{{{.}}} {{/ext.libs}} {{#ext.frameworkPaths}}-F{{{.}}} {{/ext.frameworkPaths}} {{#ext.frameworks}}-framework {{{.}}} {{/ext.frameworks}} {{#frameworks}}-framework {{{.}}} {{/frameworks}} {{#libPaths}}-L{{{.}}} {{/libPaths}} {{#engineLibs}}-l{{{.}}} {{/engineLibs}} {{#src}}{{{.}}} {{/src}}' + libCmd: 'llvm-ar rcs {{tgt}} {{#objs}}{{{.}}} {{/objs}}' armv7-android: context: @@ -94,22 +97,26 @@ platforms: engineLibs: ["engine_main", "engine_foo"] libPaths: ["{{dynamo_home}}/lib/armv7-android", "{{dynamo_home}}/ext/lib/armv7-android"] - exePrefix: 'lib' - exeExt: '.so' - shlibRe: 'lib(.+).so' - stlibRe: 'lib(.+).a' - sourceRe: '(?i).+(\.cpp|\.c|\.cc|\.cxx|\.c\+\+)$' - javaSourceRe: '(?i).+(\.java)$' - allowedLibs: ["gnustl_static","supc\\+\\+","c","m","m_hard","stdc\\+\\+",] - allowedFlags: ["-Wa,{{comma_separated_arg}}","-W{{warning}}","-ansi","--ansi","-std-default={{arg}}","-stdlib=(libstdc\\+\\+|libc\\+\\+)","-w","-std=(c89|c99|c\\+\\+0x|c\\+\\+11|c\\+\\+14|c\\+\\+17)","-Wp,{{comma_separated_arg}}","-W{{warning}}","--extra-warnings","--warn-{{warning}}","--warn-={{warning}}","-ferror-limit={{number}}","-O([0-4]?|fast|s|z)"] - compileCmd: 'arm-linux-androideabi-g++ -c -g -gdwarf-2 -fpic -ffunction-sections -fstack-protector -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -fno-exceptions -funwind-tables --sysroot={{android_sysroot}} -DANDROID -Wa,--noexecstack {{#defines}}-D{{.}} {{/defines}} {{#ext.includes}}-I{{.}} {{/ext.includes}} {{#includes}}-I{{.}} {{/includes}} {{#platformIncludes}}-I{{.}} {{/platformIncludes}} {{src}} -o{{tgt}}' - linkCmd: 'arm-linux-androideabi-g++ --sysroot={{android_sysroot}} -lEGL -lGLESv1_CM -lGLESv2 {{#src}}{{.}} {{/src}} -o {{tgt}} -Wl,-soname=libdmengine.so {{#defines}}-D{{.}} {{/defines}} -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -landroid -fpic -z text {{#ext.libPaths}}-L{{.}} {{/ext.libPaths}} -Wl,-Bstatic -Wl,--start-group {{#ext.libs}}-l{{.}} {{/ext.libs}} -Wl,--end-group {{#libPaths}}-L{{.}} {{/libPaths}} -Wl,-Bstatic {{#engineLibs}}-l{{.}} {{/engineLibs}} -Wl,-Bdynamic -lOpenSLES -lm -llog -lc -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared' - libCmd: 'arm-linux-androideabi-ar rcs {{tgt}} {{#objs}}{{.}} {{/objs}}' - javacCmd: 'javac -source 1.6 -target 1.6 -d {{classesDir}} -classpath {{classPath}} @{{sourcesListFile}}' - jarCmd: 'jar cvf {{outputJar}} -C {{classesDir}} .' - dxCmd: 'dx --dex --output {{classes_dex}} {{#jars}}{{.}} {{/jars}} {{#engineJars}}{{.}} {{/engineJars}}' + exePrefix: 'lib' + exeExt: '.so' + shlibRe: 'lib(.+)\.so' + stlibRe: 'lib(.+)\.a' + sourceRe: '(?i).+(\.cpp|\.c|\.cc|\.cxx|\.c\+\+)$' + javaSourceRe: '(?i).+(\.java)$' + writeLibPattern: 'lib%s.a' + writeExePattern: 'libdmengine.so' + allowedLibs: ["gnustl_static","supc\\+\\+","c","m","m_hard","stdc\\+\\+",] + allowedFlags: ["-Wa,{{comma_separated_arg}}","-W{{warning}}","-ansi","--ansi","-std-default={{arg}}","-stdlib=(libstdc\\+\\+|libc\\+\\+)","-w","-std=(c89|c99|c\\+\\+0x|c\\+\\+11|c\\+\\+14|c\\+\\+17)","-Wp,{{comma_separated_arg}}","-W{{warning}}","--extra-warnings","--warn-{{warning}}","--warn-={{warning}}","-ferror-limit={{number}}","-O([0-4]?|fast|s|z)"] + compileCmd: 'arm-linux-androideabi-g++ -c -g -gdwarf-2 -fpic -ffunction-sections -fstack-protector -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -fno-exceptions -funwind-tables --sysroot={{android_sysroot}} -DANDROID -Wa,--noexecstack {{#defines}}-D{{.}} {{/defines}} {{#ext.includes}}-I{{.}} {{/ext.includes}} {{#includes}}-I{{.}} {{/includes}} {{#platformIncludes}}-I{{.}} {{/platformIncludes}} {{src}} -o{{tgt}}' + linkCmd: 'arm-linux-androideabi-g++ --sysroot={{android_sysroot}} -lEGL -lGLESv1_CM -lGLESv2 {{#src}}{{.}} {{/src}} -o {{tgt}} -Wl,-soname=libdmengine.so {{#defines}}-D{{.}} {{/defines}} -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -landroid -fpic -z text {{#ext.libPaths}}-L{{.}} {{/ext.libPaths}} -Wl,-Bstatic -Wl,--start-group {{#ext.libs}}-l{{.}} {{/ext.libs}} -Wl,--end-group {{#libPaths}}-L{{.}} {{/libPaths}} -Wl,-Bstatic {{#engineLibs}}-l{{.}} {{/engineLibs}} -Wl,-Bdynamic -lOpenSLES -lm -llog -lc -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared' + libCmd: 'arm-linux-androideabi-ar rcs {{tgt}} {{#objs}}{{.}} {{/objs}}' + javacCmd: 'javac -source 1.6 -target 1.6 -d {{classesDir}} -classpath {{classPath}} @{{sourcesListFile}}' + jarCmd: 'jar cvf {{outputJar}} -C {{classesDir}} .' + dxCmd: 'dx --dex --output {{classes_dex}} {{#jars}}{{.}} {{/jars}} {{#engineJars}}{{.}} {{/engineJars}}' js-web: + env: + EM_CACHE: "{{build_folder}}" context: engineJsLibs: [] engineLibs: ["engine_main", "engine_foo"] @@ -119,13 +126,43 @@ platforms: emscriptenFlags: ["PRECISE_F32=2", "AGGRESSIVE_VARIABLE_ELIMINATION=1", "TOTAL_MEMORY=268435456", "DISABLE_EXCEPTION_CATCHING=1", "EXPORTED_FUNCTIONS=[\"_main\"]"] libs: [] - exePrefix: '' - exeExt: '.js' - shlibRe: 'lib(.+).so' - stlibRe: 'lib(.+).a' - sourceRe: '(?i).*(\.cpp|\.c|\.cc|\.cxx|\.c\+\+)' - allowedLibs: [] - allowedFlags: ["-Wa,{{comma_separated_arg}}","-W{{warning}}","-ansi","--ansi","-std-default={{arg}}","-stdlib=(libstdc\\+\\+|libc\\+\\+)","-w","-std=(c89|c99|c\\+\\+0x|c\\+\\+11|c\\+\\+14|c\\+\\+17)","-Wp,{{comma_separated_arg}}","-W{{warning}}","--extra-warnings","--warn-{{warning}}","--warn-={{warning}}","-ferror-limit={{number}}","-O([0-4]?|fast|s|z)"] - compileCmd: 'em++ -c -O3 -g {{#defines}}-D{{{.}}} {{/defines}} {{#flags}}{{{.}}} {{/flags}} {{#ext.includes}}-I{{{.}}} {{/ext.includes}} {{#includes}}-I{{{.}}} {{/includes}} {{src}} -o {{tgt}}' - linkCmd: 'em++ {{#src}}{{{.}}} {{/src}} -o {{tgt}} -O3 {{#linkFlags}}{{{.}}} {{/linkFlags}} {{#emscriptenFlags}}-s {{{.}}} {{/emscriptenFlags}} {{#ext.libPaths}}-L{{{.}}} {{/ext.libPaths}} {{#libPaths}}-L{{{.}}} {{/libPaths}} {{#libs}}-l{{{.}}} {{/libs}} {{#ext.libs}}-l{{{.}}} {{/ext.libs}} {{#engineLibs}}-l{{{.}}} {{/engineLibs}} {{#ext.jsLibs}}--js-library {{{.}}} {{/ext.jsLibs}} {{#engineJsLibs}}--js-library {{dynamo_home}}/lib/js-web/js/library_{{{.}}}.js {{/engineJsLibs}}' - libCmd: 'emar rcs {{tgt}} {{#objs}}{{{.}}} {{/objs}}' + exePrefix: '' + exeExt: '.js' + shlibRe: 'lib(.+)\.so' + stlibRe: 'lib(.+)\.a' + sourceRe: '(?i).*(\.cpp|\.c|\.cc|\.cxx|\.c\+\+)' + writeLibPattern: 'lib%s.a' + writeExePattern: 'dmengine.js' + allowedLibs: [] + allowedFlags: ["-Wa,{{comma_separated_arg}}","-W{{warning}}","-ansi","--ansi","-std-default={{arg}}","-stdlib=(libstdc\\+\\+|libc\\+\\+)","-w","-std=(c89|c99|c\\+\\+0x|c\\+\\+11|c\\+\\+14|c\\+\\+17)","-Wp,{{comma_separated_arg}}","-W{{warning}}","--extra-warnings","--warn-{{warning}}","--warn-={{warning}}","-ferror-limit={{number}}","-O([0-4]?|fast|s|z)"] + compileCmd: 'em++ -c -O3 -g {{#defines}}-D{{{.}}} {{/defines}} {{#flags}}{{{.}}} {{/flags}} {{#ext.includes}}-I{{{.}}} {{/ext.includes}} {{#includes}}-I{{{.}}} {{/includes}} {{src}} -o {{tgt}}' + linkCmd: 'em++ {{#src}}{{{.}}} {{/src}} -o {{tgt}} -O3 {{#linkFlags}}{{{.}}} {{/linkFlags}} {{#emscriptenFlags}}-s {{{.}}} {{/emscriptenFlags}} {{#ext.libPaths}}-L{{{.}}} {{/ext.libPaths}} {{#libPaths}}-L{{{.}}} {{/libPaths}} {{#libs}}-l{{{.}}} {{/libs}} {{#ext.libs}}-l{{{.}}} {{/ext.libs}} {{#engineLibs}}-l{{{.}}} {{/engineLibs}} {{#ext.jsLibs}}--js-library {{{.}}} {{/ext.jsLibs}} {{#engineJsLibs}}--js-library {{dynamo_home}}/lib/js-web/js/library_{{{.}}}.js {{/engineJsLibs}}' + libCmd: 'emar rcs {{tgt}} {{#objs}}{{{.}}} {{/objs}}' + + x86_64-win32: + env: + TMP: "{{build_folder}}" + TEMP: "{{build_folder}}" + WINEPATH: "C:/Program Files (x86)/MSBuild/14.0/bin;C:/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/IDE/;C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_amd64;C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN;C:/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/Tools;C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319;C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/VCPackages;C:/Program Files (x86)/HTML Help Workshop;C:/Program Files (x86)/Microsoft Visual Studio 14.0/Team Tools/Performance Tools;C:/ProgramFilesx86/WindowsKits/8.1/bin/x64;C:/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.6.1 Tools/" + context: + engineLibs: ["engine_main", "engine_foo"] + libPaths: ["{{dynamo_home}}/lib/x86_64-win32","{{dynamo_home}}/ext/lib/x86_64-win32","C:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/LIB/amd64","C:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/ATLMFC/LIB/amd64","C:/ProgramFilesx86/WindowsKits/10/lib/10.0.10240.0/ucrt/x64","C:/ProgramFilesx86/WindowsKits/NETFXSDK/4.6.1/lib/um/x64","C:/ProgramFilesx86/WindowsKits/8.1/lib/winv6.3/um/x64"] + platformIncludes: ["C:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/INCLUDE","C:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/ATLMFC/INCLUDE","C:/ProgramFilesx86/WindowsKits/10/include/10.0.10240.0/ucrt","C:/ProgramFilesx86/WindowsKits/NETFXSDK/4.6.1/include/um","C:/ProgramFilesx86/WindowsKits/8.1/include/shared","C:/ProgramFilesx86/WindowsKits/8.1/include/um","C:/ProgramFilesx86/WindowsKits/8.1/include/winrt"] + defines: ["DM_PLATFORM_WINDOWS"] + flags: [] + linkFlags: [] + libs: ["OpenGL32", "User32", "shell32", "Xinput9_1_0", "WS2_32", "IPHlpApi"] + + exePrefix: '' + exeExt: '.exe' + shlibRe: '(.+)\.(dll|Dll|DLL)' + stlibRe: '(.+)\.(lib|Lib|LIB)' + sourceRe: '(?i).*(\.cpp|\.c|\.cc|\.cxx|\.c\+\+)' + writeLibPattern: '%s.lib' + writeExePattern: 'dmengine.exe' + allowedLibs: ["comsupp.lib","comsuppd.lib","comsuppw.lib","comsuppwd.lib","concrt.lib","concrtd.lib","delayimp.lib","iso_stdio_wide_specifiers.lib","legacy_stdio_definitions.lib","legacy_stdio_wide_specifiers.lib","libcmt.lib","libcmtd.lib","libconcrt.lib","libconcrt1.lib","libconcrtd.lib","libconcrtd0.lib","libconcrtd1.lib","libcpmt.lib","libcpmt1.lib","libcpmtd.lib","libcpmtd0.lib","libcpmtd1.lib","libvcruntime.lib","libvcruntimed.lib","msvcmrt.lib","msvcmrtd.lib","msvcprt.lib","msvcprtd.lib","msvcrt.lib","msvcrtd.lib","msvcurt.lib","msvcurtd.lib","oldnames.lib","pgobootrun.lib","pgort.lib","ptrustm.lib","ptrustmd.lib","ptrustu.lib","ptrustud.lib","vcamp.lib","vcampd.lib","vccorlib.lib","vccorlibd.lib","vcomp.lib","vcompd.lib","vcruntime.lib","vcruntimed.lib","VsGraphicsHelper.lib","atls.lib","comsupp.lib","comsuppd.lib","comsuppw.lib","comsuppwd.lib","concrt.lib","concrtd.lib","delayimp.lib","iso_stdio_wide_specifiers.lib","legacy_stdio_definitions.lib","legacy_stdio_wide_specifiers.lib","libcmt.lib","libcmtd.lib","libconcrt.lib","libconcrt1.lib","libconcrtd.lib","libconcrtd0.lib","libconcrtd1.lib","libcpmt.lib","libcpmt1.lib","libcpmtd.lib","libcpmtd0.lib","libcpmtd1.lib","libvcruntime.lib","libvcruntimed.lib","msvcmrt.lib","msvcmrtd.lib","msvcprt.lib","msvcprtd.lib","msvcrt.lib","msvcrtd.lib","msvcurt.lib","msvcurtd.lib","oldnames.lib","pgobootrun.lib","pgort.lib","ptrustm.lib","ptrustmd.lib","ptrustu.lib","ptrustud.lib","vcamp.lib","vcampd.lib","vccorlib.lib","vccorlibd.lib","vcomp.lib","vcompd.lib","vcruntime.lib","vcruntimed.lib","VsGraphicsHelper.lib","atls.lib","libucrt.lib","libucrtd.lib","ucrt.lib","ucrtd.lib","alink.lib","corguids.lib","format.lib","mscoree.lib","mscorsn.lib","tlbref.lib","AclUI.Lib","ActiveDS.Lib","ADSIid.Lib","AdvAPI32.Lib","advpack.Lib","ahadmin.lib","alink.lib","amstrmid.lib","api-ms-win-net-isolation-l1-1-0.lib","appmgmts.lib","appmgr.lib","appnotify.lib","audiobaseprocessingobject.lib","audioeng.lib","audiomediatypecrt.lib","AuthZ.Lib","aux_ulib.lib","avifil32.Lib","avrt.lib","basesrv.lib","bcrypt.lib","Bits.Lib","BluetoothApis.lib","bthprops.lib","BufferOverflow.lib","BufferOverflowU.lib","Cabinet.Lib","certadm.lib","certca.lib","certcli.lib","CertIdl.Lib","CertPolEng.Lib","cfgmgr32.lib","clfsmgmt.lib","clfsw32.lib","ClusApi.Lib","ComCtl32.Lib","ComDlg32.Lib","CompPkgSup.lib","compstui.lib","ComSvcs.Lib","corguids.lib","corrEngine.lib","credui.lib","Crypt32.Lib","cryptdll.lib","CryptNet.Lib","cryptui.lib","cryptxml.lib","cscapi.lib","cscdll.lib","d2d1.lib","d3d10.lib","d3d10_1.lib","d3d11.lib","d3d9.lib","d3dcompiler.lib","d3dcsx.lib","d3dcsxd.lib","davclnt.lib","DbgEng.Lib","DbgHelp.Lib","dciman32.lib","dcomp.lib","ddraw.lib","devenum.lib","deviceaccess.lib","devmgr.lib","dflayout.lib","DhcpCSvc.Lib","DhcpCSvc6.Lib","dhcpsapi.lib","difxapi.lib","dinput8.lib","dloadhelper.lib","dmoguids.lib","DnsAPI.Lib","dnscrcli.lib","dnslib.lib","dnsperf.lib","dnsrpc.lib","dnsrslvr.lib","dpx.lib","drt.lib","drtprov.lib","drttransport.lib","dsound.lib","DSProp.Lib","dssec.lib","dststlog.lib","DSUIExt.Lib","DtcHelp.Lib","dwmapi.lib","dwrite.lib","dxgi.lib","dxguid.lib","dxtmsft.lib","dxtrans.lib","dxva2.lib","eappcfg.lib","eappprxy.lib","easregprov.lib","efswrt.lib","ehstorguids.lib","elfapi.lib","els.lib","ElsCore.lib","esent.lib","evr.lib","evr_vista.lib","FaultRep.Lib","feclient.lib","FhSvcCtl.lib","fileextd.lib","fltLib.lib","fontsub.lib","format.lib","FrameDyd.Lib","FrameDyn.Lib","fwpuclnt.lib","fxsutility.lib","Gdi32.Lib","gdiplus.lib","glmf32.lib","GlU32.Lib","GPEdit.Lib","gpmuuid.lib","hbaapi.lib","hhsetup.lib","hid.lib","HLink.Lib","Htmlhelp.Lib","httpapi.lib","iashlpr.lib","Icm32.Lib","Icmui.Lib","IEPMAPI.Lib","iesetup.lib","ImageHlp.Lib","imgutil.Lib","Imm32.Lib","infocardapi.Lib","inseng.lib","IPHlpApi.Lib","Iprop.Lib","irprops.lib","iscsidsc.lib","jsrt.lib","kerbcli.lib","kernel32.Lib","KSProxy.Lib","ksuser.lib","ktmw32.lib","LoadPerf.Lib","locationapi.lib","Lz32.Lib","magnification.lib","MAPI32.Lib","mbnapi_uuid.lib","mciole32.lib","MDMRegistration.lib","Mf.lib","Mfcore.lib","Mfplat.lib","Mfplat_vista.lib","mfplay.lib","mfreadwrite.lib","Mfsrcsnk.lib","mfuuid.lib","Mf_vista.lib","MgmtAPI.Lib","mi.lib","mincore.lib","mincore_downlevel.lib","MMC.Lib","mmdevapi.lib","Mpr.Lib","Mprapi.Lib","mprsnap.lib","MqOA.Lib","MqRt.Lib","msaatext.lib","MSAcm32.Lib","Mscms.Lib","mscoree.lib","mscorsn.lib","MsCtfMonitor.lib","msdasc.lib","msdelta.lib","msdmo.lib","msdrm.lib","Msi.Lib","MSImg32.Lib","mspatcha.lib","mspatchc.lib","mspbase.lib","msports.lib","MSRating.Lib","MSTask.Lib","msv1_0.lib","msvfw32.Lib","MsWSock.Lib","MsXml2.Lib","msxml6.lib","Mtx.Lib","mtxdm.lib","muiload.lib","ncrypt.lib","nddeapi.lib","ndfapi.lib","ndproxystub.lib","NetAPI32.Lib","netlib.lib","NetSh.Lib","newdev.lib","ninput.lib","normaliz.lib","nt.lib","ntdll.lib","ntdsa.lib","NtDsAPI.Lib","ntdsatq.lib","ntdsetup.lib","ntfrsapi.lib","ntlanman.lib","ntmarta.lib","NtQuery.Lib","ntstc_libcmt.lib","ntstc_msvcrt.lib","objsel.lib","odbc32.lib","odbcbcp.lib","odbccp32.lib","OemLicense.lib","Ole32.Lib","OleAcc.Lib","OleAut32.Lib","olecli32.lib","oledb.lib","OleDlg.Lib","olesvr32.lib","ondemandconnroutehelper.lib","OpenGL32.Lib","osptk.lib","p2p.lib","p2pgraph.lib","pathcch.lib","Pdh.Lib","PeerDist.lib","PhotoAcquireUID.lib","PortableDeviceGuids.lib","powrprof.lib","prntvpt.lib","propsys.lib","Psapi.Lib","quartz.lib","query.lib","qutil.lib","qwave.lib","RASAPI32.Lib","RASDlg.Lib","rasuser.lib","resutils.lib","rometadata.lib","rpcexts.lib","Rpcns4.Lib","rpcproxy.lib","RpcRT4.Lib","rpcutil.lib","rstrtmgr.lib","Rtm.Lib","rtutils.lib","RTWorkQ.lib","runtimeobject.lib","samlib.lib","samsrv.lib","SAPI.Lib","sas.lib","sbtsv.lib","SCardDlg.Lib","scecli.lib","scesrv.lib","schannel.lib","ScrnSave.Lib","ScrnSavW.Lib","SearchSDK.lib","Secur32.Lib","security.lib","sens.lib","SensAPI.Lib","sensorsapi.lib","SetupAPI.Lib","Sfc.Lib","shcore.lib","shdocvw.lib","shell32.lib","ShFolder.Lib","ShLwApi.Lib","sisbkup.lib","slc.lib","slcext.lib","slwga.lib","SnmpAPI.Lib","spoolss.lib","SpOrder.Lib","SrClient.lib","ssdpapi.lib","Sti.Lib","strmbase.lib","strmiids.lib","strsafe.lib","structuredquery.lib","Svcguid.Lib","swdevice.lib","synchronization.lib","t2embed.lib","Tapi32.Lib","tapi32l.lib","taskschd.lib","tbs.lib","tdh.lib","tlbref.lib","Traffic.Lib","TranscodeImageUID.lib","tsec.lib","tspubplugincom.lib","twinapi.lib","txfw32.lib","ualapi.lib","UIAutomationCore.lib","umpdddi.lib","Urlmon.Lib","User32.Lib","UserEnv.Lib","USP10.Lib","Uuid.Lib","Uxtheme.lib","vccomsup.lib","vds_uuid.lib","Version.Lib","Vfw32.Lib","Virtdisk.Lib","vscmgr.lib","vssapi.lib","vss_uuid.lib","vstorinterface.lib","wbemuuid.lib","wcmapi.lib","wcmguid.lib","wdsbp.lib","wdsClientAPI.LIB","wdsmc.lib","wdspxe.lib","wdstptc.lib","WebServices.lib","websocket.lib","wecapi.lib","WER.LIB","wevtapi.lib","WiaGuid.Lib","wiaservc.lib","wiautil.lib","WinBio.lib","windows.data.pdf.lib","windows.networking.lib","windows.ui.lib","windowscodecs.lib","windowssideshowguids.lib","winfax.lib","winhttp.lib","WinInet.Lib","WinMM.Lib","winsatapi.lib","winscard.lib","WinSpool.Lib","winsta.lib","WinStrm.Lib","WinTrust.Lib","winusb.lib","wlanapi.lib","wlanui.lib","Wldap32.Lib","wmcodecdspuuid.lib","wmdrmsdk.lib","wmip.lib","wmiutils.lib","wmvcore.lib","wnvapi.lib","workspaceax.lib","WS2_32.Lib","wsbapp_uuid.Lib","wsbonline.lib","wscapi.lib","wsclient.lib","wsdapi.lib","wsmsvc.lib","WSnmp32.Lib","WSock32.Lib","WtsApi32.Lib","wuguid.lib","xapobase.lib","xaswitch.lib","xaudio2.lib","Xinput.lib","Xinput9_1_0.lib","xmllite.lib","xolehlp.lib","xpsprint.lib"] + allowedFlags: ["//W([0-4]?|all|X)", "//w([1-4]?|d|e|o)[0-9]{4}", "//O([1-2]?|b|d|g|i|s)", "//openmp"] + compileCmd: 'wine cl.exe /nologo /TP /O2 /Oy- /Z7 /MT /D__STDC_LIMIT_MACROS /DWINVER=0x0600 /D_WIN32_WINNT=0x0600 /DWIN32 /D_CRT_SECURE_NO_WARNINGS /wd4200 /W3 /EHsc {{#defines}}/D{{{.}}} {{/defines}} {{#flags}}{{{.}}} {{/flags}} {{#ext.includes}}/I{{{.}}} {{/ext.includes}} {{#includes}}/I{{{.}}} {{/includes}} {{#platformIncludes}}/I{{.}} {{/platformIncludes}} {{src}} /c /Fo{{tgt}}' + linkCmd: 'wine link.exe {{#src}}{{{.}}} {{/src}} /OUT:{{tgt}} /NOLOGO /MANIFEST {{#ext.libPaths}}/LIBPATH:{{{.}}} {{/ext.libPaths}} {{#libPaths}}/LIBPATH:{{{.}}} {{/libPaths}} {{#libs}}{{{.}}}.lib {{/libs}} {{#ext.libs}}{{{.}}}.lib {{/ext.libs}} {{#engineLibs}}{{{.}}}.lib {{/engineLibs}}' + libCmd: 'wine lib.exe /nologo /OUT:{{tgt}} {{#objs}}{{{.}}} {{/objs}}' + mtCmd: 'wine mt.exe /nologo -manifest {{tgt}}.manifest -outputresource:{{tgt}};1' diff --git a/server/test-data/sdk/a/defoldsdk/lib/js-web/libengine_foo.a b/server/test-data/sdk/a/defoldsdk/lib/js-web/libengine_foo.a new file mode 100644 index 0000000000000000000000000000000000000000..a4398952d35aa081da5df7abedf6b0d2da683e3f GIT binary patch literal 1364 zcmb7EO-y4|6uzBTdYe*8J0;rMzUFnRhNg_X7N&rJnYNKYU;!~E8clfR&niM+TkNkU z?Y!y*CFU`>Xv2nDH4-*MaAD&tps)aJ48g=8Ap|nxWEMzRsF|IfmYK1%IQW@p0q@)RR1~ zu?}!v1lU>D+1v~~?T&{`IfdJ^c4Sr}^fa)ozQLeNKw1j}rz~@>EoqNT?P$9xNh_bL zlIu;kj=EO4u2_?Zn1(USgFiteqC8wrVj1F0;#fTibQ91{7Ds)AXYiV_n4<6HjHpN-GG)ks;4E~r;2y$e~ zN1PDA6DLQ4avVbPNR&9cafBr?*p(zsNVea?G1!x7`PvpJFaZWnUN2r^X4zopzfq|V%_Dw zk7ldWBYkRJNXqrg&}S)Bl$ZD2;xi=N4}}VGp1cRg@GXwOsrX1thk;{skpy{CGup43 zK(#p0Hgsa@G0Y8*`Bi=_aAqr0**2-}sdR{S2L1SKI)S++J1dJ*h1 zRG-*&NxS)zZn!$sPOaGH7kU#RDjO&SQWBRdpBEN>jK$h|^PXjGNS_!_yguJ6ykQF^ ztm6v?nC5MvaeMVb-jEm<#`P5pv(~n{ZnqgMLe{)$U(Ky(EJ9&vdnK!1&>IBncQe_P zb-A!o==s0+RL;7Q)!4pIZKtwxODU^ic_ue!wHTHQ+l3jcC9hx2X7$U~`K6wp)zVk@ z_fHSr+}qkYy#JL{f?{wt4ydcC7k+O?8R_3_=vtBNN~MbYrORxB=!~@TtLS yrLKmuE%##jGSsY*vdW4QG;TW*G!i>{mJ^c$?(6zAC8_*Fo>HUd)l%5-Q2qjY<*WJt literal 0 HcmV?d00001 diff --git a/server/test-data/sdk/a/defoldsdk/lib/js-web/libengine_main.a b/server/test-data/sdk/a/defoldsdk/lib/js-web/libengine_main.a new file mode 100644 index 0000000000000000000000000000000000000000..dd0329eb95486f08788b48c2c10573def3f15e8a GIT binary patch literal 1392 zcmb7EPfR0K7=L9-UoGv>S`O59n&~!c+H_Z@EnBF7*|v%$a3}{8*FRwjf<*#OJJ`Q5 zX_@K+#iT4AXxIZ|S0mvf!Gnz)pl|?elwe|z5VB;~%^r|&P_q}KuO%2XdhnaP?|XUQ zzu))X_l>DN7#RpXr)Z-8PWEPZ^}FGuX{M^W%xT)udSTBh000uaR{LJD+Xu(q93C6& z8x0PR4F>`Ppy{81FWmk^Ivp1ZR&goT^|$!zvBCbnmcapc|Bxg2%-c;0MbkN?3kUi# z<{L~U(7Az~VO-74G;Oz6c!gMn*SB_LQUajI$m=F(P=gE5;srD28PArqOQv?XZ%eYu ztF>~SQTkzjTKz(e_ja8(t9CTB${V{C4)3Ht*FgI^CqD%`hxdV>%xSJ{20Xo)>0{xi z52U6}S#Ki%JvgR*$o%*ZOp=^DYC(xP?xa~A{SA;i&e%}~lv4@CngQAeVx z>@k)^YDZMvJEr#5sYjyWfvDQaPfI}`8MdXkN@>m?X{4mC#1olcJ7f!kW$3fX-*bf?aB=q4ib+AU2)-eWESz1eov~Ixo z|1H$#)xzgcjDblEhD9+sO#X!gbm4oeG?aD%fGHXP72Z3p$e*C!cu%UmayN_F{j8X4 zc(P}5x-OgTQCoN^%e9ls1ti&|1Y>X6b;~lg(QdG!PoH>jN#h}p+qCZ zSmO&Q!XedQfE)$&xQNICvhW0hRtKcP=lmn($|{ZnD*k{jzfMf ztb7RSe^!&fq)DgJi<^P^Rx}JTwN*1gUnV-Xd>zw7M>#%?`!*%V4}v({z#I{c<8eT` zvW7g#k;hE^7*l`$j64gFPW2{rgxl3bm4e10W~yyfXxsI0n{h0;7*>aoAWI_2C|FM3Ff>hM8-pXXNQU^4B%;1cYe-YH>X>=6C*e z?MIpB&F_F;xVwmtK#&GNjipxVxmJ;te}(iaQxU+afsE3rkuyp`GhqjU#$yNWEFmGV T?&+IgruP<*JpX>h@|^wzAQ7{y literal 0 HcmV?d00001 diff --git a/server/test-data/sdk/a/defoldsdk/lib/x86-win32/engine_foo.lib b/server/test-data/sdk/a/defoldsdk/lib/x86-win32/engine_foo.lib new file mode 100644 index 0000000000000000000000000000000000000000..748a097c79e99bd8ec511027f08bc1b219ecba2d GIT binary patch literal 8390 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 TEoKE*fw*WeKi?Sw{}}K;Mh_?( literal 0 HcmV?d00001 diff --git a/server/test-data/sdk/a/defoldsdk/lib/x86-win32/engine_main.lib b/server/test-data/sdk/a/defoldsdk/lib/x86-win32/engine_main.lib new file mode 100644 index 0000000000000000000000000000000000000000..91f38d94ba013427f1f1e0b34153fc927515519b GIT binary patch literal 8448 zcmbtaO>7&-6@H{BS&^QnWyTUV81lK+&FhE9f*pfdWmxZ+G@byy41MP$d{n7z8?)AKy;4;+_+433=wn9uhrX8wD$JnjwP&iD%ehU#3~!)~TwEK@j;+ixhBxf;6nHOp z$BXXy^&x~{7>lcDZg1Oa+jPv$YNTHr(Q{q12bR2qYG>lAd62{OSCu_wAMVeor>GD} z`ZgrJ6jyQADmSA&p-O#SFa|BlKQV_+A=2Zd6JLIQ^Rvv^zWa9;{`L3!fBflRM7{uh z2{D|+)yifgI-kc%^}37}vc{Ngt}8Aw#=FL-s?-e}N0f)uuo$*QQ}Gg3$i%q&K(oZ9Fl(Xyv5W zwH}4alrCO0Oy4;+jPoV!VU0@7QFhI&USR)^OWz35bqw)u0L%bJqYix& z(4XV?9OxXs8I0cv(8-GxE{N<~7Lhc5`(-}eFLUW=FU7h)5P3zOOLG}x{&~c~ z$^adPiCxO-X`qX8v?pzy!1xa% z-)44s0d(?toYG>ReM(8q+*M(|U*H}Z6{`mO`8>}{vso#7JhV$%swF?4MgAozSvAMD zh(Ev1Dd8H@z?xUv<~Whgx~C&_*22cX)s4Cskusv$Z)?=0Z((^2bvWET=IoB!L>Bkrd-yf5fMV@ng1mDrQ$^17E2a`#81u26+ zH(Af0cOhRwzNz^-%R1-eY4CDRzN*vLkUoGtIVahEbWR$`AJJVG=j4yh%`9>$shay% z(hdDDv0G+I zc?BAeeWKb5yfwIA)Uw*$RJO`7srXq~L?Yg-|8m%Lh> zTUvI{on95M&E$a`U^J}S{;t)G*gti^^MNYhE(3=RuZBDSLC4tKu3`HdZHN3RQS-It zu1D7WBOT*1=N?!J=5~7>jL*7bH%pFJ;Q1KT!5A%BC9~SjkMX%>Tex^}G=L&tCdew9elsf8E74 zOs)I#3D(Tc|MPA`#z8U2Pd!OtZs`XG3)8q zTEtyjpRxaQkj?&&L-r@n><{BE`sfs6=v|G>lNQ$$cbofD;K_uqhL&|VXV~%zFy&N&OgnW!%?pcAn{yvW5Ox!K&_E^##?&4bi|Hhg2 z;B_+XaTa=Xc~$!O3hzVT4m`!mj)hMwXN;EaSz%4v zXD`LQnLjUZBZm_W=SV^tm5;C={RntZYP=VoLchqPfa_AjeEzBQM3hGm`m&JV!Ledm3oAM1HQ8U8%rIhuNeeGuGlCFQ%I#db!Y zbJ&JIKX`}4Hc~+=p6||rqhHFZWZ76crA4eB!#vt>>#{!X^}0kw z+?m~&SzOsDRmZ&h-(TvsGBvAeZCggBaLdT7UPj!{7@7N1MrOHSWaf&+^}^h2acOaR zu~1x|o?TmA2leja%ANVOce9VPSMaC^E)XUz^LM2XQe7fTXV(hF_4(P`YxBjG)#Bah zwUxz{1+??1Jb9V*?@kz*`I`;?l#C4i?n*3Y{y=N?3F){j zxX**S$b~1racY$wH136ih?;m@y*9*~&4iftc1eb1eh9dATlKgTcvP4hqExct_S9qD z3s`-HSU}e2!Ft-g#q}C!`#l(zAsKQTq}<E=jD&_Fd8*lwM_Lo*-sfqJwV-roMg9 zzXKM7cEG;ECI@Vd@tEAxUxTutzXs%o0qv83_UnN5n}GHb4rgp-P)_Nu0m<_&f2>me z^g(aptFI_EzokrPESvpVLJmAi^sO2dr6cb)WUhIxgf-lvFL-dWBJ?=^HmHKcP zi@Z;>fu4kKqo2I?+kbFa_;wz?iSvoOC&AZgzDP5q#DDho6-bGJ0pP>+(f>8@U-siU AlK=n! literal 0 HcmV?d00001 diff --git a/server/test-data/sdk/a/defoldsdk/lib/x86_64-win32/engine_foo.lib b/server/test-data/sdk/a/defoldsdk/lib/x86_64-win32/engine_foo.lib new file mode 100644 index 0000000000000000000000000000000000000000..e157a469dc21f81523edc0e2d7086fe6d3ae5875 GIT binary patch literal 8304 zcmbtZ&2w8<6+im0>$+(oIV3HiEw3S=Nn6=+?AnQF6Zu0)UHp;S%14VQ@{@FJtMjC1 zq$elt48?3Hvmf=6>46pz;%&_T#?%2Sdg4Zo|hSKXPky2^5QqnD}Su3|K)yn16u4-7Nmf3Dr)Qm@$D_}47 z&7RAd&e*D?P-0ygOdf4T}u}iLaymjYn^v%eit; z^SM6zX}9#PkO;GA`r0Ek&E@Q_V1^gb$Cao)tnH@KtC-wCpYD>5DvJujYGkU&ncHfd?X!d+mGY4{Te^uL6&BOXU^$-pGkzT+^C!-qH&1yTW z2}K&{gVFC<{sotN8i^4n6?^fMuiW_MkAHstcQX$@{>_!2OpAODI-*+0iH%yh74qlN z%FYg|>GMNKgR+>eKmx{r;}RQ*Be&diT!vEojlhnUxH6AN2atGx7*rh7rIrCq4FaZ;-_EY)o2#zpFXTn0}QC4)%+z{C$@ z26iBC4Dt_4JT(ORF_dO8eVb$DnOO^k|H&Z2xy zDrUoKVv`iKxgcB%T3EXpTbw8M<=8Z!vlSM2TQJ{US!O*H`7 zJwf{RU*ebHkof&OK-1_iUK|ycIqng45uOKIjJojyBkLAIJZ<5`6ZjkE(}^c_y@Az} z@nRP-A>qb^(~!9*CLA$(WNbKsH$qa|&$-^vPCvp#c=4FDEXwrFQ}`YBO_t9fNjxrJ zWscADO}6v=F5rvFGcI3mU9V4m4ZQTpXWjfc&+}O2 zJ$#WyOnw7-7?UhtK;n7u1?KoXtOa!e)<)d;e-XUI+Kb3%U5s&z0Aq1^3FSz^-MCDC z4`ZCiByjYyO(UIn>(62~iXsP!u#k%(ZefWb4K^zGharC#9PBy?pk8vssGT?beUZMS zH?2CI$BAVvtVmc%+&Gtz&8EV-!n&k1RNHFm-acwT%BHm~cFY@aV_p_I^jN7^B!DWk zhlkkM4+Vt0|JzqBN(cHL&kVHNubsV(y{{mR*cw9~#um$yNW|6zb9^4Qg1TO8y#iih zYYMrCEso(!iDSr#Q*oIN(|pODHJSV(ySmX<_WTlCmu(v9k=XLP54!4qerX$?y=a?{ zVVn2*!&Jlpwd-I=5e}2`J&htJ>mcsz!x80Y8hf{R*mUESnltANz10e6*q_g>EG=*w zyQx={Q{m!qP*hiivjz`|T2l40YC7CDUQ?u5+h#RH(?adTmBe@cP+ia&>-Hg&BWHLR zXKaZDb-{3MT|(V3%(8BT2Xl3iq+2(SQ));?8B!sOxc#I8y>IGG>`7sraGR{FYgZ*@ zm%Lh-UtF@!k4_V(&-lLVV>ZmjUfpbm?4R7{`9KwMCxOF;)57+D&@nf+8rc4Z`yqc) zRH4zXJ7iZs(lIad_JO6SZ*{l9{H$5ccExfkoEU>Pn4?9rq8r`(n4g8kOy)+3*eK%kahb zui4m!sa<_Oz9>;O-PJD+C?o#X!*{0i+RNl^groQ}-@qqU^j0Y1? z-CKv-_V0M=TcC$yCChmv#>#8V@#WlgmHoJ)NE-N>@yfnPPRwK9Ud&_sNg(FUx_z-G zVm|AOvHS)SF}J`R-&GfLY~$_ah`Dd093hu|Rv@ppkK;TOcZ+U+tmzMTQN90v z^Gtj2TA21Y4>|fgD>&zo?ptk&5?K?m_##Gy&I)~WeTsi_^+a6@OM`_XI=T6hc({Gj|FdR_MQAe z=X7vKyjvNc%#Q9<%UmbmL#GGi9xPcx(viwY8%PJ8`49j2;U9i6^Y8!s2}ZVW^?!?e zOm5gOd7NQ>d>rKWI8q$#oNqt4#2=QcX?|Tl3ejyy??!xxa>`?$f^O)4u1^e&EwS^=W_gX?b4IkJhRm z-5ZE~@dee+Zz|my&1QcZlYNI0en^I8BoX6N^5HN1n2XB-@bDS=@E3kSrml$?pO6oK wqoK!Rc94j9*81~5-}r#j$%pOW!J6;Si5STqUy`=7KTm+9XqbrOpoQS^UkH>PYybcN literal 0 HcmV?d00001 diff --git a/server/test-data/sdk/a/defoldsdk/lib/x86_64-win32/engine_main.lib b/server/test-data/sdk/a/defoldsdk/lib/x86_64-win32/engine_main.lib new file mode 100644 index 0000000000000000000000000000000000000000..e29c0271a510d8c55c75b80824696fc01dba056a GIT binary patch literal 8360 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 diff --git a/server/test-data/testproject_appmanifest/ext/lib/armv7-android/libalib.a b/server/test-data/testproject_appmanifest/ext/lib/armv7-android/libalib.a index e76050b47a75817506d24ae49a89b134d8bb3466..286fbb92d4d9d2ad4c51ad1f000125a5289491e3 100644 GIT binary patch delta 29 ecmaE$_CRfdG`qQlxv{yS$wZ}{Fy_WbbwU7)YY9I9 delta 29 dcmaE$_CRfdG`oo<5Sp4!RN4t+ZhTZH1OSYf2}J+^ diff --git a/server/test-data/testproject_appmanifest/ext/lib/armv7-ios/libalib.a b/server/test-data/testproject_appmanifest/ext/lib/armv7-ios/libalib.a index c7f2efdd73bdb8e5484ecfa9313c708da1a0f07c..ef2db10a689c54cdc71516736f2c3cc8ff2047d2 100644 GIT binary patch delta 29 fcmbQhK7oCLG`qQlxv{yS9 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 SDLn-)1s|H^a;L_JB=tYF!sTNC literal 0 HcmV?d00001 diff --git a/server/test-data/testproject_appmanifest/ext/lib/x86_64-osx/libalib.a b/server/test-data/testproject_appmanifest/ext/lib/x86_64-osx/libalib.a index 69e6ba65bdd4c09e7178ce0454573b8e41b628ea..d6c83bbadaa07fcf397fdb048a8737a857e59230 100644 GIT binary patch delta 29 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 delta 30 ecmexn{LOfRG`oo<5Sp4zRJspiZsuToCjkJQ*9lSp diff --git a/server/test-data/testproject_appmanifest/ext2/lib/armv7-ios/libblib.a b/server/test-data/testproject_appmanifest/ext2/lib/armv7-ios/libblib.a index e53c1f073d599377a56e38323321a1832d60c328..1d1a90aa311deaee8a449dee11a8fab030803c61 100644 GIT binary patch delta 29 fcmdnMxq)+nG`qQlxv{yS}1Mk_V|hvEm^ delta 30 ecmX@YcZ6?(G`oo<5Sp4zRC)+wZsuaNVgmq(6$jz~ diff --git a/server/test-data/testproject_appmanifest/ext2/lib/x86-osx/libblib.a b/server/test-data/testproject_appmanifest/ext2/lib/x86-osx/libblib.a index bb71a321bd4c802f934c48f60100b3510543c56e..a79cdc5a24e46a2f534fa5a213979325f748b71b 100644 GIT binary patch delta 29 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 literal 0 HcmV?d00001 diff --git a/server/test-data/testproject_appmanifest/ext2/lib/x86_64-osx/libblib.a b/server/test-data/testproject_appmanifest/ext2/lib/x86_64-osx/libblib.a index ea0544c78225886b7238bf454116ddd95e9715b0..40686ccc480788f7b4e84dcdf3a8a229cee023c5 100644 GIT binary patch delta 29 fcmaFC^MYrBG`qQlxv{yS delta 29 fcmaFC^MYrBG`oo<5SkfIR5}S^nwo9=RK^MbiIoW| diff --git a/server/test-data/testproject_appmanifest/ext2/lib/x86_64-win32/blib.lib b/server/test-data/testproject_appmanifest/ext2/lib/x86_64-win32/blib.lib new file mode 100644 index 0000000000000000000000000000000000000000..9393dd10f8bcec033129a094ee1cfc48531bd628 GIT binary patch literal 10698 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 MlvBuS^Fzh|0M`ytlmGw# literal 0 HcmV?d00001