diff --git a/contrib/reproducible/docker/docker-build.sh b/contrib/reproducible/docker/docker-build.sh index c97656f1..6c86dc5b 100755 --- a/contrib/reproducible/docker/docker-build.sh +++ b/contrib/reproducible/docker/docker-build.sh @@ -11,10 +11,16 @@ docker build . -t liana_cross_win -f contrib/reproducible/docker/windows.Dockerf docker run --rm -ti \ -v "$TARGET_DIR/gui":/liana/target \ -v "$PWD/contrib/reproducible/docker":/liana/docker \ + -v "$PWD/gui/Cargo.toml":/liana/Cargo.toml \ + -v "$PWD/gui/Cargo.lock":/liana/Cargo.lock \ -v "$PWD/gui/src":/liana/src \ - -v "$PWD/gui/static":/liana/static \ + -v "$PWD/gui/ui/Cargo.toml":/liana/ui/Cargo.toml \ + -v "$PWD/gui/ui/Cargo.lock":/liana/ui/Cargo.lock \ + -v "$PWD/gui/ui/src":/liana/ui/src \ + -v "$PWD/gui/ui/static":/liana/ui/static \ liana_cross_win + # Sanity check the given MacOS SDK is the expected one. if ! $(echo "28d352f8c14a43d9b8a082ac6338dc173cb153f964c6e8fb6ba389e5be528bd0 $(basename $XCODE_PATH)" | sha256sum -c --status); then echo "No or invalid Xcode SDK found. Need an Xcode_12.2.xip. You can configure the path using \$XCODE_PATH."; @@ -27,9 +33,16 @@ docker run --rm -ti \ -v "$TARGET_DIR":/liana/target \ -v "$TARGET_DIR/gui":/liana/gui/target \ -v "$PWD/contrib/reproducible/docker":/liana/docker \ + -v "$PWD/Cargo.toml":/liana/Cargo.toml \ + -v "$PWD/Cargo.lock":/liana/Cargo.lock \ -v "$PWD/src":/liana/src \ + -v "$PWD/gui/Cargo.toml":/liana/gui/Cargo.toml \ + -v "$PWD/gui/Cargo.lock":/liana/gui/Cargo.lock \ -v "$PWD/gui/src":/liana/gui/src \ - -v "$PWD/gui/static":/liana/gui/static \ + -v "$PWD/gui/ui/Cargo.toml":/liana/gui/ui/Cargo.toml \ + -v "$PWD/gui/ui/Cargo.lock":/liana/gui/ui/Cargo.lock \ + -v "$PWD/gui/ui/src":/liana/gui/ui/src \ + -v "$PWD/gui/ui/static":/liana/gui/ui/static \ -v "$XCODE_PATH":/liana/Xcode_12.2.xip \ liana_cross_mac diff --git a/contrib/reproducible/docker/macos.Dockerfile b/contrib/reproducible/docker/macos.Dockerfile index 5113c2b9..ffa29ee6 100644 --- a/contrib/reproducible/docker/macos.Dockerfile +++ b/contrib/reproducible/docker/macos.Dockerfile @@ -4,24 +4,24 @@ WORKDIR /liana # We try to pin our dependencies to avoid potential sources of non-determinism, but we don't go # out of our way to pin the whole tree of deps. Instead invest time in getting Guix cross-compilation. -RUN apt update && apt install -y \ - clang=1:11.0-51+nmu5 \ - make=4.3-4.1 \ - libssl-dev=1.1.1n-0+deb11u3 \ - liblzma-dev=5.2.5-2.1~deb11u1 \ - libxml2=2.9.10+dfsg-6.7+deb11u3 \ - libxml2-dev=2.9.10+dfsg-6.7+deb11u3 \ - cmake=3.18.4-2+deb11u1 \ - git=1:2.30.2-1 \ - patch=2.7.6-7 \ - python3=3.9.2-3 \ - llvm-dev=1:11.0-51+nmu5 \ - cpio=2.13+dfsg-4 \ - zlib1g-dev=1:1.2.11.dfsg-2+deb11u2 \ - libbz2-dev=1.0.8-4 \ - xz-utils=5.2.5-2.1~deb11u1 \ - bzip2=1.0.8-4 \ - curl=7.74.0-1.3+deb11u5 +RUN apt update && apt satisfy -y \ + "clang (>=11.0, <=11.0)" \ + "make (<=4.3-*)" \ + "libssl-dev (>=1.1, <=1.1)" \ + "liblzma-dev (>=5.2, <=5.2)" \ + "libxml2 (>=2.9, <= 2.9)" \ + "libxml2-dev (>=2.9, <=2.9)" \ + "cmake (>=3.18, <=3.18)" \ + "git (>=2.30, <=2.30)" \ + "patch (>=2.7, <=2.7)" \ + "python3 (>=3.9, <=3.9)" \ + "llvm-dev (>=11.0, <=11.0)" \ + "cpio (<=2.13+*)" \ + "zlib1g-dev (>=1.2, <=1.2)" \ + "libbz2-dev (>=1.0, <=1.0)" \ + "xz-utils (>=5.2, <=5.2)" \ + "bzip2 (>=1.0, <=1.0)" \ + "curl (>=7.74, <=7.74)" # Download the cargo binary and compiled stdlib from the distributed releases to make sure to build with # the very same toolchain. We use 1.65.0 because it is unfortunately the MSRV of the GUI. @@ -33,21 +33,8 @@ RUN curl -O "https://static.rust-lang.org/dist/rust-1.65.0-x86_64-unknown-linux- tar -xzf rust-1.65.0-x86_64-apple-darwin.tar.gz && \ rm -r *.tar.gz -# Copy the Cargo files for both the daemon and the GUI to vendor the dependencies. -COPY Cargo.toml Cargo.lock /liana/ -COPY gui/Cargo.toml gui/Cargo.lock /liana/gui/ - -# We cache the dependencies sources in the image to avoid re-indexing everything from scratch -# at every run. It was useful when debugging the build, it could be removed eventually if we -# think the tradeoff vs the image size isn't worth it anymore. -RUN /liana/rust-1.65.0-x86_64-unknown-linux-gnu/cargo/bin/cargo vendor && \ - cd gui && \ - /liana/rust-1.65.0-x86_64-unknown-linux-gnu/cargo/bin/cargo vendor && \ - cd .. - -# Cargo configuration for using the vendored dependencies during the builds. -COPY contrib/reproducible/docker/cargo_config.toml /liana/.cargo/cargo_config.toml -COPY contrib/reproducible/docker/cargo_config.toml /liana/gui/.cargo/cargo_config.toml +# NOTE: we were previously caching dependencies here (through `cargo vendor`). It's a tradeoff between the image size +# and not needing internet access when running the image to build the software. # For some reason, we can't just set the RUSTFLAGS environment variable to add `-L` for compiling dependencies. # This doesn't work: RUSTFLAGS="-L/liana/rust-1.65.0-x86_64-apple-darwin/rust-std-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/" diff --git a/contrib/reproducible/docker/windows.Dockerfile b/contrib/reproducible/docker/windows.Dockerfile index 1ea7336a..ff12ff58 100644 --- a/contrib/reproducible/docker/windows.Dockerfile +++ b/contrib/reproducible/docker/windows.Dockerfile @@ -4,10 +4,10 @@ WORKDIR /liana # We try to pin our dependencies to avoid potential sources of non-determinism, but we don't go # out of our way to pin the whole tree of deps. Instead invest time in getting Guix cross-compilation. -RUN apt update && apt install -y \ - gcc-mingw-w64-x86-64=10.2.1-6+24.2 \ - curl=7.74.0-1.3+deb11u5 \ - gcc=4:10.2.1-1 +RUN apt update && apt satisfy -y \ + "gcc-mingw-w64-x86-64 (>=10.2, <=10.2)" \ + "curl (>=7.74, <=7.74)" \ + "gcc (>=10.2, <=10.2)" # Download the cargo binary and compiled stdlib from the distributed releases to make sure to build with # the very same toolchain. We use 1.65.0 because it is unfortunately the MSRV of the GUI. @@ -19,16 +19,8 @@ RUN curl -O "https://static.rust-lang.org/dist/rust-1.65.0-x86_64-unknown-linux- tar -xzf rust-1.65.0-x86_64-pc-windows-gnu.tar.gz && \ rm -r *.tar.gz -# Copy the Cargo files to vendor the dependencies. -COPY gui/Cargo.toml gui/Cargo.lock /liana/ - -# We cache the dependencies sources in the image to avoid re-indexing everything from scratch -# at every run. It was useful when debugging the build, it could be removed eventually if we -# think the tradeoff vs the image size wasn't worth it anymore. -RUN /liana/rust-1.65.0-x86_64-unknown-linux-gnu/cargo/bin/cargo vendor - -# Cargo configuration for using the vendored dependencies during the build. -COPY contrib/reproducible/docker/cargo_config.toml /liana/.cargo/cargo_config.toml +# NOTE: we were previously caching dependencies here (through `cargo vendor`). It's a tradeoff between the image size +# and not needing internet access when running the image to build the software. # For some reason, we can't just set the RUSTFLAGS environment variable to add `-L` for compiling dependencies. # This doesn't work: RUSTFLAGS="-L /liana/rust-1.65.0-x86_64-pc-windows-gnu/rust-std-x86_64-pc-windows-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/ -L /liana/rust-1.65.0-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/" diff --git a/contrib/reproducible/guix/guix-build.sh b/contrib/reproducible/guix/guix-build.sh index ed62283a..79fd1257 100755 --- a/contrib/reproducible/guix/guix-build.sh +++ b/contrib/reproducible/guix/guix-build.sh @@ -117,11 +117,14 @@ for project_folder in "" "gui"; do # NOTE: it looks like "--rebuild-cache" is necessary for the IS_GUI variable to # be taken into account when building the container (otherwise the GUI container could # miss some dependencies). + # TODO: only expose the "ui" folder for GUI builds IS_GUI="$IS_GUI" time_machine shell --no-cwd \ --expose="$PROJECT_ROOT/src=/liana/src" \ - --expose="$PWD/gui/static=/liana/static" \ --expose="$PROJECT_ROOT/Cargo.toml=/liana/Cargo.toml" \ --expose="$BUILD_ROOT/Cargo.lock=/liana/Cargo.lock" \ + --expose="$PWD/gui/ui/src=/liana/ui/src" \ + --expose="$PWD/gui/ui/Cargo.toml=/liana/ui/Cargo.toml" \ + --expose="$PWD/gui/ui/static=/liana/ui/static" \ --expose="$PWD/contrib/reproducible/guix/build.sh=/liana/build.sh" \ --expose="$PROJECT_VENDOR_DIR=/vendor" \ --share="$PROJECT_OUT_DIR=/out" \ diff --git a/contrib/reproducible/guix/manifest.scm b/contrib/reproducible/guix/manifest.scm index 72ddb0cf..8aeba703 100644 --- a/contrib/reproducible/guix/manifest.scm +++ b/contrib/reproducible/guix/manifest.scm @@ -5,7 +5,7 @@ (append (list "rust:cargo" - "coreutils" + "coreutils-minimal" "patchelf" "gcc-toolchain@10.3.0") ;; Additional dependencies for building the GUI, and the regular rustc for building @@ -24,5 +24,5 @@ (if (string=? is_gui "1") (list - (@@ (gnu packages rust) rust-1.64)) + (@@ (gnu packages rust) rust-1.65)) '()))))) diff --git a/contrib/reproducible/guix/patches/gui/iced_default_enum.patch b/contrib/reproducible/guix/patches/gui/iced_default_enum.patch deleted file mode 100644 index 7e2ce0fb..00000000 --- a/contrib/reproducible/guix/patches/gui/iced_default_enum.patch +++ /dev/null @@ -1,481 +0,0 @@ -commit f71bc71bf6724a1c5e2a3246dd8bd0a90fcf0e15 -Author: Antoine Poinsot -Date: Thu Dec 1 15:38:32 2022 +0100 - - Do not use, or special-case them, unstable features as of 1.60.0 - - This is in order to make the GUI MSRV effectively 1.60.0. - - Default derivation on enums is removed. - - Usage of bool_to_option is removed. - - Generic associated types is unfortunately special cased as enabled. This - forces use to set RUSTC_BOOTSTRAP=1 in the Guix container... - -diff --git a/iced_glow/src/lib.rs b/iced_glow/src/lib.rs -index e3690a69..b5b9cc38 100644 ---- a/iced_glow/src/lib.rs -+++ b/iced_glow/src/lib.rs -@@ -20,6 +20,7 @@ - #![forbid(rust_2018_idioms)] - #![allow(clippy::inherent_to_string, clippy::type_complexity)] - #![cfg_attr(docsrs, feature(doc_cfg))] -+#![feature(generic_associated_types)] - - pub use glow; - -diff --git a/iced_graphics/src/lib.rs b/iced_graphics/src/lib.rs -index d39dd90c..876b478f 100644 ---- a/iced_graphics/src/lib.rs -+++ b/iced_graphics/src/lib.rs -@@ -21,6 +21,7 @@ - #![forbid(rust_2018_idioms)] - #![allow(clippy::inherent_to_string, clippy::type_complexity)] - #![cfg_attr(docsrs, feature(doc_cfg))] -+#![feature(generic_associated_types)] - mod antialiasing; - mod error; - mod primitive; -diff --git a/iced_native/src/program/state.rs b/iced_native/src/program/state.rs -index 8ae1cacb..25a3028b 100644 ---- a/iced_native/src/program/state.rs -+++ b/iced_native/src/program/state.rs -@@ -120,7 +120,11 @@ where - .iter() - .zip(event_statuses) - .filter_map(|(event, status)| { -- matches!(status, event::Status::Ignored).then_some(event) -+ if matches!(status, event::Status::Ignored) { -+ Some(event) -+ } else { -+ None -+ } - }) - .cloned() - .collect(); -diff --git a/iced_style/src/theme.rs b/iced_style/src/theme.rs -index 55bfa4ca..e29fde31 100644 ---- a/iced_style/src/theme.rs -+++ b/iced_style/src/theme.rs -@@ -26,10 +26,9 @@ use iced_core::{Background, Color, Vector}; - use std::rc::Rc; - - /// A built-in theme. --#[derive(Debug, Clone, PartialEq, Default)] -+#[derive(Debug, Clone, PartialEq)] - pub enum Theme { - /// The built-in light variant. -- #[default] - Light, - /// The built-in dark variant. - Dark, -@@ -62,6 +61,12 @@ impl Theme { - } - } - -+impl Default for Theme { -+ fn default() -> Self { -+ Self::Light -+ } -+} -+ - /// A [`Theme`] with a customized [`Palette`]. - #[derive(Debug, Clone, Copy, PartialEq)] - pub struct Custom { -@@ -80,15 +85,19 @@ impl Custom { - } - - /// The style of an application. --#[derive(Default)] - pub enum Application { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for Application { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl application::StyleSheet for Theme { - type Style = Application; - -@@ -120,10 +129,11 @@ impl From application::Appearance> for Application { - } - - /// The style of a button. --#[derive(Default)] -+/* -+ * Button -+ */ - pub enum Button { - /// The primary style. -- #[default] - Primary, - /// The secondary style. - Secondary, -@@ -139,6 +149,12 @@ pub enum Button { - Custom(Box>), - } - -+impl Default for Button { -+ fn default() -> Self { -+ Self::Primary -+ } -+} -+ - impl button::StyleSheet for Theme { - type Style = Button; - -@@ -228,10 +244,11 @@ impl button::StyleSheet for Theme { - } - - /// The style of a checkbox. --#[derive(Default)] -+/* -+ * Checkbox -+ */ - pub enum Checkbox { - /// The primary style. -- #[default] - Primary, - /// The secondary style. - Secondary, -@@ -243,6 +260,12 @@ pub enum Checkbox { - Custom(Box>), - } - -+impl Default for Checkbox { -+ fn default() -> Self { -+ Self::Primary -+ } -+} -+ - impl checkbox::StyleSheet for Theme { - type Style = Checkbox; - -@@ -340,10 +363,11 @@ fn checkbox_appearance( - } - - /// The style of a container. --#[derive(Default)] -+/* -+ * Container -+ */ - pub enum Container { - /// No style. -- #[default] - Transparent, - /// A simple box. - Box, -@@ -351,6 +375,12 @@ pub enum Container { - Custom(Box>), - } - -+impl Default for Container { -+ fn default() -> Self { -+ Self::Transparent -+ } -+} -+ - impl From container::Appearance> for Container { - fn from(f: fn(&Theme) -> container::Appearance) -> Self { - Self::Custom(Box::new(f)) -@@ -388,15 +418,19 @@ impl container::StyleSheet for fn(&Theme) -> container::Appearance { - } - - /// The style of a slider. --#[derive(Default)] - pub enum Slider { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for Slider { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl slider::StyleSheet for Theme { - type Style = Slider; - -@@ -469,15 +503,20 @@ impl slider::StyleSheet for Theme { - } - - /// The style of a menu. --#[derive(Clone, Default)] -+#[derive(Clone)] - pub enum Menu { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Rc>), - } - -+impl Default for Menu { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl menu::StyleSheet for Theme { - type Style = Menu; - -@@ -511,10 +550,9 @@ impl From for Menu { - } - - /// The style of a pick list. --#[derive(Clone, Default)] -+#[derive(Clone)] - pub enum PickList { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom( -@@ -523,6 +561,12 @@ pub enum PickList { - ), - } - -+impl Default for PickList { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl pick_list::StyleSheet for Theme { - type Style = PickList; - -@@ -566,15 +610,19 @@ impl pick_list::StyleSheet for Theme { - } - - /// The style of a radio button. --#[derive(Default)] - pub enum Radio { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for Radio { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl radio::StyleSheet for Theme { - type Style = Radio; - -@@ -621,15 +669,19 @@ impl radio::StyleSheet for Theme { - } - - /// The style of a toggler. --#[derive(Default)] - pub enum Toggler { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for Toggler { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl toggler::StyleSheet for Theme { - type Style = Toggler; - -@@ -688,15 +740,19 @@ impl toggler::StyleSheet for Theme { - } - - /// The style of a pane grid. --#[derive(Default)] - pub enum PaneGrid { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for PaneGrid { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl pane_grid::StyleSheet for Theme { - type Style = PaneGrid; - -@@ -730,10 +786,11 @@ impl pane_grid::StyleSheet for Theme { - } - - /// The style of a progress bar. --#[derive(Default)] -+/* -+ * Progress Bar -+ */ - pub enum ProgressBar { - /// The primary style. -- #[default] - Primary, - /// The success style. - Success, -@@ -743,6 +800,12 @@ pub enum ProgressBar { - Custom(Box>), - } - -+impl Default for ProgressBar { -+ fn default() -> Self { -+ Self::Primary -+ } -+} -+ - impl From progress_bar::Appearance> for ProgressBar { - fn from(f: fn(&Theme) -> progress_bar::Appearance) -> Self { - Self::Custom(Box::new(f)) -@@ -783,15 +846,22 @@ impl progress_bar::StyleSheet for fn(&Theme) -> progress_bar::Appearance { - } - - /// The style of a rule. --#[derive(Default)] -+/* -+ * Rule -+ */ - pub enum Rule { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for Rule { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl From rule::Appearance> for Rule { - fn from(f: fn(&Theme) -> rule::Appearance) -> Self { - Self::Custom(Box::new(f)) -@@ -827,15 +897,19 @@ impl rule::StyleSheet for fn(&Theme) -> rule::Appearance { - /** - * Svg - */ --#[derive(Default)] - pub enum Svg { - /// No filtering to the rendered SVG. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for Svg { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl Svg { - /// Creates a custom [`Svg`] style. - pub fn custom_fn(f: fn(&Theme) -> svg::Appearance) -> Self { -@@ -863,15 +937,19 @@ impl svg::StyleSheet for fn(&Theme) -> svg::Appearance { - } - - /// The style of a scrollable. --#[derive(Default)] - pub enum Scrollable { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for Scrollable { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl Scrollable { - /// Creates a custom [`Scrollable`] theme. - pub fn custom + 'static>( -@@ -961,15 +1039,23 @@ impl scrollable::StyleSheet for Theme { - } - - /// The style of text. --#[derive(Clone, Copy, Default)] -+/* -+ * Text -+ */ -+#[derive(Clone, Copy)] - pub enum Text { - /// The default style. -- #[default] - Default, - /// Colored text. - Color(Color), - } - -+impl Default for Text { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl From for Text { - fn from(color: Color) -> Self { - Text::Color(color) -@@ -988,15 +1074,19 @@ impl text::StyleSheet for Theme { - } - - /// The style of a text input. --#[derive(Default)] - pub enum TextInput { - /// The default style. -- #[default] - Default, - /// A custom style. - Custom(Box>), - } - -+impl Default for TextInput { -+ fn default() -> Self { -+ Self::Default -+ } -+} -+ - impl text_input::StyleSheet for Theme { - type Style = TextInput; - -diff --git a/iced_wgpu/src/lib.rs b/iced_wgpu/src/lib.rs -index dcb699e8..5b3cda57 100644 ---- a/iced_wgpu/src/lib.rs -+++ b/iced_wgpu/src/lib.rs -@@ -37,6 +37,7 @@ - #![forbid(rust_2018_idioms)] - #![allow(clippy::inherent_to_string, clippy::type_complexity)] - #![cfg_attr(docsrs, feature(doc_cfg))] -+#![feature(generic_associated_types)] - - pub mod settings; - pub mod triangle; -