dsh-remote 0.8.50 → 0.8.52
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.
- package/README.en.md +8 -0
- package/README.md +22 -0
- package/lib/client.js +15 -3
- package/lib/index.js +269 -8
- package/lib/instructions.js +288 -0
- package/lib/openssh.js +10 -1
- package/lib/pool.js +29 -1
- package/lib/remote-fs.js +26 -1
- package/lib/sftp-surface.js +46 -3
- package/lib/sshconfig.js +13 -3
- package/node_modules/buildcheck/.eslintrc.js +5 -0
- package/node_modules/buildcheck/.github/workflows/ci.yml +88 -0
- package/node_modules/buildcheck/.github/workflows/lint.yml +27 -0
- package/node_modules/buildcheck/.npmignore +3 -0
- package/node_modules/buildcheck/LICENSE +19 -0
- package/node_modules/buildcheck/README.md +106 -0
- package/node_modules/buildcheck/deps/Find-VisualStudio.cs +250 -0
- package/node_modules/buildcheck/lib/findvs.js +361 -0
- package/node_modules/buildcheck/lib/index.js +738 -0
- package/node_modules/buildcheck/package.json +36 -0
- package/node_modules/buildcheck/test/test.js +8 -0
- package/node_modules/cpu-features/.eslintrc.js +5 -0
- package/node_modules/cpu-features/.github/workflows/ci.yml +74 -0
- package/node_modules/cpu-features/.github/workflows/lint.yml +27 -0
- package/node_modules/cpu-features/LICENSE +19 -0
- package/node_modules/cpu-features/README.md +59 -0
- package/node_modules/cpu-features/binding.gyp +16 -0
- package/node_modules/cpu-features/buildcheck.js +32 -0
- package/node_modules/cpu-features/deps/cpu_features/.clang-format +4 -0
- package/node_modules/cpu-features/deps/cpu_features/.dockerignore +31 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/Dockerfile +5 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/aarch64_linux_cmake.yml +30 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_freebsd_cmake.yml +22 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_bazel.yml +26 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml +31 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml +43 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml +25 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml +31 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml +24 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml +30 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml +29 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml +28 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml +27 -0
- package/node_modules/cpu-features/deps/cpu_features/.grenrc.yml +21 -0
- package/node_modules/cpu-features/deps/cpu_features/BUILD.bazel +329 -0
- package/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt +261 -0
- package/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md +23 -0
- package/node_modules/cpu-features/deps/cpu_features/LICENSE +230 -0
- package/node_modules/cpu-features/deps/cpu_features/README.md +272 -0
- package/node_modules/cpu-features/deps/cpu_features/WORKSPACE +19 -0
- package/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md +5 -0
- package/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl +11 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in +3 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in +3 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/README.md +30 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile +252 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md +40 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot +64 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg +312 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh +7 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile +48 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile +34 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt +22 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp +11 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile +107 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in +15 -0
- package/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp +105 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h +54 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h +384 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h +259 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h +121 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h +74 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h +149 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h +72 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h +108 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h +288 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h +40 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h +37 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h +39 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h +240 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h +49 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h +110 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h +70 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt +60 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md +4 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c +205 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h +320 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c +12 -0
- package/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch +456 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d +165 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh +75 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh +490 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh +79 -0
- package/node_modules/cpu-features/deps/cpu_features/src/copy.inl +19 -0
- package/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl +86 -0
- package/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl +26 -0
- package/node_modules/cpu-features/deps/cpu_features/src/equals.inl +22 -0
- package/node_modules/cpu-features/deps/cpu_features/src/filesystem.c +62 -0
- package/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c +169 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl +88 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c +79 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c +82 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c +138 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c +212 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c +93 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c +163 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c +111 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c +120 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl +2055 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c +68 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c +58 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c +57 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c +58 -0
- package/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c +132 -0
- package/node_modules/cpu-features/deps/cpu_features/src/string_view.c +192 -0
- package/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c +461 -0
- package/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt +114 -0
- package/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc +53 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc +396 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc +384 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc +176 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc +131 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc +180 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc +82 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc +1729 -0
- package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc +103 -0
- package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h +61 -0
- package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc +52 -0
- package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h +31 -0
- package/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc +132 -0
- package/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc +202 -0
- package/node_modules/cpu-features/lib/index.js +5 -0
- package/node_modules/cpu-features/package.json +40 -0
- package/node_modules/cpu-features/src/binding.cc +151 -0
- package/node_modules/cpu-features/test/test.js +12 -0
- 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;
|