-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: refactor the creation of config.gypi file
- Loading branch information
Showing
4 changed files
with
162 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
*.swp | ||
gyp/test | ||
node_modules | ||
test/.node-gyp | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
'use strict' | ||
|
||
const fs = require('graceful-fs') | ||
const log = require('npmlog') | ||
const path = require('path') | ||
|
||
function getBaseConfigGypi () { | ||
const config = JSON.parse(JSON.stringify(process.config)) | ||
if (!config.target_defaults) { | ||
config.target_defaults = {} | ||
} | ||
if (!config.variables) { | ||
config.variables = {} | ||
} | ||
return config | ||
} | ||
|
||
function getCurrentConfigGypi ({ gyp, nodeDir, vsInfo }) { | ||
const config = getBaseConfigGypi() | ||
const defaults = config.target_defaults | ||
const variables = config.variables | ||
|
||
// don't inherit the "defaults" from the base config.gypi. | ||
// doing so could cause problems in cases where the `node` executable was | ||
// compiled on a different machine (with different lib/include paths) than | ||
// the machine where the addon is being built to | ||
defaults.cflags = [] | ||
defaults.defines = [] | ||
defaults.include_dirs = [] | ||
defaults.libraries = [] | ||
|
||
// set the default_configuration prop | ||
if ('debug' in gyp.opts) { | ||
defaults.default_configuration = gyp.opts.debug ? 'Debug' : 'Release' | ||
} | ||
|
||
if (!defaults.default_configuration) { | ||
defaults.default_configuration = 'Release' | ||
} | ||
|
||
// set the target_arch variable | ||
variables.target_arch = gyp.opts.arch || process.arch || 'ia32' | ||
if (variables.target_arch === 'arm64') { | ||
defaults.msvs_configuration_platform = 'ARM64' | ||
defaults.xcode_configuration_platform = 'arm64' | ||
} | ||
|
||
// set the node development directory | ||
variables.nodedir = nodeDir | ||
|
||
// disable -T "thin" static archives by default | ||
variables.standalone_static_library = gyp.opts.thin ? 0 : 1 | ||
|
||
if (process.platform === 'win32') { | ||
defaults.msbuild_toolset = vsInfo.toolset | ||
if (vsInfo.sdk) { | ||
defaults.msvs_windows_target_platform_version = vsInfo.sdk | ||
} | ||
if (variables.target_arch === 'arm64') { | ||
if (vsInfo.versionMajor > 15 || | ||
(vsInfo.versionMajor === 15 && vsInfo.versionMajor >= 9)) { | ||
defaults.msvs_enable_marmasm = 1 | ||
} else { | ||
log.warn('Compiling ARM64 assembly is only available in\n' + | ||
'Visual Studio 2017 version 15.9 and above') | ||
} | ||
} | ||
variables.msbuild_path = vsInfo.msBuild | ||
} | ||
|
||
// loop through the rest of the opts and add the unknown ones as variables. | ||
// this allows for module-specific configure flags like: | ||
// | ||
// $ node-gyp configure --shared-libxml2 | ||
Object.keys(gyp.opts).forEach(function (opt) { | ||
if (opt === 'argv') { | ||
return | ||
} | ||
if (opt in gyp.configDefs) { | ||
return | ||
} | ||
variables[opt.replace(/-/g, '_')] = gyp.opts[opt] | ||
}) | ||
|
||
return config | ||
} | ||
|
||
function createConfigGypi ({ gyp, buildDir, nodeDir, vsInfo }, callback) { | ||
const configFilename = 'config.gypi' | ||
const configPath = path.resolve(buildDir, configFilename) | ||
|
||
log.verbose('build/' + configFilename, 'creating config file') | ||
|
||
const config = getCurrentConfigGypi({ gyp, nodeDir, vsInfo }) | ||
|
||
// ensures that any boolean values in config.gypi get stringified | ||
function boolsToString (k, v) { | ||
if (typeof v === 'boolean') { | ||
return String(v) | ||
} | ||
return v | ||
} | ||
|
||
log.silly('build/' + configFilename, config) | ||
|
||
// now write out the config.gypi file to the build/ dir | ||
const prefix = '# Do not edit. File was generated by node-gyp\'s "configure" step' | ||
|
||
const json = JSON.stringify(config, boolsToString, 2) | ||
log.verbose('build/' + configFilename, 'writing out config file: %s', configPath) | ||
fs.writeFile(configPath, [prefix, json, ''].join('\n'), (err) => { | ||
callback(err, configPath) | ||
}) | ||
} | ||
|
||
module.exports = createConfigGypi | ||
module.exports.test = { | ||
getCurrentConfigGypi: getCurrentConfigGypi | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
'use strict' | ||
|
||
const { test } = require('tap') | ||
const gyp = require('../lib/node-gyp') | ||
const createConfigGypi = require('../lib/create-config-gypi') | ||
const { getCurrentConfigGypi } = createConfigGypi.test | ||
|
||
test('config.gypi with no options', function (t) { | ||
t.plan(2) | ||
|
||
const prog = gyp() | ||
prog.parseArgv([]) | ||
|
||
const config = getCurrentConfigGypi({ gyp: prog, vsInfo: {} }) | ||
t.equal(config.target_defaults.default_configuration, 'Release') | ||
t.equal(config.variables.target_arch, process.arch) | ||
}) | ||
|
||
test('config.gypi with --debug', function (t) { | ||
t.plan(1) | ||
|
||
const prog = gyp() | ||
prog.parseArgv(['_', '_', '--debug']) | ||
|
||
const config = getCurrentConfigGypi({ gyp: prog, vsInfo: {} }) | ||
t.equal(config.target_defaults.default_configuration, 'Debug') | ||
}) | ||
|
||
test('config.gypi with custom options', function (t) { | ||
t.plan(1) | ||
|
||
const prog = gyp() | ||
prog.parseArgv(['_', '_', '--shared-libxml2']) | ||
|
||
const config = getCurrentConfigGypi({ gyp: prog, vsInfo: {} }) | ||
t.equal(config.variables.shared_libxml2, true) | ||
}) |