dsh-remote 0.8.48 → 0.8.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/lib/client.js +89 -16
  2. package/lib/index.js +37 -0
  3. package/lib/remote-shell-child.cjs +305 -0
  4. package/lib/remote-shell.js +518 -0
  5. package/package.json +1 -2
  6. package/node_modules/buildcheck/.eslintrc.js +0 -5
  7. package/node_modules/buildcheck/.github/workflows/ci.yml +0 -88
  8. package/node_modules/buildcheck/.github/workflows/lint.yml +0 -27
  9. package/node_modules/buildcheck/.npmignore +0 -3
  10. package/node_modules/buildcheck/LICENSE +0 -19
  11. package/node_modules/buildcheck/README.md +0 -106
  12. package/node_modules/buildcheck/deps/Find-VisualStudio.cs +0 -250
  13. package/node_modules/buildcheck/lib/findvs.js +0 -361
  14. package/node_modules/buildcheck/lib/index.js +0 -738
  15. package/node_modules/buildcheck/package.json +0 -36
  16. package/node_modules/buildcheck/test/test.js +0 -8
  17. package/node_modules/cpu-features/.eslintrc.js +0 -5
  18. package/node_modules/cpu-features/.github/workflows/ci.yml +0 -74
  19. package/node_modules/cpu-features/.github/workflows/lint.yml +0 -27
  20. package/node_modules/cpu-features/LICENSE +0 -19
  21. package/node_modules/cpu-features/README.md +0 -59
  22. package/node_modules/cpu-features/binding.gyp +0 -16
  23. package/node_modules/cpu-features/buildcheck.js +0 -32
  24. package/node_modules/cpu-features/deps/cpu_features/.clang-format +0 -4
  25. package/node_modules/cpu-features/deps/cpu_features/.dockerignore +0 -31
  26. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/Dockerfile +0 -5
  27. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/aarch64_linux_cmake.yml +0 -30
  28. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_freebsd_cmake.yml +0 -22
  29. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_bazel.yml +0 -26
  30. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml +0 -31
  31. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml +0 -43
  32. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml +0 -25
  33. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml +0 -31
  34. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml +0 -24
  35. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml +0 -30
  36. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml +0 -29
  37. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml +0 -28
  38. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml +0 -27
  39. package/node_modules/cpu-features/deps/cpu_features/.grenrc.yml +0 -21
  40. package/node_modules/cpu-features/deps/cpu_features/BUILD.bazel +0 -329
  41. package/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt +0 -261
  42. package/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md +0 -23
  43. package/node_modules/cpu-features/deps/cpu_features/LICENSE +0 -230
  44. package/node_modules/cpu-features/deps/cpu_features/README.md +0 -272
  45. package/node_modules/cpu-features/deps/cpu_features/WORKSPACE +0 -19
  46. package/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md +0 -5
  47. package/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl +0 -11
  48. package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in +0 -3
  49. package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in +0 -3
  50. package/node_modules/cpu-features/deps/cpu_features/cmake/README.md +0 -30
  51. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile +0 -252
  52. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md +0 -40
  53. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot +0 -64
  54. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg +0 -312
  55. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh +0 -7
  56. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile +0 -48
  57. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile +0 -34
  58. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt +0 -22
  59. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp +0 -11
  60. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile +0 -107
  61. package/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in +0 -15
  62. package/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp +0 -105
  63. package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h +0 -54
  64. package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h +0 -384
  65. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h +0 -259
  66. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h +0 -121
  67. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h +0 -74
  68. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h +0 -149
  69. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h +0 -72
  70. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h +0 -108
  71. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h +0 -288
  72. package/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h +0 -40
  73. package/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h +0 -37
  74. package/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h +0 -39
  75. package/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h +0 -240
  76. package/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h +0 -49
  77. package/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h +0 -110
  78. package/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h +0 -70
  79. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt +0 -60
  80. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md +0 -4
  81. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c +0 -205
  82. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h +0 -320
  83. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c +0 -12
  84. package/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch +0 -456
  85. package/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d +0 -165
  86. package/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh +0 -75
  87. package/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh +0 -490
  88. package/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh +0 -79
  89. package/node_modules/cpu-features/deps/cpu_features/src/copy.inl +0 -19
  90. package/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl +0 -86
  91. package/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl +0 -26
  92. package/node_modules/cpu-features/deps/cpu_features/src/equals.inl +0 -22
  93. package/node_modules/cpu-features/deps/cpu_features/src/filesystem.c +0 -62
  94. package/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c +0 -169
  95. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl +0 -88
  96. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c +0 -79
  97. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c +0 -82
  98. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c +0 -138
  99. package/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c +0 -212
  100. package/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c +0 -93
  101. package/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c +0 -163
  102. package/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c +0 -111
  103. package/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c +0 -120
  104. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl +0 -2055
  105. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c +0 -68
  106. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c +0 -58
  107. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c +0 -57
  108. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c +0 -58
  109. package/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c +0 -132
  110. package/node_modules/cpu-features/deps/cpu_features/src/string_view.c +0 -192
  111. package/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c +0 -461
  112. package/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt +0 -114
  113. package/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc +0 -53
  114. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc +0 -396
  115. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc +0 -384
  116. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc +0 -176
  117. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc +0 -131
  118. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc +0 -180
  119. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc +0 -82
  120. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc +0 -1729
  121. package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc +0 -103
  122. package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h +0 -61
  123. package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc +0 -52
  124. package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h +0 -31
  125. package/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc +0 -132
  126. package/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc +0 -202
  127. package/node_modules/cpu-features/lib/index.js +0 -5
  128. package/node_modules/cpu-features/package.json +0 -40
  129. package/node_modules/cpu-features/src/binding.cc +0 -151
  130. package/node_modules/cpu-features/test/test.js +0 -12
