dsh-remote 0.8.49 → 0.8.51

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