From 2cef03d40e7d130b5ec5aeb5a2cab80bf213d3d4 Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Sun, 15 Dec 2019 13:03:52 -0800 Subject: [PATCH] Add ability to bundle extools DLL with langserver --- src/langserver/build.rs | 7 +++++++ src/langserver/debugger/extools_bundle.rs | 24 +++++++++++++++++++++++ src/langserver/debugger/launched.rs | 3 +++ src/langserver/debugger/mod.rs | 1 + 4 files changed, 35 insertions(+) create mode 100644 src/langserver/debugger/extools_bundle.rs diff --git a/src/langserver/build.rs b/src/langserver/build.rs index 61027299..2e673d14 100644 --- a/src/langserver/build.rs +++ b/src/langserver/build.rs @@ -7,6 +7,7 @@ use std::env; use std::path::PathBuf; fn main() { + // build info let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); let mut f = File::create(&out_dir.join("build-info.txt")).unwrap(); @@ -14,6 +15,12 @@ fn main() { writeln!(f, "commit: {}", commit).unwrap(); } writeln!(f, "build date: {}", chrono::Utc::today()).unwrap(); + + // extools bundling + println!("cargo:rerun-if-env-changed=EXTOOLS_BUNDLE_DLL"); + if env::var_os("EXTOOLS_BUNDLE_DLL").is_some() { + println!("cargo:rustc-cfg=extools_bundle"); + } } fn read_commit() -> Result { diff --git a/src/langserver/debugger/extools_bundle.rs b/src/langserver/debugger/extools_bundle.rs new file mode 100644 index 00000000..02396526 --- /dev/null +++ b/src/langserver/debugger/extools_bundle.rs @@ -0,0 +1,24 @@ +#![cfg(extools_bundle)] +use std::io::{Result, Write}; +use std::path::{Path, PathBuf}; +use std::fs::File; + +const BYTES: &[u8] = include_bytes!(env!("EXTOOLS_BUNDLE_DLL")); + +fn write(path: &Path) -> Result<()> { + File::create(path)?.write_all(BYTES) +} + +pub fn extract() -> Result { + let exe = std::env::current_exe()?; + let directory = exe.parent().unwrap(); + for i in 0..9 { + let dll = directory.join(format!("extools{}.dll", i)); + if let Ok(()) = write(&dll) { + return Ok(dll); + } + } + let dll = directory.join("extools9.dll"); + write(&dll)?; + Ok(dll) +} diff --git a/src/langserver/debugger/launched.rs b/src/langserver/debugger/launched.rs index 589cbe48..160c0e98 100644 --- a/src/langserver/debugger/launched.rs +++ b/src/langserver/debugger/launched.rs @@ -36,6 +36,9 @@ impl Launched { .stdin(Stdio::null()) .stdout(Stdio::null()) .stderr(Stdio::null()); + #[cfg(extools_bundle)] { + command.env("EXTOOLS_DLL", super::extools_bundle::extract()?); + } if let Some(port) = port { command.env("EXTOOLS_MODE", "LAUNCHED"); command.env("EXTOOLS_PORT", port.to_string()); diff --git a/src/langserver/debugger/mod.rs b/src/langserver/debugger/mod.rs index a37565bc..fb5b6a71 100644 --- a/src/langserver/debugger/mod.rs +++ b/src/langserver/debugger/mod.rs @@ -32,6 +32,7 @@ mod launched; mod extools_types; mod extools; mod local_names; +mod extools_bundle; use std::error::Error; use std::sync::{atomic, Arc, Mutex};