diff --git a/.containerignore b/.containerignore new file mode 100644 index 0000000..e147e34 --- /dev/null +++ b/.containerignore @@ -0,0 +1,3 @@ +vendor +target +rpmbuild \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2c78e12..4df31e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target vendor +rpmbuild *.tar.* diff --git a/Cargo.toml b/Cargo.toml index 5bf9c83..df9b4ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" edition = "2021" description = "A simple demonstration of the Iced GUI library." license = "MIT" -#license-file = "LICENSE.txt" repository = "no" # This application was created and tested with Rust version 1.81.0-nightly diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..7263e92 --- /dev/null +++ b/Containerfile @@ -0,0 +1,15 @@ +# This image is used for building the RPMs for SolutionTM + +FROM fedora:40 as build + +# Some general tools used for RPM building +RUN dnf install rpm-build rpmdevtools dnf-plugins-core git -y +RUN rpmdev-setuptree + +# Get the build deps +ADD ./SolutionTM.spec ./ +RUN dnf builddep ./SolutionTM.spec -y + +# Where the source will be mounted +RUN mkdir /source +WORKDIR /source \ No newline at end of file diff --git a/SolutionTM.spec b/SolutionTM.spec new file mode 100644 index 0000000..8a4796a --- /dev/null +++ b/SolutionTM.spec @@ -0,0 +1,56 @@ +# Generated by rust2rpm 26 +%bcond_without check + +# prevent library files from being installed +%global cargo_install_lib 0 + +%global crate SolutionTM + +Name: SolutionTM +Version: 0.1.0 +Release: %autorelease +Summary: Simple demonstration of the Iced GUI library + +SourceLicense: MIT +# FIXME: paste output of %%cargo_license_summary here +License: MIT +# LICENSE.dependencies contains a full license breakdown + +URL: no +Source: %{crate}-%{version}.tar.gz +Source: %{crate}-%{version}-vendor.tar.gz + +BuildRequires: cargo-rpm-macros >= 26 +BuildRequires: cargo >= 1.78 + +%global _description %{expand: +A simple demonstration of the Iced GUI library.} + +%description %{_description} + +%prep +%autosetup -n %{crate}-%{version} -p1 -a1 +%cargo_prep -v vendor + +%build +%cargo_build +%{cargo_license_summary} +%{cargo_license} > LICENSE.dependencies +%{cargo_vendor_manifest} + +%install +%cargo_install + +%if %{with check} +%check +%cargo_test +%endif + +%files +%license LICENCE.txt +%license LICENSE.dependencies +%license cargo-vendor.txt +%{_bindir}/SolutionTM + +%changelog +%autochangelog diff --git a/build_podman.sh b/build_podman.sh new file mode 100755 index 0000000..f8c4753 --- /dev/null +++ b/build_podman.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# First we build the 'Containerfile' for podman +podman build -t solutiontm:latest -f Containerfile || exit 1 + +# Run it, mount repo as /source and execute "bash build_rpm.sh" +podman run -d -v $(pwd):/source:Z -n rpmbuild solutiontm:latest bash build_rpm.sh || exit 1 +echo "Continuing build in background..." diff --git a/build_rpm.sh b/build_rpm.sh new file mode 100755 index 0000000..0ed40bc --- /dev/null +++ b/build_rpm.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# This is a simple script to build an RPM package from a spec file. + +# We need to install the required dependencies to build RPM packages. +# We also need to set up the RPM build tree: +# +# $ sudo dnf install rpm-build rpmdevtools dnf-plugins-core +# $ rpmdev-setuptree +# +# To install the builddeps: +# +# $ sudo dnf builddep SolutionTM.spec + +version=0.1.0 +name=SolutionTM + +rpmbuild=$PWD/rpmbuild +mkdir -p $rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} + +echo "Building RPM package for $name version $version." + +# Check so that all versions are coherent + +grep -q "Version:.*$version" $name.spec +if [ $? -eq 0 ]; then + echo "Version number in spec file is $version." +else + echo "Version number in spec file is not $version. Exiting." + exit 1 +fi + +grep -q "version = \"$version\"" Cargo.toml +if [ $? -eq 0 ]; then + echo "Version number in Cargo.toml is $version." +else + echo "Version number in Cargo.toml is not $version. Exiting." + exit 1 +fi + +source_tar=$name-$version.tar.gz +vendor_tar=$name-$version-vendor.tar.gz + +echo "Building source tarball $source_tar." +echo "Building vendor tarball $vendor_tar." + +# First, we need a tarball of the source code in this very repo. +git archive --format=tar.gz --prefix=$name-$version/ -o $source_tar HEAD + +# If we want an unclean build, comment out the above line and use the following instead. +# git ls-files | tar --transform="s,^,$name-$version/," -T - -czf $source_tar + +# Then we need a vendor tarball of the dependencies. +cargo vendor --versioned-dirs vendor +tar -cvzf $vendor_tar vendor + +# Then we move the tarball to the SOURCES directory. +mv $source_tar $rpmbuild/SOURCES/ +mv $vendor_tar $rpmbuild/SOURCES/ + +rpmbuild --define "_topdir $rpmbuild" -ba $name.spec \ No newline at end of file diff --git a/set_versions.sh b/set_versions.sh new file mode 100755 index 0000000..df1e4bc --- /dev/null +++ b/set_versions.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Currently not used + +$name=SolutionTM +$version=0.1.0 + +# If git is unclean, exit +if ! git diff-index --quiet HEAD --; then + echo "Git is unclean. Please commit your changes before building the RPM package." + exit 1 +fi + +# These should all set the first occurrence of the +# version number in the respective files. + +# Set the version number in the spec file. +sed -i "0,/Version: .*/s/Version: .*/Version: $version/" $name.spec + +# Set the version number in the Cargo.toml file. +sed -i "0,/version = \".*\"/s/version = \".*\"/version = \"$version\"/" Cargo.toml + +# Set the version number in the Cargo.lock file. +sed -i "0,/version = \".*\"/s/version = \".*\"/version = \"$version\"/" Cargo.lock + +git diff \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index eac61be..375c709 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use race::Race; use iced::widget::{button, column, combo_box, row, text, Column, ComboBox, Text}; use iced::{Alignment, Padding}; +use iced::{Element, Sandbox}; /// Represents the state of our application and handles /// message matching and updating the state accordingly. @@ -36,7 +37,9 @@ enum Command { Closed, } -impl State { +impl Sandbox for State { + type Message = Command; + // Constructor for the state, nothing special here. fn new() -> Self { Self { @@ -47,6 +50,10 @@ impl State { } } + fn title(&self) -> String { + String::from("Test Example") + } + // On each update, we recieve a command and update the state accordingly. fn update(&mut self, command: Command) { match command { @@ -60,7 +67,7 @@ impl State { // Called every frame to render the user interface. // Changes to the state are reflected here. - fn view(&self) -> Column { + fn view(&self) -> Element { // Our combo box let combo_box: ComboBox = combo_box::ComboBox::new( &self.races, @@ -93,14 +100,16 @@ impl State { .align_items(Alignment::Start) .spacing(10) .width(iced::Length::Fill) + .into() } } fn main() { // Iced::run is an entry point for the application. // It may fail so we match on the result. - match iced::run("Test Example", State::update, State::view) { - Ok(_) => {} - Err(error) => eprintln!("Error: {}", error), - } + // match iced::run("Test Example", State::update, State::view) { + // Ok(_) => {} + // Err(error) => eprintln!("Error: {}", error), + // } + State::run(iced::Settings::default()); }