node/tools
William Marlow 1af70548bd build: fix various shared library build issues
Node.js unofficially supports a shared library variant where the
main node executable is a thin wrapper around node.dll/libnode.so.
The key benefit of this is to support embedding Node.js in other
applications.

Since Node.js 12 there have been a number of issues preventing the
shared library build from working correctly, primarily on Windows:

* A number of functions used executables such as `mksnapshot` are
    not exported from `libnode.dll` using a `NODE_EXTERN` attribute
* A dependency on the `Winmm` system library is missing
* Incorrect defines on executable targets leads to `node.exe`
    claiming to export a number of functions that are actually in
    `libnode.dll`
* Because `node.exe` attempts to export symbols, `node.lib` gets
    generated causing native extensions to try to link against
    `node.exe` not `libnode.dll`.
* Similarly, because `node.dll` was renamed to `libnode.dll`,
    native extensions don't know to look for `libnode.lib` rather
    than `node.lib`.
* On macOS an RPATH is added to find `libnode.dylib` relative to
    `node` in the same folder. This works fine from the
    `out/Release` folder but not from an installed prefix, where
    `node` will be in `bin/` and `libnode.dylib` will be in `lib/`.
* Similarly on Linux, no RPATH is added so LD_LIBRARY_PATH needs
    setting correctly for `bin/node` to find `lib/libnode.so`.

For the `libnode.lib` vs `node.lib` issue there are two possible
options:

1. Ensure `node.lib` from `node.exe` does not get generated, and
    instead copy `libnode.lib` to `node.lib`. This means addons
    compiled when referencing the correct `node.lib` file will
    correctly depend on `libnode.dll`. The down side is that
    native addons compiled with stock Node.js will still try to
    resolve symbols against node.exe rather than libnode.dll.
2. After building `libnode.dll`, dump the exports using `dumpbin`,
    and process this to generate a `node.def` file to be linked into
    `node.exe` with the `/DEF:node.def` flag. The export entries
    in `node.def` will all read
    ```
    my_symbol=libnode.my_symbol
    ```
    so that `node.exe` will redirect all exported symbols back to
    `libnode.dll`. This has the benefit that addons compiled with
    stock Node.js will load correctly into `node.exe` from a shared
    library build, but means that every embedding executable also
    needs to perform this same trick.

I went with the first option as it is the cleaner of the two
solutions in my opinion. Projects wishing to generate a shared
library variant of Node.js can now, for example,
```
.\vcbuild dll package vs
```
to generate a full node installation including `libnode.dll`,
`Release\node.lib`, and all the necessary headers. Native addons
can then be built against the shared library build easily by
specifying the correct `nodedir` option.

For example
```
>npx node-gyp configure --nodedir
   C:\Users\User\node\Release\node-v18.0.0-win-x64
...
>npx node-gyp build
...
>dumpbin /dependents build\Release\binding.node
Microsoft (R) COFF/PE Dumper Version 14.29.30136.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file build\Release\binding.node

File Type: DLL

  Image has the following dependencies:

    KERNEL32.dll
    libnode.dll
    VCRUNTIME140.dll
    api-ms-win-crt-string-l1-1-0.dll
    api-ms-win-crt-stdio-l1-1-0.dll
    api-ms-win-crt-runtime-l1-1-0.dll
...
```