@@ -1,738 +0,0 @@
1
- 'use strict';
2
-
3
- // TODO: take `compilerParams`, headers into account in cache for all cached
4
- // results
5
- // TODO: debug output
6
-
7
- const { spawnSync } = require('child_process');
8
- const { unlinkSync, writeFileSync } = require('fs');
9
- const { tmpdir } = require('os');
10
- const { win32: path } = require('path');
11
- const { inspect } = require('util');
12
-
13
- const isWindows = (process.platform === 'win32');
14
- const findVS = require('./findvs.js');
15
-
16
- const RE_HEADER_DECORATED = /^(?:"(.+)")|(?:<(.+)>)$/;
17
-
18
- const genWinTmpFilenames = (() => {
19
- let instance = 1;
20
- return () => {
21
- const base =
22
- path.resolve(tmpdir(), `_buildcheck-${process.pid}-${instance++}`);
23
- return {
24
- input: `${base}.in.tmp`,
25
- object: `${base}.out.obj`,
26
- output: `${base}.out.tmp`,
27
- };
28
- };
29
- })();
30
-
31
- function getKind(prop) {
32
- const spawnOpts = {
33
- encoding: 'utf8',
34
- stdio: 'pipe',
35
- windowsHide: true,
36
- };
37
-
38
- const lang = (prop === '_cc' ? 'c' : 'c++');
39
-
40
- if (isWindows) {
41
- spawnOpts.stdio = [ 'ignore', 'pipe', 'pipe' ];
42
- writeFileSync(this._tmpInFile, [
43
- '_MSC_VER',
44
- ].join(' '));
45
- const result = spawnSync(
46
- this[prop],
47
- [ '-EP', `-T${lang === 'c' ? 'c' : 'p'}`, this._tmpInFile],
48
- spawnOpts
49
- );
50
- unlinkSync(this._tmpInFile);
51
-
52
- if (result.status === 0) {
53
- const values = result.stdout.trim().split(' ');
54
- if (values.length === 1 && /^\d+$/.test(values[0])) {
55
- this[`${prop}Kind`] = 'msvc';
56
- this[`${prop}Version`] = values[0];
57
- this[`${prop}SpawnOpts`] = spawnOpts;
58
- this._debug(
59
- `>>> Detected MSVC ${values[0]} for ${lang.toUpperCase()} language`
60
- );
61
- return;
62
- }
63
- }
64
- } else {
65
- const result = spawnSync(
66
- this[prop],
67
- [ '-E', '-P', '-x', lang, '-' ],
68
- {
69
- ...spawnOpts,
70
- input: [
71
- '__clang__',
72
- '__GNUC__',
73
- '__GNUC_MINOR__',
74
- '__GNUC_PATCHLEVEL__',
75
- '__clang_major__',
76
- '__clang_minor__',
77
- '__clang_patchlevel__',
78
- ].join(' '),
79
- }
80
- );
81
-
82
- if (result.status === 0) {
83
- const values = result.stdout.trim().split(' ');
84
- if (values.length === 7) {
85
- let kind;
86
- let version;
87
- if (values[0] === '1') {
88
- kind = 'clang';
89
- version = values.slice(4).map((v) => +v);
90
- } else {
91
- kind = 'gnu';
92
- version = values.slice(1, 4).map((v) => +v);
93
- }
94
- let good = true;
95
- for (const part of version) {
96
- if (!isFinite(part) || part < 0) {
97
- good = false;
98
- break;
99
- }
100
- }
101
- if (good) {
102
- this[`${prop}Kind`] = kind;
103
- this[`${prop}Version`] = version;
104
- this[`${prop}SpawnOpts`] = spawnOpts;
105
- const verStr = version.join('.');
106
- this._debug(
107
- `>>> Detected ${kind} ${verStr} for ${lang.toUpperCase()} language`
108
- );
109
- return;
110
- }
111
- }
112
- }
113
- }
114
-
115
- throw new Error('Unable to detect compiler type');
116
- }
117
-
118
- class BuildEnvironment {
119
- constructor(cfg) {
120
- if (typeof cfg !== 'object' || cfg === null)
121
- cfg = {};
122
-
123
- this._debug = (typeof cfg.debug === 'function' ? cfg.debug : () => {});
124
-
125
- let cc;
126
- let cxx;
127
- if (isWindows) {
128
- const versions = findVS();
129
- this._debug(
130
- `>>> Detected MSVS installations: ${inspect(versions, false, 10)}`
131
- );
132
- if (versions.length === 0)
133
- throw new Error('Unable to detect compiler type');
134
- let selected_msvs;
135
- if (cfg.msvs_version
136
- && (typeof cfg.msvs_version === 'string'
137
- || typeof cfg.msvs_version === 'number')) {
138
- this._debug(`>>> Explicit MSVS requested: ${cfg.msvs_version}`);
139
- // Try to select compiler by year
140
- const msvs_version = cfg.msvs_version.toString();
141
- for (const vs of versions) {
142
- if (vs.year.toString() === msvs_version) {
143
- selected_msvs = vs;
144
- break;
145
- }
146
- }
147
- if (selected_msvs === undefined)
148
- throw new Error(`Unable to find MSVS with year '${msvs_version}'`);
149
- } else {
150
- selected_msvs = versions[0]; // Use newest
151
- }
152
- this._debug(`>>> Using MSVS: ${selected_msvs.year}`);
153
- cc = selected_msvs.cl;
154
- cxx = cc;
155
- this._includePaths = selected_msvs.includePaths;
156
- this._libPaths = selected_msvs.libPaths;
157
- // Add (newest) SDK paths if we have them
158
- for (const sdk of selected_msvs.sdks) {
159
- this._debug(`>>> Using Windows SDK: ${sdk.fullVersion}`);
160
- this._includePaths = this._includePaths.concat(sdk.includePaths);
161
- this._libPaths = this._libPaths.concat(sdk.libPaths);
162
- break;
163
- }
164
-
165
- const { input, object, output } = genWinTmpFilenames();
166
- this._tmpInFile = input;
167
- this._tmpObjFile = object;
168
- this._tmpOutFile = output;
169
- } else {
170
- cc = ((typeof cfg.compilerC === 'string' && cfg.compilerC)
171
- || process.env.CC
172
- || 'cc');
173
- cxx = ((typeof cfg.compilerCXX === 'string' && cfg.compilerCXX)
174
- || process.env.CXX
175
- || 'c++');
176
- this._debug(`>>> Using C compiler: ${cc}`);
177
- this._debug(`>>> Using C++ compiler: ${cxx}`);
178
- }
179
-
180
- this._cc = cc;
181
- this._ccKind = undefined;
182
- this._ccVersion = undefined;
183
- this._ccSpawnOpts = undefined;
184
-
185
- this._cxx = cxx;
186
- this._cxxKind = undefined;
187
- this._cxxVersion = undefined;
188
- this._cxxSpawnOpts = undefined;
189
-
190
- if (cfg.cache !== false) {
191
- this._cache = new Map(Object.entries({
192
- c: new Map(),
193
- cxx: new Map(),
194
- }));
195
- } else {
196
- this._cache = null;
197
- }
198
- }
199
-
200
- checkDeclared(type, symbolName, opts) {
201
- validateType(type);
202
- if (typeof symbolName !== 'string' || !symbolName)
203
- throw new Error(`Invalid symbol name: ${inspect(symbolName)}`);
204
-
205
- const cached = getCachedValue(type, this._cache, 'declared', symbolName);
206
- if (cached !== undefined) {
207
- this._debug(
208
- `>>> Checking if '${symbolName}' is declared... ${cached} (cached)`
209
- );
210
- return cached;
211
- }
212
-
213
- if (typeof opts !== 'object' || opts === null)
214
- opts = {};
215
-
216
- const { headers, searchLibs } = opts;
217
- const headersList = renderHeaders(Array.isArray(headers)
218
- ? headers
219
- : getDefaultHeaders(this, type));
220
-
221
- const declName = symbolName.replace(/ *\(.*/, '');
222
- const declUse = symbolName.replace(/\(/, '((')
223
- .replace(/\)/, ') 0)')
224
- .replace(/,/g, ') 0, (');
225
-
226
- const libs = [
227
- '',
228
- ...(Array.isArray(searchLibs) ? searchLibs : [])
229
- ];
230
-
231
- for (let lib of libs) {
232
- if (typeof lib !== 'string')
233
- continue;
234
- lib = lib.trim();
235
-
236
- const code = `
237
- ${headersList}
238
-
239
- int
240
- main ()
241
- {
242
- #ifndef ${declName}
243
- #ifdef __cplusplus
244
- (void) ${declUse};
245
- #else
246
- (void) ${declName};
247
- #endif
248
- #endif
249
-
250
- ;
251
- return 0;
252
- }`;
253
- const compilerParams = (lib ? [`-l${lib}`] : []);
254
- const result = this.tryCompile(type, code, compilerParams);
255
-
256
- this._debug(
257
- `>>> Checking if '${symbolName}' is declared `
258
- + `(using ${lib ? `'${lib}'` : 'no'} library)... ${result === true}`
259
- );
260
-
261
- if (result !== true) {
262
- this._debug('... check failed with compiler output:');
263
- this._debug(result.output);
264
- }
265
-
266
- if (result === true) {
267
- setCachedValue(
268
- type,
269
- this._cache,
270
- 'declared',
271
- symbolName,
272
- (result === true)
273
- );
274
- return true;
275
- }
276
- }
277
-
278
- return false;
279
- }
280
-
281
- checkFeature(name) {
282
- const cached = getCachedValue('features', this._cache, null, name);
283
- if (cached !== undefined) {
284
- if (typeof cached === 'object'
285
- && cached !== null
286
- && typeof cached.val !== undefined) {
287
- return cached.val;
288
- }
289
-
290
- return cached;
291
- }
292
-
293
- const feature = features.get(name);
294
- if (feature === undefined)
295
- throw new Error(`Invalid feature: ${name}`);
296
-
297
- let result = feature(this);
298
- if (result === undefined)
299
- result = null;
300
-
301
- setCachedValue('features', this._cache, null, name, result);
302
-
303
- if (typeof result === 'object'
304
- && result !== null
305
- && typeof result.val !== undefined) {
306
- return result.val;
307
- }
308
-
309
- return result;
310
- }
311
-
312
- checkFunction(type, funcName, opts) {
313
- validateType(type);
314
- if (typeof funcName !== 'string' || !funcName)
315
- throw new Error(`Invalid function name: ${inspect(funcName)}`);
316
-
317
- const cached = getCachedValue(type, this._cache, 'functions', funcName);
318
- if (cached !== undefined) {
319
- this._debug(
320
- `>>> Checking if function '${funcName}' exists... true (cached)`
321
- );
322
- return true;
323
- }
324
-
325
- if (typeof opts !== 'object' || opts === null)
326
- opts = {};
327
-
328
- const { searchLibs } = opts;
329
- const libs = [
330
- '',
331
- ...(Array.isArray(searchLibs) ? searchLibs : [])
332
- ];
333
-
334
- for (let lib of libs) {
335
- if (typeof lib !== 'string')
336
- continue;
337
- lib = lib.trim();
338
-
339
- const code = `
340
- /* Define ${funcName} to an innocuous variant, in case <limits.h> declares
341
- ${funcName}.
342
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
343
- #define ${funcName} innocuous_${funcName}
344
- /* System header to define __stub macros and hopefully few prototypes,
345
- which can conflict with char ${funcName} (); below. */
346
- #include <limits.h>
347
- #undef ${funcName}
348
- /* Override any GCC internal prototype to avoid an error.
349
- Use char because int might match the return type of a GCC
350
- builtin and then its argument prototype would still apply. */
351
- #ifdef __cplusplus
352
- extern "C"
353
- #endif
354
- char ${funcName} ();
355
- /* The GNU C library defines this for functions which it implements
356
- to always fail with ENOSYS. Some functions are actually named
357
- something starting with __ and the normal name is an alias. */
358
- #if defined __stub_${funcName} || defined __stub___${funcName}
359
- choke me
360
- #endif
361
-
362
- int
363
- main ()
364
- {
365
- return ${funcName} ();
366
- ;
367
- return 0;
368
- }`;
369
-
370
- const compilerParams = (lib ? [`-l${lib}`] : []);
371
- const result = this.tryCompile(type, code, compilerParams);
372
-
373
- this._debug(
374
- `>>> Checking if function '${funcName}' exists `
375
- + `(using ${lib ? `'${lib}'` : 'no'} library)... ${result === true}`
376
- );
377
- if (result !== true) {
378
- this._debug('... check failed with compiler output:');
379
- this._debug(result.output);
380
- }
381
-
382
- if (result === true) {
383
- setCachedValue(
384
- type,
385
- this._cache,
386
- 'functions',
387
- funcName,
388
- compilerParams
389
- );
390
- return true;
391
- }
392
- }
393
-
394
- return false;
395
- }
396
-
397
- checkHeader(type, header) {
398
- validateType(type);
399
- const cached = getCachedValue(
400
- type,
401
- this._cache,
402
- 'headers',
403
- normalizeHeader(header)
404
- );
405
- if (cached !== undefined) {
406
- this._debug(
407
- `>>> Checking if header '${header}' exists... ${cached} (cached)`
408
- );
409
- return cached;
410
- }
411
-
412
- const headersList = renderHeaders([header]);
413
-
414
- const code = `
415
- ${headersList}
416
-
417
- int
418
- main ()
419
- {
420
- return 0;
421
- }`;
422
-
423
- const result = this.tryCompile(type, code);
424
- setCachedValue(
425
- type,
426
- this._cache,
427
- 'headers',
428
- normalizeHeader(header),
429
- (result === true)
430
- );
431
- this._debug(
432
- `>>> Checking if header '${header}' exists... ${result === true}`
433
- );
434
- if (result !== true) {
435
- this._debug('... check failed with compiler output:');
436
- this._debug(result.output);
437
- }
438
- return (result === true);
439
- }
440
-
441
- defines(type, rendered) {
442
- if (this._cache === null)
443
- return [];
444
-
445
- const defines = new Map();
446
-
447
- let types;
448
- if (!['c', 'c++'].includes(type))
449
- types = ['c', 'c++'];
450
- else
451
- types = [type];
452
-
453
- for (const t of types) {
454
- const typeCache = this._cache.get(t);
455
- if (!typeCache)
456
- continue;
457
-
458
- for (const [subtype, entries] of typeCache) {
459
- for (let name of entries.keys()) {
460
- if (subtype === 'headers')
461
- name = name.replace(RE_HEADER_DECORATED, '$1$2');
462
- defines.set(makeDefine(name, rendered), 1);
463
- }
464
- }
465
- }
466
-
467
- {
468
- const featuresCache = this._cache.get('features');
469
- if (featuresCache) {
470
- for (const result of featuresCache.values()) {
471
- if (typeof result === 'object'
472
- && result !== null
473
- && Array.isArray(result.defines)) {
474
- for (const define of result.defines)
475
- defines.set(makeDefine(define, rendered), 1);
476
- }
477
- }
478
- }
479
- }
480
-
481
- return Array.from(defines.keys());
482
- }
483
-
484
- libs(type) {
485
- if (this._cache === null)
486
- return [];
487
-
488
- const libs = new Map();
489
-
490
- let types;
491
- if (!['c', 'c++'].includes(type))
492
- types = ['c', 'c++'];
493
- else
494
- types = [type];
495
-
496
- for (const t of types) {
497
- const typeCache = this._cache.get(t);
498
- if (!typeCache)
499
- continue;
500
-
501
- const functionsCache = typeCache.get('functions');
502
- if (!functionsCache)
503
- continue;
504
-
505
- for (const compilerParams of functionsCache.values()) {
506
- for (const param of compilerParams)
507
- libs.set(param, 1);
508
- }
509
- }
510
-
511
- {
512
- const featuresCache = this._cache.get('features');
513
- if (featuresCache) {
514
- for (const result of featuresCache.values()) {
515
- if (typeof result === 'object'
516
- && result !== null
517
- && Array.isArray(result.libs)) {
518
- for (const lib of result.libs)
519
- libs.set(lib, 1);
520
- }
521
- }
522
- }
523
- }
524
-
525
- return Array.from(libs.keys());
526
- }
527
-
528
- tryCompile(type, code, compilerParams) {
529
- validateType(type);
530
- if (typeof code !== 'string')
531
- throw new TypeError('Invalid code argument');
532
-
533
- type = (type === 'c' ? 'c' : 'c++');
534
- const prop = (type === 'c' ? '_cc' : '_cxx');
535
-
536
- if (this[`${prop}Kind`] === undefined)
537
- getKind.call(this, prop);
538
-
539
- if (!Array.isArray(compilerParams))
540
- compilerParams = [];
541
-
542
- let result;
543
- if (this[`${prop}Kind`] === 'msvc') {
544
- const cmpOpts = [`-Fo${this._tmpObjFile}`];
545
- for (const includePath of this._includePaths)
546
- cmpOpts.push('-I', includePath);
547
- const lnkOpts = [];
548
- for (const libPath of this._libPaths)
549
- lnkOpts.push(`-LIBPATH:${libPath}`);
550
- for (const opt of compilerParams) {
551
- let m;
552
- if (m = /^[-/]l(.+)$/.exec(opt))
553
- lnkOpts.push(m[1]);
554
- else
555
- cmpOpts.push(opt);
556
- }
557
- try {
558
- writeFileSync(this._tmpInFile, code);
559
- const args = [
560
- ...cmpOpts,
561
- `-T${prop === '_cc' ? 'c' : 'p'}`,
562
- this._tmpInFile,
563
- '-link',
564
- `-out:${this._tmpOutFile}`,
565
- ...lnkOpts,
566
- ];
567
- result = spawnSync(
568
- this[prop],
569
- args,
570
- this[`${prop}SpawnOpts`]
571
- );
572
- unlinkSync(this._tmpInFile);
573
- // Overwrite stderr with stdout because MSVC seems to print
574
- // errors to stdout instead for some reason
575
- result.stderr = result.stdout;
576
- } catch (ex) {
577
- // We had trouble writing or deleting a temp file, fake
578
- // the result
579
- result = { status: Infinity, stderr: ex.stack };
580
- }
581
- try { unlinkSync(this._tmpObjFile); } catch {}
582
- try { unlinkSync(this._tmpOutFile); } catch {}
583
- } else {
584
- result = spawnSync(
585
- this[prop],
586
- [
587
- '-x', type,
588
- '-o', '/dev/null',
589
- '-',
590
- ...compilerParams,
591
- ],
592
- {
593
- ...this[`${prop}SpawnOpts`],
594
- input: code,
595
- }
596
- );
597
- }
598
-
599
- if (result.status === 0)
600
- return true;
601
-
602
- const err = new Error('Compilation failed');
603
- err.output = result.stderr;
604
- return err;
605
- }
606
- }
607
-
608
- function validateType(type) {
609
- if (!['c', 'c++'].includes(type))
610
- throw new Error('Invalid type argument');
611
- }
612
-
613
- function getCachedValue(type, cache, subtype, key) {
614
- if (cache === null)
615
- return;
616
-
617
- const typeCache = cache.get(type);
618
- if (!typeCache)
619
- return;
620
-
621
- const subtypeCache = (typeof subtype !== 'string'
622
- ? typeCache
623
- : typeCache.get(subtype));
624
- if (!subtypeCache)
625
- return;
626
-
627
- return subtypeCache.get(key);
628
- }
629
-
630
- function setCachedValue(type, cache, subtype, key, value) {
631
- if (cache === null)
632
- return;
633
-
634
- let typeCache = cache.get(type);
635
- if (!typeCache)
636
- cache.set(type, typeCache = new Map());
637
-
638
- let subtypeCache = (typeof subtype !== 'string'
639
- ? typeCache
640
- : typeCache.get(subtype));
641
- if (!subtypeCache)
642
- typeCache.set(subtype, subtypeCache = new Map());
643
-
644
- subtypeCache.set(key, value);
645
- }
646
-
647
- function renderHeaders(headers) {
648
- let ret = '';
649
-
650
- if (Array.isArray(headers)) {
651
- for (const header of headers) {
652
- if (typeof header !== 'string' || !header)
653
- throw new Error(`Invalid header: ${inspect(header)}`);
654
- ret += `#include ${normalizeHeader(header)}\n`;
655
- }
656
- }
657
-
658
- return ret;
659
- }
660
-
661
- function normalizeHeader(header) {
662
- if (!RE_HEADER_DECORATED.test(header))
663
- header = `<${header}>`;
664
- return header;
665
- }
666
-
667
- const DEFAULT_HEADERS_POSIX = [
668
- 'stdio.h',
669
- 'sys/types.h',
670
- 'sys/stat.h',
671
- 'stdlib.h',
672
- 'stddef.h',
673
- 'memory.h',
674
- 'string.h',
675
- 'strings.h',
676
- 'inttypes.h',
677
- 'stdint.h',
678
- 'unistd.h'
679
- ];
680
- const DEFAULT_HEADERS_MSVC = [
681
- 'windows.h',
682
- ];
683
- function getDefaultHeaders(be, type) {
684
- const prop = (type === 'c' ? '_cc' : '_cxx');
685
- if (be[`${prop}Kind`] === undefined)
686
- getKind.call(be, prop);
687
-
688
- let headers;
689
- if (be[`${prop}Kind`] === 'msvc')
690
- headers = DEFAULT_HEADERS_MSVC;
691
- else
692
- headers = DEFAULT_HEADERS_POSIX;
693
-
694
- return headers.filter((hdr) => be.checkHeader(type, hdr));
695
- }
696
-
697
- const features = new Map(Object.entries({
698
- 'strerror_r': (be) => {
699
- const defines = [];
700
- let returnsCharPtr = false;
701
-
702
- const declared = be.checkDeclared('c', 'strerror_r');
703
- if (declared) {
704
- const code = `
705
- ${renderHeaders(getDefaultHeaders(be, 'c'))}
706
-
707
- int
708
- main ()
709
- {
710
-
711
- char buf[100];
712
- char x = *strerror_r (0, buf, sizeof buf);
713
- char *p = strerror_r (0, buf, sizeof buf);
714
- return !p || x;
715
-
716
- ;
717
- return 0;
718
- }`;
719
- returnsCharPtr = (be.tryCompile('c', code) === true);
720
- if (returnsCharPtr)
721
- defines.push('STRERROR_R_CHAR_P');
722
- }
723
-
724
- return {
725
- defines,
726
- val: { declared, returnsCharPtr }
727
- };
728
- },
729
- }));
730
-
731
- function makeDefine(name, rendered) {
732
- name = name.replace(/[*]/g, 'P')
733
- .replace(/[^_A-Za-z0-9]/g, '_')
734
- .toUpperCase();
735
- return (rendered ? `HAVE_${name}=1` : name);
736
- }
737
-
738
- module.exports = BuildEnvironment;