From df7e5bd57af2f6135e5a0183d56cc4f87f948de6 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 12 Feb 2023 19:29:42 +0100 Subject: Allow compiling eframe with `--no-default-features` (#2728) * Check that we can compile eframe with --no-default-features * Allow compiling eframe with `--no-default-features` This is useful for libraries that depend on `eframe::Frame` but don't care what renderer eframe is using. --- .github/workflows/rust.yml | 12 +++++++++--- crates/eframe/CHANGELOG.md | 1 + crates/eframe/src/epi.rs | 24 ++++++++++++++++++++++++ crates/eframe/src/lib.rs | 22 ++++++++++++++-------- 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 738a2d63..a8d77527 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -47,24 +47,30 @@ jobs: with: crate: cargo-cranky - - name: Check all features + - name: check --all-features uses: actions-rs/cargo@v1 with: command: check args: --locked --all-features --all-targets - - name: Check default features + - name: check default features uses: actions-rs/cargo@v1 with: command: check args: --locked --all-targets - - name: Check no default features + - name: check --no-default-features uses: actions-rs/cargo@v1 with: command: check args: --locked --no-default-features --lib --all-targets + - name: check eframe --no-default-features + uses: actions-rs/cargo@v1 + with: + command: check + args: --locked --no-default-features --lib --all-targets -p eframe + - name: Test doc-tests uses: actions-rs/cargo@v1 with: diff --git a/crates/eframe/CHANGELOG.md b/crates/eframe/CHANGELOG.md index b492cf7f..46e1ddd4 100644 --- a/crates/eframe/CHANGELOG.md +++ b/crates/eframe/CHANGELOG.md @@ -5,6 +5,7 @@ NOTE: [`egui-winit`](../egui-winit/CHANGELOG.md), [`egui_glium`](../egui_glium/C ## Unreleased +* Allow compiling with `--no-default-features` ([#2728](https://github.com/emilk/egui/pull/2728)). ## 0.21.1 - 2023-02-12 diff --git a/crates/eframe/src/epi.rs b/crates/eframe/src/epi.rs index 1c9cb021..31127c02 100644 --- a/crates/eframe/src/epi.rs +++ b/crates/eframe/src/epi.rs @@ -10,9 +10,11 @@ use std::any::Any; #[cfg(not(target_arch = "wasm32"))] +#[cfg(any(feature = "glow", feature = "wgpu"))] pub use crate::native::run::UserEvent; #[cfg(not(target_arch = "wasm32"))] +#[cfg(any(feature = "glow", feature = "wgpu"))] pub use winit::event_loop::EventLoopBuilder; /// Hook into the building of an event loop before it is run @@ -20,6 +22,7 @@ pub use winit::event_loop::EventLoopBuilder; /// You can configure any platform specific details required on top of the default configuration /// done by `EFrame`. #[cfg(not(target_arch = "wasm32"))] +#[cfg(any(feature = "glow", feature = "wgpu"))] pub type EventLoopBuilderHook = Box)>; /// This is how your app is created. @@ -317,6 +320,7 @@ pub struct NativeOptions { pub hardware_acceleration: HardwareAcceleration, /// What rendering backend to use. + #[cfg(any(feature = "glow", feature = "wgpu"))] pub renderer: Renderer, /// Only used if the `dark-light` feature is enabled: @@ -355,6 +359,7 @@ pub struct NativeOptions { /// event loop before it is run. /// /// Note: A [`NativeOptions`] clone will not include any `event_loop_builder` hook. + #[cfg(any(feature = "glow", feature = "wgpu"))] pub event_loop_builder: Option, #[cfg(feature = "glow")] @@ -381,9 +386,13 @@ impl Clone for NativeOptions { fn clone(&self) -> Self { Self { icon_data: self.icon_data.clone(), + + #[cfg(any(feature = "glow", feature = "wgpu"))] event_loop_builder: None, // Skip any builder callbacks if cloning + #[cfg(feature = "wgpu")] wgpu_options: self.wgpu_options.clone(), + ..*self } } @@ -397,8 +406,10 @@ impl Default for NativeOptions { maximized: false, decorated: true, fullscreen: false, + #[cfg(target_os = "macos")] fullsize_content: false, + drag_and_drop_support: true, icon_data: None, initial_window_pos: None, @@ -413,14 +424,22 @@ impl Default for NativeOptions { depth_buffer: 0, stencil_buffer: 0, hardware_acceleration: HardwareAcceleration::Preferred, + + #[cfg(any(feature = "glow", feature = "wgpu"))] renderer: Renderer::default(), + follow_system_theme: cfg!(target_os = "macos") || cfg!(target_os = "windows"), default_theme: Theme::Dark, run_and_return: true, + + #[cfg(any(feature = "glow", feature = "wgpu"))] event_loop_builder: None, + #[cfg(feature = "glow")] shader_version: None, + centered: false, + #[cfg(feature = "wgpu")] wgpu_options: egui_wgpu::WgpuConfiguration::default(), } @@ -559,6 +578,7 @@ pub enum WebGlContextOption { /// What rendering backend to use. /// /// You need to enable the "glow" and "wgpu" features to have a choice. +#[cfg(any(feature = "glow", feature = "wgpu"))] #[derive(Clone, Copy, Debug, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] @@ -572,6 +592,7 @@ pub enum Renderer { Wgpu, } +#[cfg(any(feature = "glow", feature = "wgpu"))] impl Default for Renderer { fn default() -> Self { #[cfg(feature = "glow")] @@ -587,6 +608,7 @@ impl Default for Renderer { } } +#[cfg(any(feature = "glow", feature = "wgpu"))] impl std::fmt::Display for Renderer { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { @@ -599,6 +621,7 @@ impl std::fmt::Display for Renderer { } } +#[cfg(any(feature = "glow", feature = "wgpu"))] impl std::str::FromStr for Renderer { type Err = String; @@ -811,6 +834,7 @@ impl Frame { } /// for integrations only: call once per frame + #[cfg(any(feature = "glow", feature = "wgpu"))] pub(crate) fn take_app_output(&mut self) -> backend::AppOutput { std::mem::take(&mut self.output) } diff --git a/crates/eframe/src/lib.rs b/crates/eframe/src/lib.rs index de031d2a..a2181c58 100644 --- a/crates/eframe/src/lib.rs +++ b/crates/eframe/src/lib.rs @@ -137,6 +137,7 @@ pub async fn start_web( // When compiling natively #[cfg(not(target_arch = "wasm32"))] +#[cfg(any(feature = "glow", feature = "wgpu"))] mod native; /// This is how you start a native (desktop) app. @@ -179,6 +180,7 @@ mod native; /// This function can fail if we fail to set up a graphics context. #[cfg(not(target_arch = "wasm32"))] #[allow(clippy::needless_pass_by_value)] +#[cfg(any(feature = "glow", feature = "wgpu"))] pub fn run_native( app_name: &str, native_options: NativeOptions, @@ -233,24 +235,28 @@ pub type Result = std::result::Result; // --------------------------------------------------------------------------- -/// Profiling macro for feature "puffin" #[cfg(not(target_arch = "wasm32"))] -macro_rules! profile_function { +#[cfg(any(feature = "glow", feature = "wgpu"))] +mod profiling_scopes { + /// Profiling macro for feature "puffin" + macro_rules! profile_function { ($($arg: tt)*) => { #[cfg(feature = "puffin")] puffin::profile_function!($($arg)*); }; } -#[cfg(not(target_arch = "wasm32"))] -pub(crate) use profile_function; + pub(crate) use profile_function; -/// Profiling macro for feature "puffin" -#[cfg(not(target_arch = "wasm32"))] -macro_rules! profile_scope { + /// Profiling macro for feature "puffin" + macro_rules! profile_scope { ($($arg: tt)*) => { #[cfg(feature = "puffin")] puffin::profile_scope!($($arg)*); }; } + pub(crate) use profile_scope; +} + #[cfg(not(target_arch = "wasm32"))] -pub(crate) use profile_scope; +#[cfg(any(feature = "glow", feature = "wgpu"))] +pub(crate) use profiling_scopes::*; -- cgit v1.2.3-70-g09d2