From 8b0c18ff7b517df1ff2dd621d5a8cecb68186180 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Fri, 5 May 2023 21:16:32 +0200 Subject: [PATCH 01/11] feat: ctest is passing --- docker/.emscripten | 10 ++++ docker/Dockerfile | 27 +++++++-- examples/generation/package-lock.json | 80 +++++++++++++++++++-------- package.json | 4 +- 4 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 docker/.emscripten diff --git a/docker/.emscripten b/docker/.emscripten new file mode 100644 index 0000000..6979e1d --- /dev/null +++ b/docker/.emscripten @@ -0,0 +1,10 @@ +import os +emsdk_path = os.path.dirname(os.getenv('EM_CONFIG')).replace('\\', '/') +# NODE_JS = emsdk_path + '/node/15.14.0_64bit/bin/node' +# NODE_JS = '/usr/local/bin/node' +NODE_JS = '/usr/bin/node' +LLVM_ROOT = emsdk_path + '/upstream/bin' +BINARYEN_ROOT = emsdk_path + '/upstream' +EMSCRIPTEN_ROOT = emsdk_path + '/upstream/emscripten' +COMPILER_ENGINE = NODE_JS +JS_ENGINES = [NODE_JS] diff --git a/docker/Dockerfile b/docker/Dockerfile index 60d48fa..e215de6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,6 +6,10 @@ FROM emscripten/emsdk:$EMSDK_VERSION # Installs build dependencies. RUN apt-get update && apt-get install -y bzip2 lzip ninja-build xz-utils +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - +RUN apt install -y nodejs +COPY ./.emscripten /emsdk/.emscripten + # Downloads and builds ZLIB. ARG ZLIB_VERSION RUN wget --no-verbose -qO- https://zlib.net/zlib-$ZLIB_VERSION.tar.gz | tar xvz --directory / @@ -26,7 +30,18 @@ RUN make install # Clones SWI-Prolog. ARG SWIPL_VERSION -RUN git clone --depth 1 --branch V$SWIPL_VERSION --recurse-submodules https://github.com/SWI-Prolog/swipl-devel /swipl-devel -j100 +RUN git clone --depth 1 --recurse-submodules https://github.com/SWI-Prolog/swipl-devel /swipl-devel -j100 + + +RUN git clone --depth 1 --branch pcre2-10.42 --recurse-submodules https://github.com/PCRE2Project/pcre2 /swipl-devel/pcre2 +WORKDIR /swipl-devel/pcre2 +RUN emcmake cmake -DCMAKE_INSTALL_PREFIX=/ \ + -DPCRE2GREP_SUPPORT_JIT=OFF \ + -DZLIB_LIBRARY=/zlib-1.2.13/libz.a \ + -DZLIB_INCLUDE_DIR=/zlib-1.2.13 \ + # -DGMP_ROOT=/gmp \ + -DUSE_GMP=OFF \ + -G Ninja .. $@ # Build SWIPL WORKDIR /swipl-devel/build.wasm @@ -35,7 +50,11 @@ RUN cmake -DCMAKE_TOOLCHAIN_FILE=/emsdk/upstream/emscripten/cmake/Modules/Platfo -DCMAKE_BUILD_TYPE=Release \ -DZLIB_LIBRARY=/zlib-$ZLIB_VERSION/libz.a \ -DZLIB_INCLUDE_DIR=/zlib-$ZLIB_VERSION \ - -DGMP_ROOT=/gmp \ - -DINSTALL_DOCUMENTATION=OFF \ - -G Ninja .. + -DCMAKE_FIND_ROOT_PATH=/ \ + -DUSE_GMP=OFF \ + -DINSTALL_DOCUMENTATION=OFF \ + -G Ninja .. $@ RUN ninja + +RUN ctest -j 20 +RUN cat /swipl-devel/build.wasm/Testing/Temporary/LastTest.log diff --git a/examples/generation/package-lock.json b/examples/generation/package-lock.json index 21f0ddb..08b3aa4 100644 --- a/examples/generation/package-lock.json +++ b/examples/generation/package-lock.json @@ -15,6 +15,38 @@ "ts-node": "^10.9.1" } }, + "../..": { + "version": "3.1.0", + "license": "BSD-2-Clause", + "bin": { + "swipl-generate": "dist/bin/index.js" + }, + "devDependencies": { + "@octokit/rest": "^19.0.7", + "@qiwi/semantic-release-gh-pages-plugin": "^5.2.5", + "@types/emscripten": "^1.39.6", + "@types/fs-extra": "^11.0.1", + "@types/node": "^20.0.0", + "@typescript-eslint/eslint-plugin": "^5.59.2", + "@typescript-eslint/parser": "^5.59.2", + "cross-fetch": "^3.1.5", + "eslint": "^8.39.0", + "fs-extra": "^11.1.1", + "http-server": "^14.1.1", + "mocha": "^10.2.0", + "node-static": "^0.7.11", + "npm-run-all": "^4.1.5", + "puppeteer": "^20.1.1", + "semantic-release": "^19.0.5", + "ts-node": "^10.9.1", + "typescript": "^5.0.4", + "webpack": "^5.82.0", + "webpack-cli": "^5.0.2" + }, + "peerDependencies": { + "@types/emscripten": "^1.39.6" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -76,12 +108,6 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, - "node_modules/@types/emscripten": { - "version": "1.39.6", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.6.tgz", - "integrity": "sha512-H90aoynNhhkQP6DRweEjJp5vfUVdIj7tdPLsu7pq89vODD/lcugKfZOsfgwpvM6XUewEp2N5dCg1Uf3Qe55Dcg==", - "peer": true - }, "node_modules/@types/node": { "version": "18.14.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", @@ -138,15 +164,8 @@ "dev": true }, "node_modules/swipl-wasm": { - "version": "3.1.0", - "resolved": "file:../..", - "license": "BSD-2-Clause", - "bin": { - "swipl-generate": "dist/bin/index.js" - }, - "peerDependencies": { - "@types/emscripten": "^1.39.6" - } + "resolved": "../..", + "link": true }, "node_modules/ts-node": { "version": "10.9.1", @@ -277,12 +296,6 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, - "@types/emscripten": { - "version": "1.39.6", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.6.tgz", - "integrity": "sha512-H90aoynNhhkQP6DRweEjJp5vfUVdIj7tdPLsu7pq89vODD/lcugKfZOsfgwpvM6XUewEp2N5dCg1Uf3Qe55Dcg==", - "peer": true - }, "@types/node": { "version": "18.14.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", @@ -327,8 +340,29 @@ "dev": true }, "swipl-wasm": { - "version": "3.1.0", - "requires": {} + "version": "file:../..", + "requires": { + "@octokit/rest": "^19.0.7", + "@qiwi/semantic-release-gh-pages-plugin": "^5.2.5", + "@types/emscripten": "^1.39.6", + "@types/fs-extra": "^11.0.1", + "@types/node": "^20.0.0", + "@typescript-eslint/eslint-plugin": "^5.59.2", + "@typescript-eslint/parser": "^5.59.2", + "cross-fetch": "^3.1.5", + "eslint": "^8.39.0", + "fs-extra": "^11.1.1", + "http-server": "^14.1.1", + "mocha": "^10.2.0", + "node-static": "^0.7.11", + "npm-run-all": "^4.1.5", + "puppeteer": "^20.1.1", + "semantic-release": "^19.0.5", + "ts-node": "^10.9.1", + "typescript": "^5.0.4", + "webpack": "^5.82.0", + "webpack-cli": "^5.0.2" + } }, "ts-node": { "version": "10.9.1", diff --git a/package.json b/package.json index 41497e0..7feee79 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "dist/**/*.wasm" ], "scripts": { - "build:wasm-docker:build": "docker build --build-arg SWIPL_VERSION=$npm_package_config_swipl_version --build-arg EMSDK_VERSION=$npm_package_config_emsdk_version --build-arg ZLIB_VERSION=$npm_package_config_zlib_version --build-arg GMP_VERSION=$npm_package_config_gmp_version -t swipl-wasm-image docker", + "build:wasm-docker:build": "docker build --build-arg SWIPL_VERSION=$npm_package_config_swipl_version --build-arg EMSDK_VERSION=$npm_package_config_emsdk_version --build-arg ZLIB_VERSION=$npm_package_config_zlib_version --build-arg GMP_VERSION=$npm_package_config_gmp_version -t swipl-wasm-image docker --progress=plain", "build:wasm-docker:create": "docker create --name swipl-wasm swipl-wasm-image", "build:wasm-docker:remove": "docker rm swipl-wasm", "build:wasm-docker:extract:data": "docker cp swipl-wasm:/swipl-devel/build.wasm/src/swipl-web.data dist/swipl/swipl-web.data", @@ -84,7 +84,7 @@ "commit": "20b7ede92a13cd37430673bae1c0fcbc9cfcaf9d" }, "emsdk": { - "version": "3.1.34" + "version": "3.1.37" }, "zlib": { "version": "1.2.13" From 61b6ee753dfc717c8a696197a96951bfe7b0f6d4 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Fri, 5 May 2023 21:29:08 +0200 Subject: [PATCH 02/11] chore: remove gmp --- .github/workflows/update.yml | 2 +- docker/Dockerfile | 16 +++------------- package.json | 5 +---- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index 9c9b8ca..6ebe9f9 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - dependency: ['swipl', 'emsdk', 'zlib', 'gmp'] + dependency: ['swipl', 'emsdk', 'zlib'] steps: - uses: actions/checkout@v3 diff --git a/docker/Dockerfile b/docker/Dockerfile index e215de6..dc88012 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -19,14 +19,6 @@ RUN emconfigure ./configure RUN EMCC_CFLAGS=-Wno-deprecated-non-prototype emmake make # Downloads and builds GMP. -ARG GMP_VERSION -RUN wget --no-verbose -qO- https://gmplib.org/download/gmp/gmp-$GMP_VERSION.tar.lz | tar x --lzip --directory / - -WORKDIR /gmp-$GMP_VERSION -RUN mkdir /gmp -RUN emconfigure ./configure --host=none --disable-assembly --prefix=/gmp -RUN make -RUN make install # Clones SWI-Prolog. ARG SWIPL_VERSION @@ -37,9 +29,8 @@ RUN git clone --depth 1 --branch pcre2-10.42 --recurse-submodules https://github WORKDIR /swipl-devel/pcre2 RUN emcmake cmake -DCMAKE_INSTALL_PREFIX=/ \ -DPCRE2GREP_SUPPORT_JIT=OFF \ - -DZLIB_LIBRARY=/zlib-1.2.13/libz.a \ - -DZLIB_INCLUDE_DIR=/zlib-1.2.13 \ - # -DGMP_ROOT=/gmp \ + -DZLIB_LIBRARY=/zlib-$ZLIB_VERSION/libz.a \ + -DZLIB_INCLUDE_DIR=/zlib-$ZLIB_VERSION \ -DUSE_GMP=OFF \ -G Ninja .. $@ @@ -56,5 +47,4 @@ RUN cmake -DCMAKE_TOOLCHAIN_FILE=/emsdk/upstream/emscripten/cmake/Modules/Platfo -G Ninja .. $@ RUN ninja -RUN ctest -j 20 -RUN cat /swipl-devel/build.wasm/Testing/Temporary/LastTest.log +RUN ctest -j 20 --stop-on-failure diff --git a/package.json b/package.json index 7feee79..9438408 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "dist/**/*.wasm" ], "scripts": { - "build:wasm-docker:build": "docker build --build-arg SWIPL_VERSION=$npm_package_config_swipl_version --build-arg EMSDK_VERSION=$npm_package_config_emsdk_version --build-arg ZLIB_VERSION=$npm_package_config_zlib_version --build-arg GMP_VERSION=$npm_package_config_gmp_version -t swipl-wasm-image docker --progress=plain", + "build:wasm-docker:build": "docker build --build-arg SWIPL_VERSION=$npm_package_config_swipl_version --build-arg EMSDK_VERSION=$npm_package_config_emsdk_version --build-arg ZLIB_VERSION=$npm_package_config_zlib_version --build-arg GMP_VERSION=$npm_package_config_gmp_version -t swipl-wasm-image docker", "build:wasm-docker:create": "docker create --name swipl-wasm swipl-wasm-image", "build:wasm-docker:remove": "docker rm swipl-wasm", "build:wasm-docker:extract:data": "docker cp swipl-wasm:/swipl-devel/build.wasm/src/swipl-web.data dist/swipl/swipl-web.data", @@ -88,9 +88,6 @@ }, "zlib": { "version": "1.2.13" - }, - "gmp": { - "version": "6.2.1" } }, "bin": { From 3bad25c9be3e5d106263e3f714cf6da95a03d86c Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Fri, 5 May 2023 22:15:30 +0200 Subject: [PATCH 03/11] WIP --- .github/workflows/update.yml | 2 +- docker/.emscripten | 2 -- docker/Dockerfile | 8 ++++---- examples/generation/package-lock.json | 1 + package.json | 9 +++++++-- scripts/get-latest-gmp.ts | 25 ------------------------- scripts/get-latest-pcre2.ts | 9 +++++++++ scripts/util.ts | 4 ++-- tests/node.js | 6 ++++++ 9 files changed, 30 insertions(+), 36 deletions(-) delete mode 100644 scripts/get-latest-gmp.ts create mode 100644 scripts/get-latest-pcre2.ts diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index 6ebe9f9..7f8df2a 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - dependency: ['swipl', 'emsdk', 'zlib'] + dependency: ['swipl', 'emsdk', 'zlib', 'pcre2'] steps: - uses: actions/checkout@v3 diff --git a/docker/.emscripten b/docker/.emscripten index 6979e1d..8163615 100644 --- a/docker/.emscripten +++ b/docker/.emscripten @@ -1,7 +1,5 @@ import os emsdk_path = os.path.dirname(os.getenv('EM_CONFIG')).replace('\\', '/') -# NODE_JS = emsdk_path + '/node/15.14.0_64bit/bin/node' -# NODE_JS = '/usr/local/bin/node' NODE_JS = '/usr/bin/node' LLVM_ROOT = emsdk_path + '/upstream/bin' BINARYEN_ROOT = emsdk_path + '/upstream' diff --git a/docker/Dockerfile b/docker/Dockerfile index dc88012..d5447d9 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,7 +6,7 @@ FROM emscripten/emsdk:$EMSDK_VERSION # Installs build dependencies. RUN apt-get update && apt-get install -y bzip2 lzip ninja-build xz-utils -RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - RUN apt install -y nodejs COPY ./.emscripten /emsdk/.emscripten @@ -18,14 +18,14 @@ WORKDIR /zlib-$ZLIB_VERSION RUN emconfigure ./configure RUN EMCC_CFLAGS=-Wno-deprecated-non-prototype emmake make -# Downloads and builds GMP. - # Clones SWI-Prolog. ARG SWIPL_VERSION RUN git clone --depth 1 --recurse-submodules https://github.com/SWI-Prolog/swipl-devel /swipl-devel -j100 +ARG PCRE2_NAME +RUN git clone --depth 1 --branch $PCRE2_NAME https://github.com/PCRE2Project/pcre2 /swipl-devel/pcre2 -RUN git clone --depth 1 --branch pcre2-10.42 --recurse-submodules https://github.com/PCRE2Project/pcre2 /swipl-devel/pcre2 +# Build PCRE2 WORKDIR /swipl-devel/pcre2 RUN emcmake cmake -DCMAKE_INSTALL_PREFIX=/ \ -DPCRE2GREP_SUPPORT_JIT=OFF \ diff --git a/examples/generation/package-lock.json b/examples/generation/package-lock.json index 08b3aa4..dd607c0 100644 --- a/examples/generation/package-lock.json +++ b/examples/generation/package-lock.json @@ -16,6 +16,7 @@ } }, "../..": { + "name": "swipl-wasm", "version": "3.1.0", "license": "BSD-2-Clause", "bin": { diff --git a/package.json b/package.json index 9438408..4b8a473 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "dist/**/*.wasm" ], "scripts": { - "build:wasm-docker:build": "docker build --build-arg SWIPL_VERSION=$npm_package_config_swipl_version --build-arg EMSDK_VERSION=$npm_package_config_emsdk_version --build-arg ZLIB_VERSION=$npm_package_config_zlib_version --build-arg GMP_VERSION=$npm_package_config_gmp_version -t swipl-wasm-image docker", + "build:wasm-docker:build": "docker build --build-arg SWIPL_VERSION=$npm_package_config_swipl_version --build-arg EMSDK_VERSION=$npm_package_config_emsdk_version --build-arg ZLIB_VERSION=$npm_package_config_zlib_version --build-arg PCRE2_NAME=$npm_package_config_pcre2_name -t swipl-wasm-image docker", "build:wasm-docker:create": "docker create --name swipl-wasm swipl-wasm-image", "build:wasm-docker:remove": "docker rm swipl-wasm", "build:wasm-docker:extract:data": "docker cp swipl-wasm:/swipl-devel/build.wasm/src/swipl-web.data dist/swipl/swipl-web.data", @@ -68,7 +68,7 @@ "lint:tests": "eslint tests --ext .js", "lint": "run-s lint:types lint:tests", "update:dep:emsdk": "ts-node scripts/get-latest-emsdk", - "update:dep:gmp": "ts-node scripts/get-latest-gmp", + "update:dep:pcre2": "ts-node scripts/get-latest-pcre2", "update:dep:swipl": "ts-node scripts/get-latest-swipl", "update:dep:zlib": "ts-node scripts/get-latest-zlib", "update:dep": "run-s update:dep:*", @@ -88,6 +88,11 @@ }, "zlib": { "version": "1.2.13" + }, + "pcre2": { + "version": "10.42.0", + "commit": "52c08847921a324c804cabf2814549f50bce1265", + "name": "pcre2-10.42" } }, "bin": { diff --git a/scripts/get-latest-gmp.ts b/scripts/get-latest-gmp.ts deleted file mode 100644 index 6f73173..0000000 --- a/scripts/get-latest-gmp.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { getPackage, isHigherVersion, savePackage } from './util'; -import { fetch } from 'cross-fetch'; - -async function main() { - const downloads = await fetch('https://gmplib.org/download/gmp/'); - const text = await downloads.text(); - const versions = text.match(/\"gmp-\d+.\d+.\d+.tar.xz\"/g)!.map((elem: string) => elem.slice(5, -8)); - - let bestVersion: string | undefined; - - for (const version of versions) { - if (!bestVersion || isHigherVersion(version, bestVersion)) - bestVersion = version; - } - - const pkg = getPackage(); - - // If a higher version exists, update the package.json - if (bestVersion && isHigherVersion(bestVersion, pkg.config.gmp.version)) { - pkg.config.gmp.version = bestVersion; - savePackage(pkg); - } -} - -main(); diff --git a/scripts/get-latest-pcre2.ts b/scripts/get-latest-pcre2.ts new file mode 100644 index 0000000..8c023aa --- /dev/null +++ b/scripts/get-latest-pcre2.ts @@ -0,0 +1,9 @@ +import { updateTag } from './util'; + +updateTag({ + owner: 'PCRE2Project', + repo: 'pcre2', + // Since pcre2 only does major.minor we add .0 to make it the semver we like + getVersion: (tag) => /^pcre2\-\d+.\d+$/.test(tag.name) ? tag.name.slice(6) + '.0' : undefined, + entry: 'pcre2', +}); diff --git a/scripts/util.ts b/scripts/util.ts index 99da8c4..b42b818 100644 --- a/scripts/util.ts +++ b/scripts/util.ts @@ -49,11 +49,11 @@ export interface IUpdateTagOptions { export async function updateTag(options: IUpdateTagOptions) { const data = await getAllTags(options); - let bestElem: { version: string; commit: string } | undefined; + let bestElem: { version: string; commit: string; name?: string } | undefined; for (const elem of data) { const version = options.getVersion(elem); if (version && (!bestElem || isHigherVersion(version, bestElem.version))) { - bestElem = { version, commit: elem.commit.sha } + bestElem = { version, commit: elem.commit.sha, name: elem.name }; } } diff --git a/tests/node.js b/tests/node.js index 88d1681..b68c29c 100644 --- a/tests/node.js +++ b/tests/node.js @@ -77,5 +77,11 @@ describe("SWI-Prolog WebAssembly on Node.js", () => { const atom = swipl.prolog.query("X = atom").once().X; assert.strictEqual(atom, "atom"); }); + + it(`[${name}] ` + "should do regex operations enabled by pcre2", async () => { + const swipl = await SWIPL({ arguments: ["-q"], ...addedParams }); + const atom = swipl.prolog.query("X = atom").once().X; + assert.strictEqual(atom, "atom"); + }); } }); From 11b7c36203a409f5439cf1776c474b8973a8588d Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Fri, 5 May 2023 23:55:35 +0200 Subject: [PATCH 04/11] chore: add emsdk commit --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b8a473..35212fd 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,8 @@ "commit": "20b7ede92a13cd37430673bae1c0fcbc9cfcaf9d" }, "emsdk": { - "version": "3.1.37" + "version": "3.1.37", + "commit": "b113f24842c6e97fe3e352084db09a6e278593ae" }, "zlib": { "version": "1.2.13" From 3f451a13494bcb6432e0e50be371ad5f494c0128 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Fri, 5 May 2023 23:55:53 +0200 Subject: [PATCH 05/11] chore: use sed to set node path --- docker/.emscripten | 8 -------- docker/Dockerfile | 12 ++++++------ 2 files changed, 6 insertions(+), 14 deletions(-) delete mode 100644 docker/.emscripten diff --git a/docker/.emscripten b/docker/.emscripten deleted file mode 100644 index 8163615..0000000 --- a/docker/.emscripten +++ /dev/null @@ -1,8 +0,0 @@ -import os -emsdk_path = os.path.dirname(os.getenv('EM_CONFIG')).replace('\\', '/') -NODE_JS = '/usr/bin/node' -LLVM_ROOT = emsdk_path + '/upstream/bin' -BINARYEN_ROOT = emsdk_path + '/upstream' -EMSCRIPTEN_ROOT = emsdk_path + '/upstream/emscripten' -COMPILER_ENGINE = NODE_JS -JS_ENGINES = [NODE_JS] diff --git a/docker/Dockerfile b/docker/Dockerfile index d5447d9..f45c07a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get update && apt-get install -y bzip2 lzip ninja-build xz-utils RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - RUN apt install -y nodejs -COPY ./.emscripten /emsdk/.emscripten +RUN sed -i 's/NODE_JS .*/NODE_JS = "\/usr\/bin\/node"/' /emsdk/.emscripten # Downloads and builds ZLIB. ARG ZLIB_VERSION @@ -28,11 +28,11 @@ RUN git clone --depth 1 --branch $PCRE2_NAME https://github.com/PCRE2Project/pcr # Build PCRE2 WORKDIR /swipl-devel/pcre2 RUN emcmake cmake -DCMAKE_INSTALL_PREFIX=/ \ - -DPCRE2GREP_SUPPORT_JIT=OFF \ - -DZLIB_LIBRARY=/zlib-$ZLIB_VERSION/libz.a \ - -DZLIB_INCLUDE_DIR=/zlib-$ZLIB_VERSION \ - -DUSE_GMP=OFF \ - -G Ninja .. $@ + -DPCRE2GREP_SUPPORT_JIT=OFF \ + -DZLIB_LIBRARY=/zlib-$ZLIB_VERSION/libz.a \ + -DZLIB_INCLUDE_DIR=/zlib-$ZLIB_VERSION \ + -DUSE_GMP=OFF \ + -G Ninja .. $@ # Build SWIPL WORKDIR /swipl-devel/build.wasm From 39eb7358f92f03077ee4b26b7dd9cc4e3f3d3a2a Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sat, 6 May 2023 11:04:07 +0200 Subject: [PATCH 06/11] chore: improve dev instructions --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 6c8a716..13521ef 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,23 @@ The package can be built using npm or yarn. Please use yarn to add new dependencies and update yarn.lock file. SWI-Prolog WebAssembly version is currently built inside Docker with Emscripten. +### Development + +To develop with this package, clone the repository and run: + +``` +# Install dependencies +npm ci + +# Build the Webassembly +npm run build + +# Run tests +npm t +``` + +*Note* You need Docker and Node 16 or higher to installed build the package. + ## Versioning The package uses its own versioning scheme using semver. It is From dad0e433042ff0a04b8929c37c9c8047c5bdae34 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sat, 6 May 2023 11:04:17 +0200 Subject: [PATCH 07/11] chore: add pcre test --- tests/node.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/node.js b/tests/node.js index b68c29c..0018b16 100644 --- a/tests/node.js +++ b/tests/node.js @@ -80,7 +80,9 @@ describe("SWI-Prolog WebAssembly on Node.js", () => { it(`[${name}] ` + "should do regex operations enabled by pcre2", async () => { const swipl = await SWIPL({ arguments: ["-q"], ...addedParams }); - const atom = swipl.prolog.query("X = atom").once().X; + const importResult = Module.prolog.query("use_module(library(pcre)).").once().success; + assert.strictEqual(importResult, true); + const atom = swipl.prolog.query("re_match(\"^needle\"/i, \"Needle in a haystack\").").once(); assert.strictEqual(atom, "atom"); }); } From 5862e66b98a27d5bcd48508926ba9e6d5eaf4a43 Mon Sep 17 00:00:00 2001 From: Jan Wielemaker Date: Thu, 11 May 2023 09:08:50 +0200 Subject: [PATCH 08/11] BUILD: Tweak Dockerfile - install dependencies in /wasm, so we can use `-DCMAKE_FIND_ROOT_PATH` - Only clone parts of SWI-Prolog we need - Tell cmake to use /usr/bin/node. The Emscripten is too old. Looks like a bug in Emscripten? - Run tests using number of cores and running all tests. Builds using docker build --build-arg EMSDK_VERSION=3.1.27 --build-arg ZLIB_VERSION=1.2.13 --build-arg PCRE_VERSION=pcre2-10.42 . --- docker/Dockerfile | 53 +++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f45c07a..35cb98b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,45 +6,48 @@ FROM emscripten/emsdk:$EMSDK_VERSION # Installs build dependencies. RUN apt-get update && apt-get install -y bzip2 lzip ninja-build xz-utils -RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - RUN apt install -y nodejs RUN sed -i 's/NODE_JS .*/NODE_JS = "\/usr\/bin\/node"/' /emsdk/.emscripten -# Downloads and builds ZLIB. +# Download dependency sources +WORKDIR /wasm ARG ZLIB_VERSION -RUN wget --no-verbose -qO- https://zlib.net/zlib-$ZLIB_VERSION.tar.gz | tar xvz --directory / +ARG PCRE_VERSION +RUN wget --no-verbose -qO- https://zlib.net/zlib-$ZLIB_VERSION.tar.gz | tar xvz +RUN git clone --branch=$PCRE_VERSION --depth 1 https://github.com/PCRE2Project/pcre2 -WORKDIR /zlib-$ZLIB_VERSION -RUN emconfigure ./configure +# Build the dependencies and install them in /wasm +WORKDIR /wasm/zlib-$ZLIB_VERSION +RUN emconfigure ./configure --static --prefix=/wasm RUN EMCC_CFLAGS=-Wno-deprecated-non-prototype emmake make +RUN emmake make install -# Clones SWI-Prolog. -ARG SWIPL_VERSION -RUN git clone --depth 1 --recurse-submodules https://github.com/SWI-Prolog/swipl-devel /swipl-devel -j100 - -ARG PCRE2_NAME -RUN git clone --depth 1 --branch $PCRE2_NAME https://github.com/PCRE2Project/pcre2 /swipl-devel/pcre2 - -# Build PCRE2 -WORKDIR /swipl-devel/pcre2 -RUN emcmake cmake -DCMAKE_INSTALL_PREFIX=/ \ +WORKDIR /wasm/pcre2/build +RUN emcmake cmake -DCMAKE_INSTALL_PREFIX=/wasm \ -DPCRE2GREP_SUPPORT_JIT=OFF \ - -DZLIB_LIBRARY=/zlib-$ZLIB_VERSION/libz.a \ - -DZLIB_INCLUDE_DIR=/zlib-$ZLIB_VERSION \ - -DUSE_GMP=OFF \ -G Ninja .. $@ +RUN ninja && ninja install + +# Clone SWI-Prolog. Only make a shallow clone and only clone the +# submodules we need at depth 1. +WORKDIR / +RUN git clone --depth 1 https://github.com/SWI-Prolog/swipl-devel +RUN cd swipl-devel && git submodule update --init --depth 1 \ + packages/chr packages/clib packages/clpqr packages/http packages/nlp \ + packages/pcre packages/plunit packages/sgml packages/RDF \ + packages/semweb packages/zlib # Build SWIPL WORKDIR /swipl-devel/build.wasm RUN mkdir -p /swipl-devel/build.wasm RUN cmake -DCMAKE_TOOLCHAIN_FILE=/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake \ -DCMAKE_BUILD_TYPE=Release \ - -DZLIB_LIBRARY=/zlib-$ZLIB_VERSION/libz.a \ - -DZLIB_INCLUDE_DIR=/zlib-$ZLIB_VERSION \ - -DCMAKE_FIND_ROOT_PATH=/ \ - -DUSE_GMP=OFF \ - -DINSTALL_DOCUMENTATION=OFF \ - -G Ninja .. $@ + -DCMAKE_FIND_ROOT_PATH=/wasm \ + -DUSE_GMP=OFF \ + -DINSTALL_DOCUMENTATION=OFF \ + -DNODE_JS_EXECUTABLE=/usr/bin/node \ + -G Ninja .. RUN ninja -RUN ctest -j 20 --stop-on-failure +RUN ctest -j $(nproc) --output-on-failure From 2e056b0bccecce7c6506b749c6b12632c1c71db1 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Thu, 11 May 2023 16:30:59 +0200 Subject: [PATCH 09/11] chore: fix pcre test --- docker/Dockerfile | 4 ++-- tests/node.js | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 35cb98b..7530444 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -13,9 +13,9 @@ RUN sed -i 's/NODE_JS .*/NODE_JS = "\/usr\/bin\/node"/' /emsdk/.emscripten # Download dependency sources WORKDIR /wasm ARG ZLIB_VERSION -ARG PCRE_VERSION +ARG PCRE2_NAME RUN wget --no-verbose -qO- https://zlib.net/zlib-$ZLIB_VERSION.tar.gz | tar xvz -RUN git clone --branch=$PCRE_VERSION --depth 1 https://github.com/PCRE2Project/pcre2 +RUN git clone --branch=$PCRE2_NAME --depth 1 https://github.com/PCRE2Project/pcre2 # Build the dependencies and install them in /wasm WORKDIR /wasm/zlib-$ZLIB_VERSION diff --git a/tests/node.js b/tests/node.js index 0018b16..13076f9 100644 --- a/tests/node.js +++ b/tests/node.js @@ -80,10 +80,8 @@ describe("SWI-Prolog WebAssembly on Node.js", () => { it(`[${name}] ` + "should do regex operations enabled by pcre2", async () => { const swipl = await SWIPL({ arguments: ["-q"], ...addedParams }); - const importResult = Module.prolog.query("use_module(library(pcre)).").once().success; - assert.strictEqual(importResult, true); - const atom = swipl.prolog.query("re_match(\"^needle\"/i, \"Needle in a haystack\").").once(); - assert.strictEqual(atom, "atom"); + assert.strictEqual(swipl.prolog.query("use_module(library(pcre)).").once().success, true); + assert.strictEqual(swipl.prolog.query("re_match(\"^needle\"/i, \"Needle in a haystack\").").once().success, true); }); } }); From c345d2e42e7e7e56c98e43280d10f826d52e4934 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Thu, 11 May 2023 16:39:42 +0200 Subject: [PATCH 10/11] chore: update emsdk version --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 35212fd..ad9084a 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,9 @@ "commit": "20b7ede92a13cd37430673bae1c0fcbc9cfcaf9d" }, "emsdk": { - "version": "3.1.37", - "commit": "b113f24842c6e97fe3e352084db09a6e278593ae" + "version": "3.1.38", + "commit": "0329dbaa2593dcb6604caf38893f276b06cc04ef", + "name": "3.1.38" }, "zlib": { "version": "1.2.13" From dc9a51e5f3ceb8b48f57ec4886cc7013d9138503 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sat, 13 May 2023 21:24:43 +0200 Subject: [PATCH 11/11] chore: build with node 16.x --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 7530444..4e6541e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,7 +6,7 @@ FROM emscripten/emsdk:$EMSDK_VERSION # Installs build dependencies. RUN apt-get update && apt-get install -y bzip2 lzip ninja-build xz-utils -RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - RUN apt install -y nodejs RUN sed -i 's/NODE_JS .*/NODE_JS = "\/usr\/bin\/node"/' /emsdk/.emscripten