From 94b50c3b4b02d642ea35f1f267a01cd3fe28afef Mon Sep 17 00:00:00 2001 From: Joona Heinikoski Date: Fri, 22 Apr 2022 15:36:57 +0300 Subject: [PATCH 1/4] Read LIBC environment value --- docs/install.md | 17 +++++++++++++---- lib/platform.js | 7 ++++--- package.json | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/docs/install.md b/docs/install.md index 71dbd0ca6..180a0aafd 100644 --- a/docs/install.md +++ b/docs/install.md @@ -74,20 +74,28 @@ The target platform and/or architecture can be manually selected using the follo npm install --platform=... --arch=... --arm-version=... sharp ``` -* `--platform`: one of `linux`, `linuxmusl`, `darwin` or `win32`. +* `--platform`: one of `linux`, `darwin` or `win32`. * `--arch`: one of `x64`, `ia32`, `arm` or `arm64`. * `--arm-version`: one of `6`, `7` or `8` (`arm` defaults to `6`, `arm64` defaults to `8`). +* `--libc`: one of `glibc` or `musl`. This option only works with platform `linux`, defaults to `glibc` * `--sharp-install-force`: skip version compatibility and Subresource Integrity checks. These values can also be set via environment variables, -`npm_config_platform`, `npm_config_arch`, `npm_config_arm_version` +`npm_config_platform`, `npm_config_arch`, `npm_config_arm_version`, `npm_config_libc` and `SHARP_INSTALL_FORCE` respectively. For example, if the target machine has a 64-bit ARM CPU and is running Alpine Linux, use the following flags: ```sh -npm install --arch=arm64 --platform=linuxmusl sharp +npm install --arch=arm64 --platform=linux --libc=musl sharp +``` + +If the current machine is Alpine Linux and the target machine is Debian Linux on x64 cpu, +use the following flags: + +```sh +npm install --arch=x64 --platform=linux --libc=glibc sharp ``` ## Custom libvips @@ -207,7 +215,8 @@ run the following additional command after `npm install`: ```sh npm install -SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install --arch=x64 --platform=linux sharp +rm -rf node_modules/sharp +SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install --arch=x64 --platform=linux --libc=glibc sharp ``` To get the best performance select the largest memory available. diff --git a/lib/platform.js b/lib/platform.js index 185d7d778..bcb43dca9 100644 --- a/lib/platform.js +++ b/lib/platform.js @@ -7,10 +7,11 @@ const env = process.env; module.exports = function () { const arch = env.npm_config_arch || process.arch; const platform = env.npm_config_platform || process.platform; - /* istanbul ignore next */ - const libc = (platform === 'linux' && detectLibc.isNonGlibcLinuxSync()) ? detectLibc.familySync() : ''; + const libc = process.env.LIBC || process.env.npm_config_libc || + (detectLibc.isNonGlibcLinuxSync() ? detectLibc.familySync() : ''); + const libcId = platform !== 'linux' || libc === detectLibc.GLIBC ? '' : libc; - const platformId = [`${platform}${libc}`]; + const platformId = [`${platform}${libcId}`]; if (arch === 'arm') { const fallback = process.versions.electron ? '7' : '6'; diff --git a/package.json b/package.json index bc52a64e9..995984298 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "color": "^4.2.3", "detect-libc": "^2.0.1", "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1", + "prebuild-install": "^7.1.0", "semver": "^7.3.7", "simple-get": "^4.0.1", "tar-fs": "^2.1.1", From 1b44a23f6e54a1493f53f8f025b271a951ae3a93 Mon Sep 17 00:00:00 2001 From: Joona Heinikoski Date: Thu, 28 Apr 2022 11:43:39 +0300 Subject: [PATCH 2/4] Unit tests for platform detection --- test/unit/platform.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/unit/platform.js b/test/unit/platform.js index 217504d9f..be90db4ed 100644 --- a/test/unit/platform.js +++ b/test/unit/platform.js @@ -61,4 +61,28 @@ describe('Platform-detection', function () { delete process.env.npm_config_arch; delete process.versions.electron; }); + + it('Can override libc if platform is linux', function () { + process.env.npm_config_platform = 'linux' + process.env.npm_config_libc = 'test' + assert.strictEqual('linuxtest', platform().split('-')[0]) + delete process.env.npm_config_platform + delete process.env.npm_config_libc + }) + + it('Handles libc value "glibc" as default linux', function () { + process.env.npm_config_platform = 'linux' + process.env.npm_config_libc = 'glibc' + assert.strictEqual('linux', platform().split('-')[0]) + delete process.env.npm_config_platform + delete process.env.npm_config_libc + }) + + it('Discards libc value on non-linux platform', function () { + process.env.npm_config_platform = 'win32' + process.env.npm_config_libc = 'gnuwin32' + assert.strictEqual('win32', platform().split('-')[0]) + delete process.env.npm_config_platform + delete process.env.npm_config_libc + }) }); From 360cd50228ddb23b2f18e1fcca2f2709e6cc25bb Mon Sep 17 00:00:00 2001 From: Joona Heinikoski Date: Thu, 28 Apr 2022 11:47:29 +0300 Subject: [PATCH 3/4] Don't read deprecated LIBC environment value --- lib/platform.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/platform.js b/lib/platform.js index bcb43dca9..4d3ad4616 100644 --- a/lib/platform.js +++ b/lib/platform.js @@ -7,7 +7,8 @@ const env = process.env; module.exports = function () { const arch = env.npm_config_arch || process.arch; const platform = env.npm_config_platform || process.platform; - const libc = process.env.LIBC || process.env.npm_config_libc || + const libc = process.env.npm_config_libc || + /* istanbul ignore next */ (detectLibc.isNonGlibcLinuxSync() ? detectLibc.familySync() : ''); const libcId = platform !== 'linux' || libc === detectLibc.GLIBC ? '' : libc; From 9703520618ba1fbca268de1dfd636f969c2353fa Mon Sep 17 00:00:00 2001 From: Joona Heinikoski Date: Thu, 28 Apr 2022 13:05:11 +0300 Subject: [PATCH 4/4] Fix lint --- lib/platform.js | 2 +- test/unit/platform.js | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/platform.js b/lib/platform.js index 4d3ad4616..94c91ae93 100644 --- a/lib/platform.js +++ b/lib/platform.js @@ -7,7 +7,7 @@ const env = process.env; module.exports = function () { const arch = env.npm_config_arch || process.arch; const platform = env.npm_config_platform || process.platform; - const libc = process.env.npm_config_libc || + const libc = process.env.npm_config_libc || /* istanbul ignore next */ (detectLibc.isNonGlibcLinuxSync() ? detectLibc.familySync() : ''); const libcId = platform !== 'linux' || libc === detectLibc.GLIBC ? '' : libc; diff --git a/test/unit/platform.js b/test/unit/platform.js index be90db4ed..40eee1d8d 100644 --- a/test/unit/platform.js +++ b/test/unit/platform.js @@ -63,26 +63,26 @@ describe('Platform-detection', function () { }); it('Can override libc if platform is linux', function () { - process.env.npm_config_platform = 'linux' - process.env.npm_config_libc = 'test' - assert.strictEqual('linuxtest', platform().split('-')[0]) - delete process.env.npm_config_platform - delete process.env.npm_config_libc - }) + process.env.npm_config_platform = 'linux'; + process.env.npm_config_libc = 'test'; + assert.strictEqual('linuxtest', platform().split('-')[0]); + delete process.env.npm_config_platform; + delete process.env.npm_config_libc; + }); it('Handles libc value "glibc" as default linux', function () { - process.env.npm_config_platform = 'linux' - process.env.npm_config_libc = 'glibc' - assert.strictEqual('linux', platform().split('-')[0]) - delete process.env.npm_config_platform - delete process.env.npm_config_libc - }) + process.env.npm_config_platform = 'linux'; + process.env.npm_config_libc = 'glibc'; + assert.strictEqual('linux', platform().split('-')[0]); + delete process.env.npm_config_platform; + delete process.env.npm_config_libc; + }); it('Discards libc value on non-linux platform', function () { - process.env.npm_config_platform = 'win32' - process.env.npm_config_libc = 'gnuwin32' - assert.strictEqual('win32', platform().split('-')[0]) - delete process.env.npm_config_platform - delete process.env.npm_config_libc - }) + process.env.npm_config_platform = 'win32'; + process.env.npm_config_libc = 'gnuwin32'; + assert.strictEqual('win32', platform().split('-')[0]); + delete process.env.npm_config_platform; + delete process.env.npm_config_libc; + }); });