diff options
author | Brian Dawn | 2021-06-03 20:46:56 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2021-06-06 01:49:17 +0000 |
commit | 62d181de78077200d7b229ce6f91b2b14129d998 (patch) | |
tree | 890a622aed18f5e61097dde4efababd2af1af7fe | |
parent | 8c2fa12ffc006de787992b4022263be033ac8200 (diff) |
Provide a feature flag to be able to embed the runtime folder.
These changes provide a new feature flag "embed_runtime" that when
enabled and built in release mode will embed the runtime folder into the
resulting binary.
-rw-r--r-- | Cargo.lock | 34 | ||||
-rw-r--r-- | README.md | 7 | ||||
-rw-r--r-- | book/src/install.md | 7 | ||||
-rw-r--r-- | helix-core/Cargo.toml | 5 | ||||
-rw-r--r-- | helix-core/src/lib.rs | 1 | ||||
-rw-r--r-- | helix-core/src/syntax.rs | 40 | ||||
-rw-r--r-- | helix-term/Cargo.toml | 3 |
7 files changed, 86 insertions, 11 deletions
@@ -266,6 +266,7 @@ dependencies = [ "once_cell", "regex", "ropey", + "rust-embed", "serde", "smallvec", "tendril", @@ -693,6 +694,39 @@ dependencies = [ ] [[package]] +name = "rust-embed" +version = "5.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fe1fe6aac5d6bb9e1ffd81002340363272a7648234ec7bdfac5ee202cb65523" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "5.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed91c41c42ef7bf687384439c312e75e0da9c149b0390889b94de3c7d9d9e66" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a512219132473ab0a77b52077059f1c47ce4af7fbdc94503e9862a34422876d" +dependencies = [ + "walkdir", +] + +[[package]] name = "ryu" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -45,6 +45,13 @@ the `HELIX_RUNTIME` environment variable. > NOTE: You should set this to <path to repository>/runtime in development (if > running via cargo). +If you want to bake the `runtime/` directory into the Helix binary you can build +it with: + +``` +cargo install --path helix-term --features "embed_runtime" +``` + ## Arch Linux There are two packages available from AUR: - `helix-bin`: contains prebuilt binary from GitHub releases diff --git a/book/src/install.md b/book/src/install.md index 4e3cfc3f..8cbff1a5 100644 --- a/book/src/install.md +++ b/book/src/install.md @@ -35,3 +35,10 @@ This will install the `hx` binary to `$HOME/.cargo/bin`. Now copy the `runtime/` directory somewhere. Helix will by default look for the runtime inside the same folder as the executable, but that can be overriden via the `HELIX_RUNTIME` environment variable. + +If you want to bake the `runtime/` directory into the Helix binary you can build +it with: + +``` +cargo install --path helix-term --features "embed_runtime" +``` diff --git a/helix-core/Cargo.toml b/helix-core/Cargo.toml index b5f2ef77..35f30ede 100644 --- a/helix-core/Cargo.toml +++ b/helix-core/Cargo.toml @@ -7,6 +7,10 @@ license = "MPL-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[features] +embed_runtime = [] + [dependencies] helix-syntax = { path = "../helix-syntax" } @@ -24,3 +28,4 @@ serde = { version = "1.0", features = ["derive"] } toml = "0.5" etcetera = "0.3" +rust-embed="5.9.0" diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs index 3e00081f..6b93de78 100644 --- a/helix-core/src/lib.rs +++ b/helix-core/src/lib.rs @@ -44,6 +44,7 @@ pub(crate) fn find_first_non_whitespace_char(text: RopeSlice, line_num: usize) - None } +#[cfg(not(embed_runtime))] pub fn runtime_dir() -> std::path::PathBuf { // runtime env var || dir where binary is located std::env::var("HELIX_RUNTIME") diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs index ec95708b..2d1cbccb 100644 --- a/helix-core/src/syntax.rs +++ b/helix-core/src/syntax.rs @@ -73,16 +73,37 @@ pub struct IndentQuery { pub outdent: HashSet<String>, } -fn read_query(language: &str, filename: &str) -> String { - static INHERITS_REGEX: Lazy<Regex> = - Lazy::new(|| Regex::new(r";+\s*inherits\s*:?\s*([a-z_,()]+)\s*").unwrap()); - +#[cfg(not(feature = "embed_runtime"))] +fn load_runtime_file(language: &str, filename: &str) -> Result<String, std::io::Error> { let root = crate::runtime_dir(); - // let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let path = root.join("queries").join(language).join(filename); + std::fs::read_to_string(&path) +} + +#[cfg(feature = "embed_runtime")] +use rust_embed::RustEmbed; + +#[cfg(feature = "embed_runtime")] +#[derive(RustEmbed)] +#[folder = "../runtime/"] +struct Runtime; +#[cfg(feature = "embed_runtime")] +fn load_runtime_file(language: &str, filename: &str) -> Result<String, Box<dyn std::error::Error>> { + let root = PathBuf::new(); let path = root.join("queries").join(language).join(filename); - let query = std::fs::read_to_string(&path).unwrap_or_default(); + let query_bytes = Runtime::get(&path.as_path().display().to_string()).unwrap_or_default(); + std::str::from_utf8(query_bytes.as_ref()) + .map(|s| s.to_string()) + .map_err(|err| err.into()) +} + +fn read_query(language: &str, filename: &str) -> String { + static INHERITS_REGEX: Lazy<Regex> = + Lazy::new(|| Regex::new(r";+\s*inherits\s*:?\s*([a-z_,()]+)\s*").unwrap()); + + let query = load_runtime_file(language, filename).unwrap_or_default(); // TODO: the collect() is not ideal let inherits = INHERITS_REGEX @@ -146,11 +167,8 @@ impl LanguageConfiguration { .get_or_init(|| { let language = get_language_name(self.language_id).to_ascii_lowercase(); - let root = crate::runtime_dir(); - let path = root.join("queries").join(language).join("indents.toml"); - - let toml = std::fs::read(&path).ok()?; - toml::from_slice(&toml).ok() + let toml = load_runtime_file(&language, "indents.toml").ok()?; + toml::from_slice(&toml.as_bytes()).ok() }) .as_ref() } diff --git a/helix-term/Cargo.toml b/helix-term/Cargo.toml index 59d5b325..3751b5ab 100644 --- a/helix-term/Cargo.toml +++ b/helix-term/Cargo.toml @@ -8,6 +8,9 @@ license = "MPL-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +embed_runtime = ["helix-core/embed_runtime"] + [[bin]] name = "hx" path = "src/main.rs" |