dsh-remote 0.8.48 → 0.8.50

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 (132) hide show
  1. package/README.md +1 -0
  2. package/lib/client.js +100 -19
  3. package/lib/index.js +134 -26
  4. package/lib/remote-shell-child.cjs +305 -0
  5. package/lib/remote-shell.js +518 -0
  6. package/lib/sshconfig.js +256 -15
  7. package/package.json +1 -2
  8. package/node_modules/buildcheck/.eslintrc.js +0 -5
  9. package/node_modules/buildcheck/.github/workflows/ci.yml +0 -88
  10. package/node_modules/buildcheck/.github/workflows/lint.yml +0 -27
  11. package/node_modules/buildcheck/.npmignore +0 -3
  12. package/node_modules/buildcheck/LICENSE +0 -19
  13. package/node_modules/buildcheck/README.md +0 -106
  14. package/node_modules/buildcheck/deps/Find-VisualStudio.cs +0 -250
  15. package/node_modules/buildcheck/lib/findvs.js +0 -361
  16. package/node_modules/buildcheck/lib/index.js +0 -738
  17. package/node_modules/buildcheck/package.json +0 -36
  18. package/node_modules/buildcheck/test/test.js +0 -8
  19. package/node_modules/cpu-features/.eslintrc.js +0 -5
  20. package/node_modules/cpu-features/.github/workflows/ci.yml +0 -74
  21. package/node_modules/cpu-features/.github/workflows/lint.yml +0 -27
  22. package/node_modules/cpu-features/LICENSE +0 -19
  23. package/node_modules/cpu-features/README.md +0 -59
  24. package/node_modules/cpu-features/binding.gyp +0 -16
  25. package/node_modules/cpu-features/buildcheck.js +0 -32
  26. package/node_modules/cpu-features/deps/cpu_features/.clang-format +0 -4
  27. package/node_modules/cpu-features/deps/cpu_features/.dockerignore +0 -31
  28. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/Dockerfile +0 -5
  29. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/aarch64_linux_cmake.yml +0 -30
  30. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_freebsd_cmake.yml +0 -22
  31. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_bazel.yml +0 -26
  32. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml +0 -31
  33. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml +0 -43
  34. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml +0 -25
  35. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml +0 -31
  36. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml +0 -24
  37. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml +0 -30
  38. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml +0 -29
  39. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml +0 -28
  40. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml +0 -27
  41. package/node_modules/cpu-features/deps/cpu_features/.grenrc.yml +0 -21
  42. package/node_modules/cpu-features/deps/cpu_features/BUILD.bazel +0 -329
  43. package/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt +0 -261
  44. package/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md +0 -23
  45. package/node_modules/cpu-features/deps/cpu_features/LICENSE +0 -230
  46. package/node_modules/cpu-features/deps/cpu_features/README.md +0 -272
  47. package/node_modules/cpu-features/deps/cpu_features/WORKSPACE +0 -19
  48. package/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md +0 -5
  49. package/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl +0 -11
  50. package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in +0 -3
  51. package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in +0 -3
  52. package/node_modules/cpu-features/deps/cpu_features/cmake/README.md +0 -30
  53. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile +0 -252
  54. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md +0 -40
  55. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot +0 -64
  56. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg +0 -312
  57. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh +0 -7
  58. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile +0 -48
  59. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile +0 -34
  60. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt +0 -22
  61. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp +0 -11
  62. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile +0 -107
  63. package/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in +0 -15
  64. package/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp +0 -105
  65. package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h +0 -54
  66. package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h +0 -384
  67. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h +0 -259
  68. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h +0 -121
  69. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h +0 -74
  70. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h +0 -149
  71. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h +0 -72
  72. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h +0 -108
  73. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h +0 -288
  74. package/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h +0 -40
  75. package/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h +0 -37
  76. package/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h +0 -39
  77. package/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h +0 -240
  78. package/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h +0 -49
  79. package/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h +0 -110
  80. package/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h +0 -70
  81. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt +0 -60
  82. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md +0 -4
  83. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c +0 -205
  84. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h +0 -320
  85. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c +0 -12
  86. package/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch +0 -456
  87. package/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d +0 -165
  88. package/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh +0 -75
  89. package/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh +0 -490
  90. package/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh +0 -79
  91. package/node_modules/cpu-features/deps/cpu_features/src/copy.inl +0 -19
  92. package/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl +0 -86
  93. package/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl +0 -26
  94. package/node_modules/cpu-features/deps/cpu_features/src/equals.inl +0 -22
  95. package/node_modules/cpu-features/deps/cpu_features/src/filesystem.c +0 -62
  96. package/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c +0 -169
  97. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl +0 -88
  98. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c +0 -79
  99. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c +0 -82
  100. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c +0 -138
  101. package/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c +0 -212
  102. package/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c +0 -93
  103. package/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c +0 -163
  104. package/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c +0 -111
  105. package/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c +0 -120
  106. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl +0 -2055
  107. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c +0 -68
  108. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c +0 -58
  109. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c +0 -57
  110. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c +0 -58
  111. package/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c +0 -132
  112. package/node_modules/cpu-features/deps/cpu_features/src/string_view.c +0 -192
  113. package/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c +0 -461
  114. package/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt +0 -114
  115. package/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc +0 -53
  116. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc +0 -396
  117. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc +0 -384
  118. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc +0 -176
  119. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc +0 -131
  120. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc +0 -180
  121. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc +0 -82
  122. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc +0 -1729
  123. package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc +0 -103
  124. package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h +0 -61
  125. package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc +0 -52
  126. package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h +0 -31
  127. package/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc +0 -132
  128. package/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc +0 -202
  129. package/node_modules/cpu-features/lib/index.js +0 -5
  130. package/node_modules/cpu-features/package.json +0 -40
  131. package/node_modules/cpu-features/src/binding.cc +0 -151
  132. 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;