Skip to content

Commit 21e4019

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 acb90da commit 21e4019

File tree

8 files changed

+83
-0
lines changed

8 files changed

+83
-0
lines changed

ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ See docs/process.md for more on how version tagging works.
2020

2121
4.0.21 (in development)
2222
-----------------------
23+
- When using `-sNODERAWFS` emscripten will now also mirror all host environment
24+
variables. This behaviour can also be separetely controlled with a new
25+
`NODE_HOST_ENV` setting. (#18820)
2326

2427
4.0.20 - 11/18/25
2528
-----------------

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_host_env:
1510+
1511+
NODE_HOST_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_HOST_ENV
71+
if (ENVIRONMENT_IS_NODE) {
72+
// When NODE_HOST_ENV is enabled we mirror then entire host 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_HOST_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
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <cassert>
2+
#include <filesystem>
3+
#include <fstream>
4+
#include <iostream>
5+
6+
namespace fs = std::filesystem;
7+
8+
int main() {
9+
// libc++'s temp_directory_path dependong on one of these env vars
10+
// being set, and falls back to /tmp as a default.
11+
// Log these values in case this test ever fails:
12+
const char* env_paths[] = {"TMPDIR", "TMP", "TEMP", "TEMPDIR"};
13+
for (int i = 0; i < sizeof(env_paths)/sizeof(char*); i++) {
14+
const char* p = getenv(env_paths[i]);
15+
std::cout << env_paths[i] << " -> " << (p ? p : "(NULL)") << "\n";
16+
if (p) {
17+
std::cout << env_paths[i] << " exists: " << fs::exists(env_paths[i]) << "\n";
18+
}
19+
}
20+
std::cout << "default /tmp exists: " << fs::exists("/tmp") << "\n";
21+
22+
fs::path tmp{fs::temp_directory_path()};
23+
std::cout << "temp_directory_path: " << tmp << "\n";
24+
assert(fs::exists(tmp));
25+
std::cout << "exists ok!" << "\n";
26+
return 0;
27+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exists ok!

test/test_other.py

Lines changed: 25 additions & 0 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+
'rawfs': (['-sNODERAWFS'], '|bar|\n'),
7849+
'enabled': (['-sNODE_HOST_ENV'], '|bar|\n'),
7850+
})
7851+
def test_node_host_env(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; }
@@ -13653,12 +13670,20 @@ def test_fs_icase(self):
1365313670
# c++20 for ends_with().
1365413671
self.do_other_test('test_fs_icase.cpp', cflags=['-sCASE_INSENSITIVE_FS', '-std=c++20'])
1365513672

13673+
@crossplatform
1365613674
@with_all_fs
1365713675
def test_std_filesystem(self):
1365813676
if (WINDOWS or MACOS) and self.get_setting('NODERAWFS'):
1365913677
self.skipTest('Rawfs directory removal works only on Linux')
1366013678
self.do_other_test('test_std_filesystem.cpp')
1366113679

13680+
@crossplatform
13681+
@with_all_fs
13682+
def test_std_filesystem_tempdir(self):
13683+
if (WINDOWS or MACOS) and self.get_setting('NODERAWFS') and self.get_setting('WASMFS'):
13684+
self.skipTest('NODERAWFS + WASMFS is does not allow access to arbitrary paths')
13685+
self.do_other_test('test_std_filesystem_tempdir.cpp', cflags=['-g'])
13686+
1366213687
def test_strict_js_closure(self):
1366313688
self.do_runf('hello_world.c', cflags=['-sSTRICT_JS', '-Werror=closure', '--closure=1', '-O3'])
1366413689

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_HOST_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)