Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow setting libc to glibc on non-glibc platform #176

Merged
merged 2 commits into from
Apr 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,13 @@ prebuild-install [options]
--version (print prebuild-install version and exit)
```

When `prebuild-install` is run via an `npm` script, options `--build-from-source`, `--debug`, `--download`, `--target`, `--runtime`, `--arch` and `--platform` may be passed through via arguments given to the `npm` command.
When `prebuild-install` is run via an `npm` script, options `--build-from-source`, `--debug`, `--download`, `--target`, `--runtime`, `--arch` `--platform` and `--libc` may be passed through via arguments given to the `npm` command.

Alternatively you can set environment variables `npm_config_build_from_source=true`, `npm_config_platform`, `npm_config_arch`, `npm_config_target` and `npm_config_runtime`.
Alternatively you can set environment variables `npm_config_build_from_source=true`, `npm_config_platform`, `npm_config_arch`, `npm_config_target` `npm_config_runtime` and `npm_config_libc`.

### Libc

On non-glibc Linux platforms, the Libc name is appended to platform name. For example, musl-based environments are called `linuxmusl`. If `--libc=glibc` is passed as option, glibc is discarded and platform is called as just `linux`. This can be used for example to build cross-platform packages on Alpine Linux.

### Private Repositories

Expand Down
6 changes: 5 additions & 1 deletion rc.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ const detectLibc = require('detect-libc')
const napi = require('napi-build-utils')

const env = process.env
const libc = env.LIBC || (detectLibc.isNonGlibcLinuxSync() && detectLibc.familySync()) || ''

const libc = env.LIBC || process.env.npm_config_libc ||
(detectLibc.isNonGlibcLinuxSync() && detectLibc.familySync()) || ''

// Get the configuration
module.exports = function (pkg) {
Expand Down Expand Up @@ -51,6 +53,8 @@ module.exports = function (pkg) {

rc.abi = napi.isNapiRuntime(rc.runtime) ? rc.target : getAbi(rc.target, rc.runtime)

rc.libc = rc.platform !== 'linux' || rc.libc === detectLibc.GLIBC ? '' : rc.libc

return rc
}

Expand Down
43 changes: 38 additions & 5 deletions test/rc-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ test('custom config and aliases', function (t) {
'--path ../some/other/path',
'--target 1.4.10',
'--runtime electron',
'--libc testlibc',
'--token TOKEN'
]
runRc(t, args.join(' '), {}, function (rc, tmp) {
Expand All @@ -35,7 +34,6 @@ test('custom config and aliases', function (t) {
t.equal(rc.target, rc.t, 'target alias')
t.equal(rc.runtime, 'electron', 'correct runtime')
t.equal(rc.runtime, rc.r, 'runtime alias')
t.equal(rc.libc, 'testlibc', 'libc family')
t.equal(rc.abi, '50', 'correct ABI')
t.equal(rc.token, 'TOKEN', 'correct token')
t.equal(rc['tag-prefix'], 'v', 'correct default tag prefix')
Expand Down Expand Up @@ -70,17 +68,19 @@ test('npm_config_* are passed on from environment into rc', function (t) {
npm_config_local_address: '127.0.0.1',
npm_config_target: '1.4.0',
npm_config_runtime: 'electron',
npm_config_platform: 'PLATFORM',
npm_config_build_from_source: 'true'
npm_config_platform: 'linux',
npm_config_build_from_source: 'true',
npm_config_libc: 'testlibc'
}
runRc(t, '', env, function (rc) {
t.equal(rc.proxy, 'http://localhost/', 'proxy is set')
t.equal(rc['https-proxy'], 'https://localhost/', 'https-proxy is set')
t.equal(rc['local-address'], '127.0.0.1', 'local-address is set')
t.equal(rc.target, '1.4.0', 'target is set')
t.equal(rc.runtime, 'electron', 'runtime is set')
t.equal(rc.platform, 'PLATFORM', 'platform is set')
t.equal(rc.platform, 'linux', 'platform is set')
t.equal(rc.buildFromSource, true, 'build-from-source is set')
t.equal(rc.libc, 'testlibc', 'libc is set')
t.end()
})
})
Expand Down Expand Up @@ -115,6 +115,39 @@ test('using --tag-prefix will set the tag prefix', function (t) {
})
})

test('libc works on linux platform', function (t) {
const args = [
'--libc musl --platform linux'
]
runRc(t, args.join(' '), {}, function (rc, tmp) {
t.equal(rc.libc, 'musl', 'libc family')
t.equal(rc.platform, 'linux', 'platform')
t.end()
})
})

test('libc glibc is passed as empty', function (t) {
const args = [
'--libc glibc --platform linux'
]
runRc(t, args.join(' '), {}, function (rc, tmp) {
t.equal(rc.libc, '', 'libc family')
t.equal(rc.platform, 'linux', 'platform')
t.end()
})
})

test('libc is discarded on non-linux platform', function (t) {
const args = [
'--libc musl --platform windows'
]
runRc(t, args.join(' '), {}, function (rc, tmp) {
t.equal(rc.libc, '', 'libc family')
t.equal(rc.platform, 'windows', 'platform')
t.end()
})
})

function runRc (t, args, env, cb) {
const pkg = {
name: 'test',
Expand Down
2 changes: 1 addition & 1 deletion util.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ function getDownloadUrl (opts) {
runtime: opts.runtime || 'node',
platform: opts.platform,
arch: opts.arch,
libc: opts.libc || process.env.LIBC || '',
libc: opts.libc || '',
configuration: (opts.debug ? 'Debug' : 'Release'),
module_name: opts.pkg.binary && opts.pkg.binary.module_name,
tag_prefix: opts['tag-prefix']
Expand Down