Skip to content

Commit 79160b3

Browse files
committed
Add NODE_RAW_ENV to mirror host env vars under node
One can still use `-sDETERMINISITIC` to avoid this behaviour. Fixes: #18816, #25791
1 parent 5476e75 commit 79160b3

File tree

6 files changed

+48
-2
lines changed

6 files changed

+48
-2
lines changed

ChangeLog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,10 @@ See docs/process.md for more on how version tagging works.
10991099
- The `emscripten_proxy_async_with_callback` API was replaced with a simpler
11001100
`emscripten_proxy_callback` API that takes a second callback to be called if
11011101
the worker thread dies before completing the proxied work.
1102+
- When running under node the full set of environment variables (i.e.
1103+
process.env) are now reflected to running emscripten process (via e.g.
1104+
getenv). If you don't want this behaviour `-sDETERMINISTIC` can be used
1105+
to disable this can give fake envinonment instead.
11021106

11031107
3.1.32 - 02/17/23
11041108
-----------------

site/source/docs/tools_reference/settings_reference.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,6 +1506,18 @@ handles permissions and errors and so forth may be noticeable.
15061506

15071507
Default value: false
15081508

1509+
.. _node_raw_env:
1510+
1511+
NODE_RAW_ENV
1512+
============
1513+
1514+
When running under nodejs, expose the underlying OS environment variables.
1515+
This is similiar to how ``NODERAWFS`` exporses the underlying FS.
1516+
This setting gets enabled by default when ``NODERAWFS`` is enabled, but can
1517+
also be controlled separatley.
1518+
1519+
Default value: false
1520+
15091521
.. _node_code_caching:
15101522

15111523
NODE_CODE_CACHING

src/lib/libwasi.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ var WasiLibrary = {
6767
'_': getExecutableName()
6868
#endif
6969
};
70+
#if ENVIRONMENT_MAY_BE_NODE && NODE_RAW_ENV
71+
if (ENVIRONMENT_IS_NODE) {
72+
// Under node we mirror then entire outer environment
73+
env = process.env;
74+
}
75+
#endif
7076
// Apply the user-provided values, if any.
7177
for (var x in ENV) {
7278
// x is a key in ENV; if ENV[x] is undefined, that means it was

src/settings.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,12 @@ var FORCE_FILESYSTEM = false;
10351035
// [link]
10361036
var NODERAWFS = false;
10371037

1038+
// When running under nodejs, expose the underlying OS environment variables.
1039+
// This is similiar to how ``NODERAWFS`` exporses the underlying FS.
1040+
// This setting gets enabled by default when ``NODERAWFS`` is enabled, but can
1041+
// also be controlled separatley.
1042+
var NODE_RAW_ENV = false;
1043+
10381044
// This saves the compiled wasm module in a file with name
10391045
// ``$WASM_BINARY_NAME.$V8_VERSION.cached``
10401046
// and loads it on subsequent runs. This caches the compiled wasm code from

test/test_other.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7841,6 +7841,23 @@ def test_override_js_execution_environment(self):
78417841
seen = self.run_js('test.js', engine=engine, assert_returncode=NON_ZERO)
78427842
self.assertContained('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node', seen)
78437843

7844+
@requires_node
7845+
@with_env_modify({'FOO': 'bar'})
7846+
@parameterized({
7847+
'': ([], '|(null)|\n'),
7848+
'raw_fs': (['-sNODERAWFS'], '|bar|\n'),
7849+
'raw_env': (['-sNODE_RAW_ENV'], '|bar|\n'),
7850+
})
7851+
def test_node_environ(self, args, expected):
7852+
create_file('src.c', r'''
7853+
#include <stdlib.h>
7854+
#include <stdio.h>
7855+
int main() {
7856+
printf("|%s|\n", getenv("FOO"));
7857+
}
7858+
''')
7859+
self.do_runf('src.c', expected, cflags=args)
7860+
78447861
def test_override_c_environ(self):
78457862
create_file('pre.js', r'''
78467863
Module.preRun = () => { ENV.hello = '💩 world'; ENV.LANG = undefined; }
@@ -13655,8 +13672,6 @@ def test_fs_icase(self):
1365513672

1365613673
@with_all_fs
1365713674
def test_std_filesystem(self):
13658-
if (WINDOWS or MACOS) and self.get_setting('NODERAWFS'):
13659-
self.skipTest('Rawfs directory removal works only on Linux')
1366013675
self.do_other_test('test_std_filesystem.cpp')
1366113676

1366213677
def test_strict_js_closure(self):

tools/link.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,6 +1884,9 @@ def get_full_import_name(name):
18841884
if settings.PTHREADS:
18851885
settings.REQUIRED_EXPORTS.append('_emscripten_tls_init')
18861886

1887+
if settings.NODERAWFS:
1888+
default_setting('NODE_RAW_ENV', 1)
1889+
18871890
settings.PRE_JS_FILES = options.pre_js
18881891
settings.POST_JS_FILES = options.post_js
18891892

0 commit comments

Comments
 (0)