Skip to content

Commit 684e738

Browse files
committed
fix(bindgen): find and run wasm binaries for interface json on Windows
Path issues.
1 parent b99f75d commit 684e738

File tree

6 files changed

+79
-37
lines changed

6 files changed

+79
-37
lines changed
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
import { readFile } from 'node:fs/promises';
2-
import { WASI } from 'wasi';
3-
import { argv, env } from 'node:process';
1+
import { readFile } from 'node:fs/promises'
2+
import { WASI } from 'wasi'
3+
import { argv, env } from 'node:process'
44

55
const wasi = new WASI({
66
version: 'preview1',
77
args: ['--interface-json'],
88
env,
9-
preopens: {
10-
},
11-
});
9+
preopens: {}
10+
})
1211

13-
const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
12+
const importObject = { wasi_snapshot_preview1: wasi.wasiImport }
1413

1514
const wasm = await WebAssembly.compile(
16-
await readFile(new URL(process.argv[2], import.meta.url)),
17-
);
18-
const instance = await WebAssembly.instantiate(wasm, importObject);
15+
// await readFile(new URL(process.argv[2], import.meta.url))
16+
await readFile(process.argv[2])
17+
)
18+
const instance = await WebAssembly.instantiate(wasm, importObject)
1919

20-
wasi.initialize(instance);
21-
instance.exports['']()
20+
wasi.initialize(instance)
21+
instance.exports['']()

packages/core/typescript/itk-wasm/src/bindgen/interface-json-node.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import path from 'path'
33
import { runPipelineNode } from '../../dist/index-node.js'
44

55
const pipelinePath = path.resolve(process.argv[2])
6-
console.log(pipelinePath)
7-
const { returnValue, stdout, stderr } = await runPipelineNode(pipelinePath, ['--interface-json'])
6+
const { returnValue, stdout, stderr } = await runPipelineNode(pipelinePath, [
7+
'--interface-json'
8+
])
89
process.exit(returnValue)
9-

packages/core/typescript/itk-wasm/src/bindgen/typescript/typescript-bindgen.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import path from 'path'
44
import typescriptBindings from './typescript-bindings.js'
55
import validEmscriptenWasmBinaries from '../valid-emscripten-wasm-binaries.js'
66

