From 3bd5e56e3fabbe394c004e9505c0bc4cf018a042 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 4 Aug 2016 19:59:29 +0200 Subject: [PATCH 1/2] Use upstream lazy_static and update once crate --- Cargo.toml | 6 +++++- src/lib.rs | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 6c5ef366..35dcf09c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] bit_field = "0.1.0" bitflags = "0.7.0" -once = "0.2.1" +once = "0.3.2" rlibc = "0.1.4" spin = "0.3.4" @@ -20,6 +20,10 @@ git = "https://github.com/phil-opp/multiboot2-elf64" default-features = false version = "0.7.1" +[dependencies.lazy_static] +version = "0.2.1" +features = ["spin_no_std"] + [lib] crate-type = ["staticlib"] diff --git a/src/lib.rs b/src/lib.rs index 79d4025c..a58f091e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,6 +24,8 @@ extern crate x86; #[macro_use] extern crate once; extern crate bit_field; +#[macro_use] +extern crate lazy_static; extern crate hole_list_allocator; extern crate alloc; From 4a1fa3a65ae8e77988b7c5a01b9360e585b1c29d Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 4 Aug 2016 20:06:56 +0200 Subject: [PATCH 2/2] Explain how to add lazy_static to the main crate --- blog/post/2016-05-28-catching-exceptions.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/blog/post/2016-05-28-catching-exceptions.md b/blog/post/2016-05-28-catching-exceptions.md index e9dfd3ae..11d70757 100644 --- a/blog/post/2016-05-28-catching-exceptions.md +++ b/blog/post/2016-05-28-catching-exceptions.md @@ -435,6 +435,24 @@ The reason is that the Rust compiler is not able to evaluate the value of the `s #### Lazy Statics to the Rescue Fortunately the `lazy_static` macro exists. Instead of evaluating a `static` at compile time, the macro performs the initialization when the `static` is referenced the first time. Thus, we can do almost everything in the initialization block and are even able to read runtime values. +Let's add the `lazy_static` crate to our project: + +```rust +// in src/lib.rs + +#[macro_use] +extern crate lazy_static; +``` + +```toml +# in Cargo.toml + +[dependencies.lazy_static] +version = "0.2.1" +features = ["spin_no_std"] +``` +We need the `spin_no_std` feature, since we don't link the standard library. + With `lazy_static`, we can define our IDT without problems: ```rust