This should allow users to use the vscode extension on ubuntu 20.04. After https://github.com/bytecodealliance/wasm-micro-runtime/pull/2132 , our lldb binary for 20.04 works on ubuntu 22.04 as well. On the other hand, lldb for 22.04 has no chance to work on ubuntu 20.04. (because of glibc version requirement.)
120 lines
3.4 KiB
TypeScript
120 lines
3.4 KiB
TypeScript
/*
|
|
* Copyright (C) 2022 Amazon.com Inc. or its affiliates. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*/
|
|
|
|
import * as vscode from 'vscode';
|
|
import * as os from 'os';
|
|
import * as path from 'path';
|
|
import * as fs from 'fs';
|
|
import {
|
|
checkIfFileExists,
|
|
downloadFile,
|
|
unzipFile,
|
|
} from './directoryUtilities';
|
|
import { SelectionOfPrompt } from '../constants';
|
|
|
|
const LLDB_RESOURCE_DIR = 'resource/debug';
|
|
const LLDB_OS_DOWNLOAD_URL_SUFFIX_MAP: Partial<
|
|
Record<NodeJS.Platform, string>
|
|
> = {
|
|
linux: 'x86_64-ubuntu-20.04',
|
|
darwin: 'universal-macos-latest',
|
|
};
|
|
|
|
const WAMR_LLDB_NOT_SUPPORTED_ERROR = new Error(
|
|
'WAMR LLDB is not supported on this platform'
|
|
);
|
|
|
|
function getLLDBUnzipFilePath(destinationFolder: string, filename: string) {
|
|
const dirs = filename.split('/');
|
|
if (dirs[0] === 'wamr-lldb') {
|
|
dirs.shift();
|
|
}
|
|
|
|
return path.join(destinationFolder, ...dirs);
|
|
}
|
|
|
|
export function getWAMRExtensionVersion(
|
|
context: vscode.ExtensionContext
|
|
): string {
|
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
return require(path.join(context.extensionPath, 'package.json')).version;
|
|
}
|
|
|
|
function getLLDBDownloadUrl(context: vscode.ExtensionContext): string {
|
|
const wamrVersion = getWAMRExtensionVersion(context);
|
|
const lldbOsUrlSuffix = LLDB_OS_DOWNLOAD_URL_SUFFIX_MAP[os.platform()];
|
|
|
|
if (!lldbOsUrlSuffix) {
|
|
throw WAMR_LLDB_NOT_SUPPORTED_ERROR;
|
|
}
|
|
|
|
return `https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/WAMR-${wamrVersion}/wamr-lldb-${wamrVersion}-${lldbOsUrlSuffix}.zip`;
|
|
}
|
|
|
|
export function isLLDBInstalled(context: vscode.ExtensionContext): boolean {
|
|
const extensionPath = context.extensionPath;
|
|
const lldbOSDir = os.platform();
|
|
const lldbBinaryPath = path.join(
|
|
extensionPath,
|
|
LLDB_RESOURCE_DIR,
|
|
lldbOSDir,
|
|
'bin',
|
|
'lldb'
|
|
);
|
|
return checkIfFileExists(lldbBinaryPath);
|
|
}
|
|
|
|
export async function promptInstallLLDB(
|
|
context: vscode.ExtensionContext
|
|
): Promise<SelectionOfPrompt> {
|
|
const extensionPath = context.extensionPath;
|
|
|
|
const response = await vscode.window.showWarningMessage(
|
|
'No LLDB instance found. Setup now?',
|
|
SelectionOfPrompt.setUp,
|
|
SelectionOfPrompt.skip
|
|
);
|
|
|
|
if (response === SelectionOfPrompt.skip) {
|
|
return response;
|
|
}
|
|
|
|
const downloadUrl = getLLDBDownloadUrl(context);
|
|
const destinationDir = os.platform();
|
|
|
|
if (!downloadUrl) {
|
|
throw WAMR_LLDB_NOT_SUPPORTED_ERROR;
|
|
}
|
|
|
|
const lldbDestinationFolder = path.join(
|
|
extensionPath,
|
|
LLDB_RESOURCE_DIR,
|
|
destinationDir
|
|
);
|
|
const lldbZipPath = path.join(lldbDestinationFolder, 'bundle.zip');
|
|
|
|
vscode.window.showInformationMessage(`Downloading LLDB...`);
|
|
|
|
await downloadFile(downloadUrl, lldbZipPath);
|
|
|
|
vscode.window.showInformationMessage(
|
|
`LLDB downloaded to ${lldbZipPath}. Installing...`
|
|
);
|
|
|
|
const lldbFiles = await unzipFile(lldbZipPath, filename =>
|
|
getLLDBUnzipFilePath(lldbDestinationFolder, filename)
|
|
);
|
|
// Allow execution of lldb
|
|
lldbFiles.forEach(file => fs.chmodSync(file, '0775'));
|
|
|
|
vscode.window.showInformationMessage(
|
|
`LLDB installed at ${lldbDestinationFolder}`
|
|
);
|
|
|
|
// Remove the bundle.zip
|
|
fs.unlinkSync(lldbZipPath);
|
|
return SelectionOfPrompt.setUp;
|
|
}
|