7-
function bindgen (outputDir, buildDir, filteredWasmBinaries, options) {
7+
function bindgen(outputDir, buildDir, filteredWasmBinaries, options) {
88
let readme = ''
99
const packageName = options.packageName
1010
readme += `# ${packageName}\n`
@@ -17,12 +17,21 @@ npm install ${packageName}
1717
`
1818

1919
let readmeUsage = '\n## Usage\n'
20-
let readmeBrowserInterface = '\n### Browser interface\n\nImport:\n\n```js\nimport {\n'
21-
let readmeNodeInterface = '\n### Node interface\n\nImport:\n\n```js\nimport {\n'
20+
let readmeBrowserInterface =
21+
'\n### Browser interface\n\nImport:\n\n```js\nimport {\n'
22+
let readmeNodeInterface =
23+
'\n### Node interface\n\nImport:\n\n```js\nimport {\n'
2224

23-
const emscriptenWasmBinaries = validEmscriptenWasmBinaries(filteredWasmBinaries)
25+
const emscriptenWasmBinaries =
26+
validEmscriptenWasmBinaries(filteredWasmBinaries)
2427

25-
readmeBrowserInterface += typescriptBindings(outputDir, buildDir, emscriptenWasmBinaries, options, false)
28+
readmeBrowserInterface += typescriptBindings(
29+
outputDir,
30+
buildDir,
31+
emscriptenWasmBinaries,
32+
options,
33+
false
34+
)
2635
readmeBrowserInterface += `
2736
#### setPipelinesBaseUrl
2837
@@ -43,7 +52,13 @@ function getPipelinesBaseUrl() : string | URL
4352
\`\`\`
4453
4554
`
46-
readmeNodeInterface += typescriptBindings(outputDir, buildDir, emscriptenWasmBinaries, options, true)
55+
readmeNodeInterface += typescriptBindings(
56+
outputDir,
57+
buildDir,
58+
emscriptenWasmBinaries,
59+
options,
60+
true
61+
)
4762
readme += readmeUsage
4863
readme += readmeBrowserInterface
4964
readme += readmeNodeInterface

packages/core/typescript/itk-wasm/src/bindgen/typescript/typescript-bindings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function typescriptBindings(
3838
) {
3939
// index module
4040
let indexContent = ''
41-
let indexCommonContent = ''
41+
let indexCommonContent = "export { default as version } from './version.js'\n"
4242
const nodeTextKebab = forNode ? '-node' : ''
4343
const nodeTextCamel = forNode ? 'Node' : ''
4444

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import path from 'path'
22
import fs from 'fs-extra'
33
import { spawnSync } from 'child_process'
4+
import { fileURLToPath } from 'url'
5+
6+
const currentScriptPath = path.dirname(fileURLToPath(import.meta.url))
47

58
function wasmBinaryInterfaceJson(outputDir, buildDir, wasmBinaryName) {
69
let wasmBinaryRelativePath = `${buildDir}/${wasmBinaryName}`
@@ -11,38 +14,55 @@ function wasmBinaryInterfaceJson(outputDir, buildDir, wasmBinaryName) {
1114
let interfaceJson = ''
1215
const parsedPath = path.parse(path.resolve(wasmBinaryRelativePath))
1316
if (parsedPath.name.endsWith('wasi')) {
14-
const runPath = path.join(parsedPath.dir, parsedPath.base)
15-
const runPipelineScriptPath = path.join(path.dirname(import.meta.url.substring(7)), 'interface-json-node-wasi.js')
16-
const runPipelineRun = spawnSync('node', ['--experimental-wasi-unstable-preview1', '--no-warnings', runPipelineScriptPath, runPath], {
17-
env: process.env,
18-
stdio: ['pipe', 'pipe', 'pipe']
19-
})
17+
const runPipelineScriptPath = path.join(
18+
currentScriptPath,
19+
'interface-json-node-wasi.js'
20+
)
21+
const runPipelineRun = spawnSync(
22+
'node',
23+
[
24+
'--experimental-wasi-unstable-preview1',
25+
'--no-warnings',
26+
runPipelineScriptPath,
27+
wasmBinaryRelativePath
28+
],
29+
{
30+
env: process.env,
31+
stdio: ['pipe', 'pipe', 'pipe']
32+
}
33+
)
2034
try {
2135
interfaceJson = JSON.parse(runPipelineRun.stdout.toString())
2236
} catch (error) {
2337
if (runPipelineRun.status !== 0) {
24-
console.error(runPipelineRun.stderr.toString());
25-
console.error(runPipelineRun.error);
38+
console.error(runPipelineRun.stderr.toString())
39+
console.error(runPipelineRun.error)
2640
process.exit(runPipelineRun.status)
2741
}
2842
}
2943
} else {
3044
const runPath = path.join(parsedPath.dir, parsedPath.name)
31-
const runPipelineScriptPath = path.join(path.dirname(import.meta.url.substring(7)), 'interface-json-node.js')
45+
const runPipelineScriptPath = path.join(
46+
currentScriptPath,
47+
'interface-json-node.js'
48+
)
3249
const runPipelineRun = spawnSync('node', [runPipelineScriptPath, runPath], {
3350
env: process.env,
3451
stdio: ['ignore', 'pipe', 'inherit']
3552
})
3653
if (runPipelineRun.status !== 0) {
37-
console.error(runPipelineRun.error);
54+
console.error(runPipelineRun.error)
3855
process.exit(runPipelineRun.status)
3956
}
4057
let interfaceString = new TextDecoder().decode(runPipelineRun.stdout)
41-
interfaceString = interfaceString.substring(interfaceString.indexOf('{'), interfaceString.lastIndexOf('}') + 1)
58+
interfaceString = interfaceString.substring(
59+
interfaceString.indexOf('{'),
60+
interfaceString.lastIndexOf('}') + 1
61+
)
4262
interfaceJson = JSON.parse(interfaceString)
4363
}
4464

4565
return { interfaceJson, parsedPath }
4666
}
4767

48-
export default wasmBinaryInterfaceJson
68+
export default wasmBinaryInterfaceJson

packages/core/typescript/itk-wasm/src/cli/bindgen.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ function bindgen(options) {
1919
const iface = options.interface ?? 'typescript'
2020
const outputDir = options.outputDir ?? iface
2121

22-
const wasmBinaries = glob.sync(path.join(buildDir, '**/*.wasm'))
22+
const buildDirPosix = buildDir.replaceAll('\\', '/')
23+
const wasmBinaries = glob.sync(`${buildDirPosix}/**/*.wasm`, {
24+
// CMake FetchContent
25+
// Symlinks can cause problems with glob on Windows.
26+
ignore: `${buildDirPosix}/_deps/**`
27+
})
2328

2429
try {
2530
fs.mkdirSync(outputDir, { recursive: true })
@@ -28,7 +33,9 @@ function bindgen(options) {
2833
}
2934

3035
// Filter libraries.
31-
let filteredWasmBinaries = wasmBinaries.filter((binary) => !path.basename(binary).startsWith('lib'))
36+
let filteredWasmBinaries = wasmBinaries.filter(
37+
(binary) => !path.basename(binary).startsWith('lib')
38+
)
3239

3340
switch (iface) {
3441
case 'typescript':
@@ -48,4 +55,4 @@ function bindgen(options) {
4855
process.exit(0)
4956
}
5057

51-
export default bindgen
58+
export default bindgen

0 commit comments

Comments
 (0)