mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-14 20:48:00 +00:00
### Description Release OrtEnv before main function returns. Before this change, OrtEnv is deleted when C/C++ runtime destructs all global variables in ONNX Runtime's core framework. The callstack is like this: ``` * frame #0: 0x00007fffee39f5a6 libonnxruntime.so.1.16.0`onnxruntime::Environment::~Environment(this=0x00007fffee39fbf2) at environment.h:20:7 frame #1: 0x00007fffee39f614 libonnxruntime.so.1.16.0`std::default_delete<onnxruntime::Environment>::operator()(this=0x00007ffff4c30e50, __ptr=0x0000000005404b00) const at unique_ptr.h:85:2 frame #2: 0x00007fffee39edca libonnxruntime.so.1.16.0`std::unique_ptr<onnxruntime::Environment, std::default_delete<onnxruntime::Environment>>::~unique_ptr(this=0x5404b00) at unique_ptr.h:361:17 frame #3: 0x00007fffee39e2ab libonnxruntime.so.1.16.0`OrtEnv::~OrtEnv(this=0x00007ffff4c30e50) at ort_env.cc:43:1 frame #4: 0x00007fffee39fa96 libonnxruntime.so.1.16.0`std::default_delete<OrtEnv>::operator()(this=0x00007fffefff8f78, __ptr=0x00007ffff4c30e50) const at unique_ptr.h:85:2 frame #5: 0x00007fffee39f394 libonnxruntime.so.1.16.0`std::unique_ptr<OrtEnv, std::default_delete<OrtEnv>>::~unique_ptr(this=0x7ffff4c30e50) at unique_ptr.h:361:17 frame #6: 0x00007ffff78574b5 libc.so.6`__run_exit_handlers + 261 frame #7: 0x00007ffff7857630 libc.so.6`exit + 32 frame #8: 0x00007ffff783feb7 libc.so.6`__libc_start_call_main + 135 frame #9: 0x00007ffff783ff60 libc.so.6`__libc_start_main@@GLIBC_2.34 + 128 frame #10: 0x0000000000abbdee node`_start + 46 ``` After this change, OrtEnv will be deleted before the main function returns and nodejs is still alive.
86 lines
3 KiB
TypeScript
86 lines
3 KiB
TypeScript
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
|
|
import {spawnSync} from 'child_process';
|
|
import * as fs from 'fs-extra';
|
|
import minimist from 'minimist';
|
|
import * as os from 'os';
|
|
import * as path from 'path';
|
|
|
|
// command line flags
|
|
const buildArgs = minimist(process.argv.slice(2));
|
|
|
|
// --config=Debug|Release|RelWithDebInfo
|
|
const CONFIG: 'Debug'|'Release'|'RelWithDebInfo' =
|
|
buildArgs.config || (os.platform() === 'win32' ? 'RelWithDebInfo' : 'Release');
|
|
if (CONFIG !== 'Debug' && CONFIG !== 'Release' && CONFIG !== 'RelWithDebInfo') {
|
|
throw new Error(`unrecognized config: ${CONFIG}`);
|
|
}
|
|
// --arch=x64|ia32|arm64|arm
|
|
const ARCH: 'x64'|'ia32'|'arm64'|'arm' = buildArgs.arch || os.arch();
|
|
if (ARCH !== 'x64' && ARCH !== 'ia32' && ARCH !== 'arm64' && ARCH !== 'arm') {
|
|
throw new Error(`unrecognized architecture: ${ARCH}`);
|
|
}
|
|
// --onnxruntime-build-dir=
|
|
const ONNXRUNTIME_BUILD_DIR = buildArgs['onnxruntime-build-dir'];
|
|
// --rebuild
|
|
const REBUILD = !!buildArgs.rebuild;
|
|
|
|
// build path
|
|
const ROOT_FOLDER = path.join(__dirname, '..');
|
|
const BIN_FOLDER = path.join(ROOT_FOLDER, 'bin');
|
|
const BUILD_FOLDER = path.join(ROOT_FOLDER, 'build');
|
|
|
|
// if rebuild, clean up the dist folders
|
|
if (REBUILD) {
|
|
fs.removeSync(BIN_FOLDER);
|
|
fs.removeSync(BUILD_FOLDER);
|
|
}
|
|
|
|
const args = [
|
|
'cmake-js',
|
|
(REBUILD ? 'reconfigure' : 'configure'),
|
|
`--arch=${ARCH}`,
|
|
'--CDnapi_build_version=6',
|
|
`--CDCMAKE_BUILD_TYPE=${CONFIG}`,
|
|
];
|
|
if (ONNXRUNTIME_BUILD_DIR && typeof ONNXRUNTIME_BUILD_DIR === 'string') {
|
|
args.push(`--CDONNXRUNTIME_BUILD_DIR=${ONNXRUNTIME_BUILD_DIR}`);
|
|
}
|
|
|
|
// set CMAKE_OSX_ARCHITECTURES for macOS build
|
|
if (os.platform() === 'darwin') {
|
|
if (ARCH === 'x64') {
|
|
args.push('--CDCMAKE_OSX_ARCHITECTURES=x86_64');
|
|
} else if (ARCH === 'arm64') {
|
|
args.push('--CDCMAKE_OSX_ARCHITECTURES=arm64');
|
|
} else {
|
|
throw new Error(`architecture not supported for macOS build: ${ARCH}`);
|
|
}
|
|
}
|
|
|
|
// In Windows, "npx cmake-js configure" uses a powershell script to detect the Visual Studio installation.
|
|
// The script uses the environment variable LIB. If an invalid path is specified in LIB, the script will fail.
|
|
// So we override the LIB environment variable to remove invalid paths.
|
|
const envOverride = os.platform() === 'win32' && process.env.LIB ?
|
|
{...process.env, LIB: process.env.LIB.split(';').filter(fs.existsSync).join(';')} :
|
|
process.env;
|
|
|
|
// launch cmake-js configure
|
|
const procCmakejs = spawnSync('npx', args, {shell: true, stdio: 'inherit', cwd: ROOT_FOLDER, env: envOverride});
|
|
if (procCmakejs.status !== 0) {
|
|
if (procCmakejs.error) {
|
|
console.error(procCmakejs.error);
|
|
}
|
|
process.exit(procCmakejs.status === null ? undefined : procCmakejs.status);
|
|
}
|
|
|
|
// launch cmake to build
|
|
const procCmake =
|
|
spawnSync('cmake', ['--build', '.', '--config', CONFIG], {shell: true, stdio: 'inherit', cwd: BUILD_FOLDER});
|
|
if (procCmake.status !== 0) {
|
|
if (procCmake.error) {
|
|
console.error(procCmake.error);
|
|
}
|
|
process.exit(procCmake.status === null ? undefined : procCmake.status);
|
|
}
|