PR-URL: https://github.com/nodejs/node/pull/41850
Reviewed-By: Michael Dawson <midawson@redhat.com>
Reviewed-By: Beth Griggs <bgriggs@redhat.com>
Reviewed-By: Richard Lau <rlau@redhat.com>
2022-05-06 17:24:46 -04:00
..
actions tools: fix skip PR if CI is still running 2022-03-21 04:33:11 +00:00
bootstrap
clang-format tools: update clang-format 1.6.0 to 1.7.0 2022-04-14 06:29:47 +01:00
code_cache tools,test: fix V8 initialization order 2022-04-12 22:10:37 +02:00
configure.d
doc tools: update doc to highlight.js@11.5.1 2022-04-17 07:44:36 +01:00
eslint-rules tools: lint deprecation codes 2022-02-19 18:14:09 +01:00
gyp doc: consolidate use of multiple-byte units 2022-04-20 00:46:37 +02:00
icu deps: update ICU to 71.1 2022-04-10 10:13:52 +01:00
inspector_protocol doc: consolidate use of multiple-byte units 2022-04-20 00:46:37 +02:00
lint-md tools: update lint-md-dependencies 2022-05-01 21:39:22 +01:00
macos-installer
msvs build: improve reliability of find_python.cmd script 2022-04-23 20:45:27 +01:00
node_modules tools: bump jsdoccomment from 0.22.1 to 0.29.0 2022-04-25 15:19:21 +01:00
pip
rpm
snapshot bootstrap: move embedded snapshot to SnapshotBuilder 2022-04-20 02:21:24 +08:00
v8
v8_gypfiles build: enable V8's shared read-only heap 2022-04-24 07:29:13 +01:00
.eslintrc.yaml tools: enable no-var ESLint rule for lib 2022-04-04 10:53:29 +00:00
build-addons.js
certdata.txt
checkimports.py
compress_json.py doc: consolidate use of multiple-byte units 2022-04-20 00:46:37 +02:00
copyfile.py
cpplint.py tools: refloat 7 Node.js patches to cpplint.py 2022-03-22 22:44:54 -07:00
create_android_makefiles
create_expfile.sh
enable_fips_include.py
find-inactive-collaborators.mjs tools: use GITHUB_ACTIONS env var in inactivity scripts 2022-01-10 10:14:31 +00:00
find-inactive-tsc.mjs tools: fix small not-quite-a-bug in find-inactive-tsc.mjs 2022-01-14 06:22:42 +00:00
gen_node_def.cc build: fix various shared library build issues 2022-05-06 17:24:46 -04:00
genv8constants.py
getarch.py
getendian.py
getmachine.py
getmoduleversion.py
getnapibuildversion.py
getnodeversion.py
getsharedopensslhasquic.py
gyp_node.py
install.py build: fix various shared library build issues 2022-05-06 17:24:46 -04:00
js2c.py
license2rtf.js
license-builder.sh lib: add fetch 2022-02-01 08:17:50 +00:00
lint-pr-url.mjs
lint-sh.js tools: use arrow function for callback in lint-sh.js 2021-12-22 10:44:09 +00:00
lsan_suppressions.txt
macos-firewall.sh tools: lint osx shell scripts 2022-04-14 23:08:55 +01:00
make-v8.sh build: use ccache in make-v8.sh on ppc64le and s390x 2022-03-07 23:25:41 +00:00
mk-ca-bundle.pl
mkssldef.py
osx-codesign.sh
osx-entitlements.plist
osx-gon-config.json.tmpl
osx-notarize.sh tools: lint osx shell scripts 2022-04-14 23:08:55 +01:00
osx-pkg-postinstall.sh
osx-productsign.sh
release.sh
run-valgrind.py
run-worker.js test: move test-crypto-engine to addon 2022-02-07 17:29:54 -05:00
sign.bat
specialize_node_d.py
test-npm-package.js
test-v8.bat
test.py test: give slow tests more time on Rasberry PIs 2022-03-18 16:02:13 -04:00
update-authors.js tools: consolidate update-authors.js logic 2021-12-23 06:46:26 +00:00
update-cares.sh tools: add script to update c-ares 2021-11-01 19:48:44 -07:00
update-eslint.sh tools: include JSDoc in ESLint updating tool 2021-12-01 20:00:11 -08:00
update-nghttp2.sh deps: update nghttp2 to 1.47.0 2022-02-27 12:28:04 +00:00
update-npm.sh
update-undici.sh deps: update undici to 5.1.1 2022-05-02 13:15:50 +01:00
utils.py
valgrind.supp