diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7dce08f..73cb193 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,19 +10,19 @@ jobs: matrix: node-version: - 16 - - 14 - - 12 + - 18 + - 20 os: - ubuntu-latest - macos-latest - windows-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - if: contains(matrix.os, 'ubuntu') - run: sudo apt-get install nasm + run: sudo apt-get install nasm cmake libpng-dev - if: contains(matrix.os, 'macos') - run: brew install automake nasm - - uses: actions/setup-node@v2 + run: brew install cmake nasm libpng zlib + - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm install diff --git a/docker/Dockerfile b/docker/Dockerfile index a2ac7d6..b691565 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,14 +1,14 @@ -FROM debian:10-slim +FROM debian:12-slim RUN apt-get update \ - && apt-get install autoconf libtool nasm libpng-dev automake pkg-config build-essential wget \ + && apt-get install cmake libtool nasm libpng-dev pkg-config build-essential wget \ -yq --no-install-suggests --no-install-recommends --force-yes WORKDIR /src -RUN wget --no-check-certificate https://github.com/mozilla/mozjpeg/archive/v3.3.1.tar.gz -O mozjpeg-3.3.1.tar.gz -RUN tar -xzvf mozjpeg-3.3.1.tar.gz -WORKDIR /src/mozjpeg-3.3.1 +RUN wget --no-check-certificate https://github.com/mozilla/mozjpeg/archive/v4.1.3.tar.gz -O mozjpeg-4.1.3.tar.gz +RUN tar -xzvf mozjpeg-4.1.3.tar.gz +WORKDIR /src/mozjpeg-4.1.3 -RUN autoreconf -fiv \ - && ./configure LDFLAGS=-static libpng_LIBS='/usr/lib/x86_64-linux-gnu/libpng16.a -lz' --enable-static --disable-shared \ - && make -j8 +RUN mkdir result && cd result && \ + cmake .. \ + && cmake --build . diff --git a/lib/index.js b/lib/index.js index 26a686c..f4a3291 100644 --- a/lib/index.js +++ b/lib/index.js @@ -4,12 +4,15 @@ import {fileURLToPath} from 'node:url'; import BinWrapper from 'bin-wrapper'; const pkg = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url))); -const url = `https://raw.githubusercontent.com/imagemin/mozjpeg-bin/v${pkg.version}/vendor/`; +const url = `https://github.com/CybrixSystems/mozjpeg-bin/raw/${pkg.version}/vendor/`; const binWrapper = new BinWrapper() - .src(`${url}macos/cjpeg`, 'darwin') - .src(`${url}linux/cjpeg`, 'linux') - .src(`${url}win/cjpeg.exe`, 'win32') + .src(`${url}macos/amd64/cjpeg`, 'darwin', 'x64') + .src(`${url}macos/arm64/cjpeg`, 'darwin', 'arm64') + .src(`${url}linux/amd64/cjpeg`, 'linux', 'x64') + .src(`${url}linux/arm64/cjpeg`, 'linux', 'arm64') + .src(`${url}win/x86/cjpeg.exe`, 'win32', 'x86') + .src(`${url}win/x64/cjpeg.exe`, 'win32', 'x64') .dest(fileURLToPath(new URL('../vendor', import.meta.url))) .use(process.platform === 'win32' ? 'cjpeg.exe' : 'cjpeg'); diff --git a/lib/install.js b/lib/install.js index 6959632..92f4f36 100644 --- a/lib/install.js +++ b/lib/install.js @@ -1,11 +1,8 @@ -import os from 'node:os'; import process from 'node:process'; import {fileURLToPath} from 'node:url'; import binBuild from 'bin-build'; import bin from './index.js'; -const cpuNumber = Math.max(os.cpus().length, 1); - bin.run(['-version']).then(() => { console.log('mozjpeg pre-build test passed successfully'); }).catch(async error => { @@ -13,23 +10,21 @@ bin.run(['-version']).then(() => { console.warn('mozjpeg pre-build test failed'); console.info('compiling from source'); - let cfgExtras = ''; + const config = []; if (process.platform === 'darwin') { - cfgExtras = 'libpng_LIBS=\'/usr/local/lib/libpng16.a -lz\' --enable-static'; + config.push('-DCMAKE_FIND_FRAMEWORK=LAST -DBUILD_SHARED_LIBS=OFF'); } const cfg = [ - `./configure --enable-static --disable-shared --disable-dependency-tracking --with-jpeg8 ${cfgExtras}`, - `--prefix="${bin.dest()}" --bindir="${bin.dest()}" --libdir="${bin.dest()}"`, + `cmake ${config.join(' ')} .`, ].join(' '); try { const source = fileURLToPath(new URL('../vendor/source/mozjpeg.tar.gz', import.meta.url)); await binBuild.file(source, [ - 'autoreconf -fiv', cfg, - `make -j${cpuNumber}`, - `make install -j${cpuNumber}`, + 'cmake --build . ', + `cp cjpeg-static ${bin.dest()}/cjpeg`, ]); console.log('mozjpeg built successfully'); diff --git a/package.json b/package.json index d463784..99813a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mozjpeg", - "version": "8.0.0", + "version": "10.0.0", "description": "mozjpeg wrapper that makes it seamlessly available as a local dependency", "license": "MIT", "repository": "imagemin/mozjpeg-bin", @@ -12,8 +12,8 @@ }, "scripts": { "postinstall": "node lib/install.js", - "test": "xo && ava --timeout=120s", - "build-linux": "docker build --tag imagemin/mozjpeg docker && docker run --rm --volume $(pwd)/vendor/linux:/src/out imagemin/mozjpeg cp cjpeg /src/out" + "test": "xo && ava --timeout=180s", + "build-linux": "docker build --tag imagemin/mozjpeg docker && docker run --rm --volume $(pwd)/vendor/linux:/src/out imagemin/mozjpeg cp result/cjpeg-static /src/out/cjpeg" }, "files": [ "index.js", diff --git a/test/test.js b/test/test.js index 7da6425..b0e4c2b 100644 --- a/test/test.js +++ b/test/test.js @@ -1,5 +1,4 @@ import fs from 'node:fs'; -import os from 'node:os'; import path from 'node:path'; import process from 'node:process'; import {fileURLToPath} from 'node:url'; @@ -11,8 +10,6 @@ import binBuild from 'bin-build'; import compareSize from 'compare-size'; import mozjpeg from '../index.js'; -const cpuNumber = os.cpus().length; - test('rebuild the mozjpeg binaries', async t => { // Skip the test on Windows if (process.platform === 'win32') { @@ -21,20 +18,23 @@ test('rebuild the mozjpeg binaries', async t => { } const temporary = tempy.directory(); + const config = []; + if (process.platform === 'darwin') { + config.push('-DCMAKE_FIND_FRAMEWORK=LAST -DBUILD_SHARED_LIBS=OFF'); + } + const cfg = [ - './configure --enable-static --disable-shared --disable-dependency-tracking --with-jpeg8', - `--prefix="${temporary}" --bindir="${temporary}" --libdir="${temporary}"`, + `cmake ${config.join(' ')} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${temporary}" .`, ].join(' '); const source = fileURLToPath(new URL('../vendor/source/mozjpeg.tar.gz', import.meta.url)); await binBuild.file(source, [ - 'autoreconf -fiv', cfg, - `make --jobs=${cpuNumber}`, - `make install --jobs=${cpuNumber}`, + 'cmake --build . ', + 'cmake --install . ', ]); - t.true(fs.existsSync(path.join(temporary, 'cjpeg'))); + t.true(fs.existsSync(path.join(temporary, 'bin/cjpeg'))); }); test('return path to binary and verify that it is working', async t => { diff --git a/vendor/linux/amd64/cjpeg b/vendor/linux/amd64/cjpeg new file mode 100755 index 0000000..8f1e5fa Binary files /dev/null and b/vendor/linux/amd64/cjpeg differ diff --git a/vendor/linux/arm64/cjpeg b/vendor/linux/arm64/cjpeg new file mode 100755 index 0000000..de0d229 Binary files /dev/null and b/vendor/linux/arm64/cjpeg differ diff --git a/vendor/linux/cjpeg b/vendor/linux/cjpeg deleted file mode 100755 index fc7de12..0000000 Binary files a/vendor/linux/cjpeg and /dev/null differ diff --git a/vendor/macos/cjpeg b/vendor/macos/amd64/cjpeg similarity index 100% rename from vendor/macos/cjpeg rename to vendor/macos/amd64/cjpeg diff --git a/vendor/macos/arm64/cjpeg b/vendor/macos/arm64/cjpeg new file mode 100755 index 0000000..e3f506e Binary files /dev/null and b/vendor/macos/arm64/cjpeg differ diff --git a/vendor/source/mozjpeg.tar.gz b/vendor/source/mozjpeg.tar.gz index 96ba696..59da4e4 100644 Binary files a/vendor/source/mozjpeg.tar.gz and b/vendor/source/mozjpeg.tar.gz differ diff --git a/vendor/win/cjpeg.exe b/vendor/win/cjpeg.exe deleted file mode 100755 index 82ad8f0..0000000 Binary files a/vendor/win/cjpeg.exe and /dev/null differ diff --git a/vendor/win/x64/cjpeg.exe b/vendor/win/x64/cjpeg.exe new file mode 100644 index 0000000..955026d Binary files /dev/null and b/vendor/win/x64/cjpeg.exe differ diff --git a/vendor/win/x86/cjpeg.exe b/vendor/win/x86/cjpeg.exe new file mode 100644 index 0000000..7cf80e0 Binary files /dev/null and b/vendor/win/x86/cjpeg.exe differ