]> git.lizzy.rs Git - rust.git/commitdiff
Try to detect musl distros in the Code extension
authorLaurențiu Nicola <lnicola@dend.ro>
Sat, 20 Feb 2021 16:39:26 +0000 (18:39 +0200)
committerLaurențiu Nicola <lnicola@dend.ro>
Sat, 20 Feb 2021 16:44:28 +0000 (18:44 +0200)
editors/code/src/main.ts

index 620810d72294af59ad520cc17c8b83ee1de943e5..00393d6e8f2302efdbda452763dcec5d5385806f 100644 (file)
@@ -12,7 +12,7 @@ import { PersistentState } from './persistent_state';
 import { fetchRelease, download } from './net';
 import { activateTaskProvider } from './tasks';
 import { setContextValue } from './util';
-import { exec } from 'child_process';
+import { exec, spawnSync } from 'child_process';
 
 let ctx: Ctx | undefined;
 
@@ -297,7 +297,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
         "arm64 linux": "aarch64-unknown-linux-gnu",
         "arm64 darwin": "aarch64-apple-darwin",
     };
-    const platform = platforms[`${process.arch} ${process.platform}`];
+    let platform = platforms[`${process.arch} ${process.platform}`];
     if (platform === undefined) {
         await vscode.window.showErrorMessage(
             "Unfortunately we don't ship binaries for your platform yet. " +
@@ -309,6 +309,9 @@ async function getServer(config: Config, state: PersistentState): Promise<string
         );
         return undefined;
     }
+    if (platform === "x86_64-unknown-linux-gnu" && isMusl()) {
+        platform = "x86_64-unknown-linux-musl";
+    }
     const ext = platform.indexOf("-windows-") !== -1 ? ".exe" : "";
     const dest = path.join(config.globalStoragePath, `rust-analyzer-${platform}${ext}`);
     const exists = await fs.stat(dest).then(() => true, () => false);
@@ -365,6 +368,13 @@ async function isNixOs(): Promise<boolean> {
     }
 }
 
+function isMusl(): boolean {
+    // We can detect Alpine by checking `/etc/os-release` but not Void Linux musl.
+    // Instead, we run `ldd` since it advertises the libc which it belongs to.
+    const res = spawnSync("ldd", ["--version"]);
+    return res.stderr != null && res.stderr.indexOf("musl libc") >= 0;
+}
+
 async function downloadWithRetryDialog<T>(state: PersistentState, downloadFunc: () => Promise<T>): Promise<T> {
     while (true) {
         try {