node/tools/install.py

427 lines
16 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
import argparse
import ast
import errno
import os
import platform
import shutil
import sys
import re
current_system = platform.system()
SYSTEM_AIX = "AIX"
def abspath(*args):
path = os.path.join(*args)
return os.path.abspath(path)
def is_child_dir(child, parent):
p = os.path.abspath(parent)
c = os.path.abspath(child)
return c.startswith(p) and c != p
def try_unlink(path):
try:
os.unlink(path)
except OSError as e:
if e.errno != errno.ENOENT: raise
def try_symlink(options, source_path, link_path):
if not options.silent:
print('symlinking %s -> %s' % (source_path, link_path))
try_unlink(link_path)
try_mkdir_r(os.path.dirname(link_path))
os.symlink(source_path, link_path)
def try_mkdir_r(path):
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST: raise
def try_rmdir_r(options, path):
path = abspath(path)
while is_child_dir(path, options.install_path):
try:
os.rmdir(path)
except OSError as e:
if e.errno == errno.ENOTEMPTY: return
if e.errno == errno.ENOENT: return
if e.errno == errno.EEXIST and current_system == SYSTEM_AIX: return
raise
path = abspath(path, '..')
def mkpaths(options, path, dest):
if dest.endswith('/') or dest.endswith('\\'):
target_path = abspath(options.install_path, dest, os.path.basename(path))
else:
target_path = abspath(options.install_path, dest)
if os.path.isabs(path):
source_path = path
else:
source_path = abspath(options.root_dir, path)
return source_path, target_path
def try_copy(options, path, dest):
source_path, target_path = mkpaths(options, path, dest)
if not options.silent:
print('installing %s' % target_path)
try_mkdir_r(os.path.dirname(target_path))
try_unlink(target_path) # prevent ETXTBSY errors
return shutil.copy2(source_path, target_path)
def try_remove(options, path, dest):
source_path, target_path = mkpaths(options, path, dest)
if not options.silent:
print('removing %s' % target_path)
try_unlink(target_path)
try_rmdir_r(options, os.path.dirname(target_path))
def install(options, paths, dest):
for path in paths:
try_copy(options, path, dest)
def uninstall(options, paths, dest):
for path in paths:
try_remove(options, path, dest)
def package_files(options, action, name, bins):
target_path = os.path.join('lib/node_modules', name)
# don't install npm if the target path is a symlink, it probably means
# that a dev version of npm is installed there
if os.path.islink(abspath(options.install_path, target_path)): return
# npm has a *lot* of files and it'd be a pain to maintain a fixed list here
# so we walk its source directory instead...
root = os.path.join('deps', name)
for dirname, subdirs, basenames in os.walk(root, topdown=True):
subdirs[:] = [subdir for subdir in subdirs if subdir != 'test']
paths = [os.path.join(dirname, basename) for basename in basenames]
action(options, paths,
os.path.join(target_path, dirname[len(root) + 1:]) + os.path.sep)
# create/remove symlinks
for bin_name, bin_target in bins.items():
link_path = abspath(options.install_path, os.path.join('bin', bin_name))
if action == uninstall:
action(options, [link_path], os.path.join('bin', bin_name))
elif action == install:
try_symlink(options, os.path.join('../lib/node_modules', name, bin_target), link_path)
else:
assert 0 # unhandled action type
def npm_files(options, action):
package_files(options, action, 'npm', {
'npm': 'bin/npm-cli.js',
'npx': 'bin/npx-cli.js',
})
def corepack_files(options, action):
package_files(options, action, 'corepack', {
'corepack': 'dist/corepack.js',
# Not the default just yet:
# 'yarn': 'dist/yarn.js',
# 'yarnpkg': 'dist/yarn.js',
# 'pnpm': 'dist/pnpm.js',
# 'pnpx': 'dist/pnpx.js',
})
# On z/OS, we install node-gyp for convenience, as some vendors don't have
# external access and may want to build native addons.
if sys.platform == 'zos':
link_path = abspath(options.install_path, 'bin/node-gyp')
if action == uninstall:
action(options, [link_path], 'bin/node-gyp')
elif action == install:
try_symlink(options, '../lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js', link_path)
else:
assert 0 # unhandled action type
def subdir_files(options, path, dest, action):
source_path, _ = mkpaths(options, path, dest)
ret = {}
for dirpath, dirnames, filenames in os.walk(source_path):
files_in_path = [os.path.join(os.path.relpath(dirpath, options.root_dir), f) for f in filenames if f.endswith('.h')]
ret[os.path.join(dest, os.path.relpath(dirpath, source_path))] = files_in_path
for subdir, files_in_path in ret.items():
action(options, files_in_path, subdir + os.path.sep)
def files(options, action):
node_bin = 'node'
if options.is_win:
node_bin += '.exe'
action(options, [os.path.join(options.build_dir, node_bin)], os.path.join('bin', node_bin))
if 'true' == options.variables.get('node_shared'):
if options.is_win:
action(options, [os.path.join(options.build_dir, 'libnode.dll')], 'bin/libnode.dll')
action(options, [os.path.join(options.build_dir, 'libnode.lib')], 'lib/libnode.lib')
elif sys.platform == 'zos':
# GYP will output to lib.target; see _InstallableTargetInstallPath
# function in tools/gyp/pylib/gyp/generator/make.py
output_prefix = os.path.join(options.build_dir, 'lib.target')
output_lib = 'libnode.' + options.variables.get('shlib_suffix')
action(options, [os.path.join(output_prefix, output_lib)], os.path.join('lib', output_lib))
# create libnode.x that references libnode.so (C++ addons compat)
os.system(os.path.dirname(os.path.realpath(__file__)) +
'/zos/modifysidedeck.sh ' +
abspath(options.install_path, 'lib', output_lib) + ' ' +
abspath(options.install_path, 'lib/libnode.x') + ' libnode.so')
# install libnode.version.so
so_name = 'libnode.' + re.sub(r'\.x$', '.so', options.variables.get('shlib_suffix'))
action(options, [os.path.join(output_prefix, so_name)], options.variables.get('libdir') + '/' + so_name)
# create symlink of libnode.so -> libnode.version.so (C++ addons compat)
link_path = abspath(options.install_path, 'lib/libnode.so')
try_symlink(options, so_name, link_path)
else:
output_lib = 'libnode.' + options.variables.get('shlib_suffix')
action(options, [os.path.join(options.build_dir, output_lib)],
os.path.join(options.variables.get('libdir'), output_lib))
action(options, [os.path.join(options.v8_dir, 'tools/gdbinit')], 'share/doc/node/')
action(options, [os.path.join(options.v8_dir, 'tools/lldb_commands.py')], 'share/doc/node/')
if 'openbsd' in sys.platform:
action(options, ['doc/node.1'], 'man/man1/')
else:
action(options, ['doc/node.1'], 'share/man/man1/')
if 'true' == options.variables.get('node_install_npm'):
npm_files(options, action)
if 'true' == options.variables.get('node_install_corepack'):
corepack_files(options, action)
headers(options, action)
def headers(options, action):
def wanted_v8_headers(options, files_arg, dest):
v8_headers = [
# The internal cppgc headers are depended on by the public
# ones, so they need to be included as well.
'include/cppgc/internal/api-constants.h',
'include/cppgc/internal/atomic-entry-flag.h',
'include/cppgc/internal/base-page-handle.h',
'include/cppgc/internal/caged-heap-local-data.h',
'include/cppgc/internal/caged-heap.h',
'include/cppgc/internal/compiler-specific.h',
'include/cppgc/internal/finalizer-trait.h',
'include/cppgc/internal/gc-info.h',
'include/cppgc/internal/logging.h',
'include/cppgc/internal/member-storage.h',
'include/cppgc/internal/name-trait.h',
'include/cppgc/internal/persistent-node.h',
'include/cppgc/internal/pointer-policies.h',
'include/cppgc/internal/write-barrier.h',
# cppgc headers
'include/cppgc/allocation.h',
'include/cppgc/common.h',
'include/cppgc/cross-thread-persistent.h',
'include/cppgc/custom-space.h',
'include/cppgc/default-platform.h',
'include/cppgc/ephemeron-pair.h',
'include/cppgc/explicit-management.h',
'include/cppgc/garbage-collected.h',
'include/cppgc/heap-consistency.h',
'include/cppgc/heap-handle.h',
'include/cppgc/heap-state.h',
'include/cppgc/heap-statistics.h',
'include/cppgc/heap.h',
'include/cppgc/liveness-broker.h',
'include/cppgc/macros.h',
'include/cppgc/member.h',
'include/cppgc/name-provider.h',
'include/cppgc/object-size-trait.h',
'include/cppgc/persistent.h',
'include/cppgc/platform.h',
'include/cppgc/prefinalizer.h',
'include/cppgc/process-heap-statistics.h',
'include/cppgc/sentinel-pointer.h',
'include/cppgc/source-location.h',
'include/cppgc/testing.h',
'include/cppgc/trace-trait.h',
'include/cppgc/type-traits.h',
'include/cppgc/visitor.h',
# libplatform headers
'include/libplatform/libplatform-export.h',
'include/libplatform/libplatform.h',
'include/libplatform/v8-tracing.h',
# v8 headers
'include/v8-array-buffer.h',
'include/v8-callbacks.h',
'include/v8-container.h',
'include/v8-context.h',
'include/v8-cppgc.h',
'include/v8-data.h',
'include/v8-date.h',
'include/v8-debug.h',
'include/v8-embedder-heap.h',
'include/v8-embedder-state-scope.h',
'include/v8-exception.h',
'include/v8-extension.h',
'include/v8-external.h',
'include/v8-forward.h',
'include/v8-function-callback.h',
'include/v8-function.h',
'include/v8-handle-base.h',
'include/v8-initialization.h',
'include/v8-internal.h',
'include/v8-isolate.h',
'include/v8-json.h',
'include/v8-local-handle.h',
'include/v8-locker.h',
'include/v8-maybe.h',
'include/v8-memory-span.h',
'include/v8-message.h',
'include/v8-microtask-queue.h',
'include/v8-microtask.h',
'include/v8-object.h',
'include/v8-persistent-handle.h',
'include/v8-platform.h',
'include/v8-primitive-object.h',
'include/v8-primitive.h',
'include/v8-profiler.h',
'include/v8-promise.h',
'include/v8-proxy.h',
'include/v8-regexp.h',
'include/v8-sandbox.h',
'include/v8-script.h',
'include/v8-snapshot.h',
'include/v8-source-location.h',
'include/v8-statistics.h',
'include/v8-template.h',
'include/v8-traced-handle.h',
'include/v8-typed-array.h',
'include/v8-unwinder.h',
'include/v8-value-serializer.h',
'include/v8-value.h',
'include/v8-version.h',
'include/v8-wasm.h',
'include/v8-weak-callback-info.h',
'include/v8.h',
'include/v8config.h',
]
if sys.platform == 'win32':
# Native win32 python uses \ for path separator.
v8_headers = [os.path.normpath(path) for path in v8_headers]
if os.path.isabs(options.v8_dir):
rel_v8_dir = os.path.relpath(options.v8_dir, options.root_dir)
else:
rel_v8_dir = options.v8_dir
files_arg = [name for name in files_arg if os.path.relpath(name, rel_v8_dir) in v8_headers]
action(options, files_arg, dest)
def wanted_zoslib_headers(options, files_arg, dest):
import glob
zoslib_headers = glob.glob(zoslibinc + '/*.h')
files_arg = [name for name in files_arg if name in zoslib_headers]
action(options, files_arg, dest)
action(options, [
options.config_gypi_path,
'common.gypi',
'src/node.h',
n-api: add support for abi stable module API Add support for abi stable module API (N-API) as "Experimental feature". The goal of this API is to provide a stable Node API for native module developers. N-API aims to provide ABI compatibility guarantees across different Node versions and also across different Node VMs - allowing N-API enabled native modules to just work across different versions and flavors of Node.js without recompilation. A more detailed introduction is provided in: https://github.com/nodejs/node-eps/blob/master/005-ABI-Stable-Module-API.md and https://github.com/nodejs/abi-stable-node/blob/doc/VM%20Summit.pdf. The feature, during its experimental state, will be guarded by a runtime flag "--napi-modules". Only when this flag is added to the command line will N-API modules along with regular non N-API modules be supported. The API is defined by the methods in "src/node_api.h" and "src/node_api_types.h". This is the best starting point to review the API surface. More documentation will follow. In addition to the implementation of the API using V8, which is included in this PR, the API has also been validated against chakracore and that port is available in https://github.com/nodejs/abi-stable-node/tree/api-prototype-chakracore-8.x. The current plan is to provide N-API support in versions 8.X and 6.X directly. For older versions, such as 4.X or pre N-API versions of 6.X, we plan to create an external npm module to provide a migration path that will allow modules targeting older Node.js versions to use the API, albeit without getting the advantage of not having to recompile. In addition, we also plan an external npm package with C++ sugar to simplify the use of the API. The sugar will be in-line only and will only use the exported N-API methods but is not part of the N-API itself. The current version is in: https://github.com/nodejs/node-api. This PR is a result of work in the abi-stable-node repo: https://github.com/nodejs/abi-stable-node/tree/doc, with this PR being the cumulative work on the api-prototype-8.x branch with the following contributors in alphabetical order: Author: Arunesh Chandra <arunesh.chandra@microsoft.com> Author: Gabriel Schulhof <gabriel.schulhof@intel.com> Author: Hitesh Kanwathirtha <hiteshk@microsoft.com> Author: Ian Halliday <ianhall@microsoft.com> Author: Jason Ginchereau <jasongin@microsoft.com> Author: Michael Dawson <michael_dawson@ca.ibm.com> Author: Sampson Gao <sampsong@ca.ibm.com> Author: Taylor Woll <taylor.woll@microsoft.com> PR-URL: https://github.com/nodejs/node/pull/11975 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
2017-03-20 21:55:26 +00:00
'src/node_api.h',
src: factor out Node.js-agnostic N-APIs Split the Node.js ECMAScript API (N-EAPI?) into its own header and implementation files. The motivation is that the ECMAScript API stand on its own so it might be embedded separately, implementation and all. Portions of the implementation used by both files are stored in `node_api_impl.h`. The checked boxes below indicate that the given API remains in `node_api.h`, whereas the lack of a checkbox indicates that the API was moved to `node_ecma_api.h`. * [x] NAPI_MODULE * [x] NAPI_MODULE_INIT * [x] napi_acquire_threadsafe_function * [x] napi_add_env_cleanup_hook * [x] napi_async_destroy * [x] napi_async_init * [x] napi_call_threadsafe_function * [x] napi_cancel_async_work * [x] napi_close_callback_scope * [x] napi_create_async_work * [x] napi_create_buffer * [x] napi_create_buffer_copy * [x] napi_create_external_buffer * [x] napi_create_threadsafe_function * [x] napi_delete_async_work * [x] napi_fatal_error * [x] napi_fatal_exception * [x] napi_get_buffer_info * [x] napi_get_node_version * [x] napi_get_threadsafe_function_context * [x] napi_get_uv_event_loop * [x] napi_is_buffer * [x] napi_make_callback * [x] napi_module_register * [x] napi_open_callback_scope * [x] napi_queue_async_work * [x] napi_ref_threadsafe_function * [x] napi_release_threadsafe_function * [x] napi_remove_env_cleanup_hook * [x] napi_unref_threadsafe_function * [ ] napi_add_finalizer * [ ] napi_adjust_external_memory * [ ] napi_call_function * [ ] napi_close_escapable_handle_scope * [ ] napi_close_handle_scope * [ ] napi_coerce_to_bool * [ ] napi_coerce_to_number * [ ] napi_coerce_to_object * [ ] napi_coerce_to_string * [ ] napi_create_array * [ ] napi_create_arraybuffer * [ ] napi_create_array_with_length * [ ] napi_create_bigint_int64 * [ ] napi_create_bigint_uint64 * [ ] napi_create_bigint_words * [ ] napi_create_dataview * [ ] napi_create_double * [ ] napi_create_error * [ ] napi_create_external * [ ] napi_create_external_arraybuffer * [ ] napi_create_function * [ ] napi_create_int32 * [ ] napi_create_int64 * [ ] napi_create_object * [ ] napi_create_promise * [ ] napi_create_range_error * [ ] napi_create_reference * [ ] napi_create_string_latin1 * [ ] napi_create_string_utf16 * [ ] napi_create_string_utf8 * [ ] napi_create_symbol * [ ] napi_create_typedarray * [ ] napi_create_type_error * [ ] napi_create_uint32 * [ ] napi_define_class * [ ] napi_define_properties * [ ] napi_delete_element * [ ] napi_delete_property * [ ] napi_delete_reference * [ ] napi_escape_handle * [ ] napi_get_and_clear_last_exception * [ ] napi_get_arraybuffer_info * [ ] napi_get_array_length * [ ] napi_get_boolean * [ ] napi_get_cb_info * [ ] napi_get_dataview_info * [ ] napi_get_element * [ ] napi_get_global * [ ] napi_get_last_error_info * [ ] napi_get_named_property * [ ] napi_get_new_target * [ ] napi_get_null * [ ] napi_get_property * [ ] napi_get_property_names * [ ] napi_get_prototype * [ ] napi_get_reference_value * [ ] napi_get_typedarray_info * [ ] napi_get_undefined * [ ] napi_get_value_bigint_int64 * [ ] napi_get_value_bigint_uint64 * [ ] napi_get_value_bigint_words * [ ] napi_get_value_bool * [ ] napi_get_value_double * [ ] napi_get_value_external * [ ] napi_get_value_int32 * [ ] napi_get_value_int64 * [ ] napi_get_value_string_latin1 * [ ] napi_get_value_string_utf16 * [ ] napi_get_value_string_utf8 * [ ] napi_get_value_uint32 * [ ] napi_get_version * [ ] napi_has_element * [ ] napi_has_named_property * [ ] napi_has_own_property * [ ] napi_has_property * [ ] napi_instanceof * [ ] napi_is_array * [ ] napi_is_arraybuffer * [ ] napi_is_dataview * [ ] napi_is_error * [ ] napi_is_exception_pending * [ ] napi_is_promise * [ ] napi_is_typedarray * [ ] napi_new_instance * [ ] napi_open_escapable_handle_scope * [ ] napi_open_handle_scope * [ ] napi_reference_ref * [ ] napi_reference_unref * [ ] napi_reject_deferred * [ ] napi_remove_wrap * [ ] napi_resolve_deferred * [ ] napi_run_script * [ ] napi_set_element * [ ] napi_set_named_property * [ ] napi_set_property * [ ] napi_strict_equals * [ ] napi_throw * [ ] napi_throw_error * [ ] napi_throw_range_error * [ ] napi_throw_type_error * [ ] napi_typeof * [ ] napi_unwrap * [ ] napi_wrap PR-URL: https://github.com/nodejs/node/pull/23786 Reviewed-By: Yazhong Liu <yorkiefixer@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
2018-10-19 19:10:59 +00:00
'src/js_native_api.h',
'src/js_native_api_types.h',
n-api: add support for abi stable module API Add support for abi stable module API (N-API) as "Experimental feature". The goal of this API is to provide a stable Node API for native module developers. N-API aims to provide ABI compatibility guarantees across different Node versions and also across different Node VMs - allowing N-API enabled native modules to just work across different versions and flavors of Node.js without recompilation. A more detailed introduction is provided in: https://github.com/nodejs/node-eps/blob/master/005-ABI-Stable-Module-API.md and https://github.com/nodejs/abi-stable-node/blob/doc/VM%20Summit.pdf. The feature, during its experimental state, will be guarded by a runtime flag "--napi-modules". Only when this flag is added to the command line will N-API modules along with regular non N-API modules be supported. The API is defined by the methods in "src/node_api.h" and "src/node_api_types.h". This is the best starting point to review the API surface. More documentation will follow. In addition to the implementation of the API using V8, which is included in this PR, the API has also been validated against chakracore and that port is available in https://github.com/nodejs/abi-stable-node/tree/api-prototype-chakracore-8.x. The current plan is to provide N-API support in versions 8.X and 6.X directly. For older versions, such as 4.X or pre N-API versions of 6.X, we plan to create an external npm module to provide a migration path that will allow modules targeting older Node.js versions to use the API, albeit without getting the advantage of not having to recompile. In addition, we also plan an external npm package with C++ sugar to simplify the use of the API. The sugar will be in-line only and will only use the exported N-API methods but is not part of the N-API itself. The current version is in: https://github.com/nodejs/node-api. This PR is a result of work in the abi-stable-node repo: https://github.com/nodejs/abi-stable-node/tree/doc, with this PR being the cumulative work on the api-prototype-8.x branch with the following contributors in alphabetical order: Author: Arunesh Chandra <arunesh.chandra@microsoft.com> Author: Gabriel Schulhof <gabriel.schulhof@intel.com> Author: Hitesh Kanwathirtha <hiteshk@microsoft.com> Author: Ian Halliday <ianhall@microsoft.com> Author: Jason Ginchereau <jasongin@microsoft.com> Author: Michael Dawson <michael_dawson@ca.ibm.com> Author: Sampson Gao <sampsong@ca.ibm.com> Author: Taylor Woll <taylor.woll@microsoft.com> PR-URL: https://github.com/nodejs/node/pull/11975 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
2017-03-20 21:55:26 +00:00
'src/node_api_types.h',
'src/node_buffer.h',
'src/node_object_wrap.h',
'src/node_version.h',
], 'include/node/')
build: Updates for AIX npm support - part 1 This PR is the first step enabling support for native modules for AIX. The main issue is that unlike linux where all symbols within the Node executable are available to the shared library for a native module (npm), on AIX the symbols must be explicitly exported. In addition, when the shared library is built it must be linked using a list of the available symbols. This patch covers the changes need to: 1) Export the symbols when building the node executable 2) Generate the file listing the symbols that can be used when building the shared library. For AIX, it breaks the build process into 2 steps. The first builds a static library and then generates a node.exp file which contains the symbols from that library. The second builds the node executable and uses the node.exp file to specify which symbols should be exported. In addition, it save the node.exp file so that it can later be used in the creation of the shared library when building a native module. The following additional steps will be required in dependent projects to fully enable AIX for native modules and are being worked separately: - Updates to node-gyp to use node.exp when creating the shared library for a native module - Fixes to gyp related to copying files as covered in https://codereview.chromium.org/1368133002/patch/1/10001 - Pulling in updated gyp versions to Node and node-gyp - Pulling latest libuv These changes were done to minimize the change to other platforms by working within the existing structure to add the 2 step process for AIX without changing the process for other platforms. PR-URL: https://github.com/nodejs/node/pull/3114 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-09-29 14:22:00 +00:00
# Add the expfile that is created on AIX
if sys.platform.startswith('aix') or sys.platform == "os400":
action(options, ['out/Release/node.exp'], 'include/node/')
build: Updates for AIX npm support - part 1 This PR is the first step enabling support for native modules for AIX. The main issue is that unlike linux where all symbols within the Node executable are available to the shared library for a native module (npm), on AIX the symbols must be explicitly exported. In addition, when the shared library is built it must be linked using a list of the available symbols. This patch covers the changes need to: 1) Export the symbols when building the node executable 2) Generate the file listing the symbols that can be used when building the shared library. For AIX, it breaks the build process into 2 steps. The first builds a static library and then generates a node.exp file which contains the symbols from that library. The second builds the node executable and uses the node.exp file to specify which symbols should be exported. In addition, it save the node.exp file so that it can later be used in the creation of the shared library when building a native module. The following additional steps will be required in dependent projects to fully enable AIX for native modules and are being worked separately: - Updates to node-gyp to use node.exp when creating the shared library for a native module - Fixes to gyp related to copying files as covered in https://codereview.chromium.org/1368133002/patch/1/10001 - Pulling in updated gyp versions to Node and node-gyp - Pulling latest libuv These changes were done to minimize the change to other platforms by working within the existing structure to add the 2 step process for AIX without changing the process for other platforms. PR-URL: https://github.com/nodejs/node/pull/3114 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-09-29 14:22:00 +00:00
subdir_files(options, os.path.join(options.v8_dir, 'include'), 'include/node/', wanted_v8_headers)
if 'false' == options.variables.get('node_shared_libuv'):
subdir_files(options, 'deps/uv/include', 'include/node/', action)
if 'true' == options.variables.get('node_use_openssl') and \
'false' == options.variables.get('node_shared_openssl'):
subdir_files(options, 'deps/openssl/openssl/include/openssl', 'include/node/openssl/', action)
subdir_files(options, 'deps/openssl/config/archs', 'include/node/openssl/archs', action)
subdir_files(options, 'deps/openssl/config', 'include/node/openssl', action)
if 'false' == options.variables.get('node_shared_zlib'):
action(options, [
'deps/zlib/zconf.h',
'deps/zlib/zlib.h',
], 'include/node/')
if sys.platform == 'zos':
zoslibinc = os.environ.get('ZOSLIB_INCLUDES')
if not zoslibinc:
raise RuntimeError('Environment variable ZOSLIB_INCLUDES is not set\n')
if not os.path.isfile(zoslibinc + '/zos-base.h'):
raise RuntimeError('ZOSLIB_INCLUDES is not set to a valid location\n')
subdir_files(options, zoslibinc, 'include/node/zoslib/', wanted_zoslib_headers)
def run(options):
if options.headers_only:
if options.command == 'install':
headers(options, install)
return
if options.command == 'uninstall':
headers(options, uninstall)
return
else:
if options.command == 'install':
files(options, install)
return
if options.command == 'uninstall':
files(options, uninstall)
return
raise RuntimeError('Bad command: %s\n' % options.command)
def parse_options(args):
parser = argparse.ArgumentParser(
description='Install headers and binaries into filesystem')
parser.add_argument('command', choices=['install', 'uninstall'])
parser.add_argument('--dest-dir', help='custom install prefix for packagers, i.e. DESTDIR',
default=os.getcwd())
parser.add_argument('--prefix', help='custom install prefix, i.e. PREFIX',
default='/usr/local')
parser.add_argument('--headers-only', help='only install headers',
action='store_true', default=False)
parser.add_argument('--root-dir', help='the root directory of source code',
default=os.getcwd())
parser.add_argument('--build-dir', help='the location of built binaries',
default='out/Release')
parser.add_argument('--v8-dir', help='the location of V8',
default='deps/v8')
parser.add_argument('--config-gypi-path', help='the location of config.gypi',
default='config.gypi')
parser.add_argument('--is-win', help='build for Windows target',
action='store_true',
default=(sys.platform in ['win32', 'cygwin']))
parser.add_argument('--silent', help='do not output log',
action='store_true', default=False)
options = parser.parse_args(args)
# |dest_dir| is a custom install prefix for packagers (think DESTDIR)
# |prefix| is a custom install prefix (think PREFIX)
# Difference is that dest_dir won't be included in shebang lines etc.
# |install_path| thus becomes the base target directory.
options.install_path = os.path.join(options.dest_dir + options.prefix)
# Read variables from the config.gypi.
with open(options.config_gypi_path) as f:
config = ast.literal_eval(f.read())
options.variables = config['variables']
return options
if __name__ == '__main__':
run(parse_options(sys.argv[1:]))