You can compile Ironbar from source using `cargo`. Just clone the repo and build: ```sh git clone https://github.com/jakestanger/ironbar.git cd ironbar cargo build --release # change path to wherever you want to install install target/release/ironbar ~/.local/bin/ironbar ``` It is also recommended to install a [Nerd Font](https://www.nerdfonts.com/#home) for displaying symbols. ## Build requirements To build from source, you must have GTK (>= 3.22) and GTK Layer Shell installed. You also need rust; only the latest stable version is supported. ### Arch ```shell pacman -S gtk3 gtk-layer-shell # for http support pacman -S openssl # for volume support pacman -S libpulse # for lua/cairo support pacman -S luajit lua51-lgi ``` ### Ubuntu/Debian ```shell apt install build-essential libgtk-3-dev libgtk-layer-shell-dev # for http support apt install libssl-dev # for volume support apt install libpulse-dev # for lua/cairo support apt install luajit-dev lua-lgi ``` ### Fedora ```shell dnf install gtk3-devel gtk-layer-shell-devel # for http support dnf install openssl-devel # for volume support dnf install pulseaudio-libs-devel # for lua/cairo support dnf install luajit-devel lua-lgi ``` ## Features By default, all features are enabled for convenience. This can result in a significant compile time. If you know you are not going to need all the features, you can compile with only the features you need. As of `v0.15.0`, compiling with no features is about 50% faster. On a 3800X, it takes about 45 seconds for no features and 90 seconds for all. This difference is expected to increase as the bar develops. Features containing a `+` can be stacked, for example `config+json` and `config+yaml` could both be enabled. To build using only specific features, disable default features and pass a comma separated list to `cargo build`: ```shell cargo build --release --no-default-features \ --features http,config+json,clock ``` > ⚠ Make sure you enable at least one `config` feature otherwise you will not be able to start the bar! | Feature | Description | |---------------------|-----------------------------------------------------------------------------------| | **Core** | | | http | Enables HTTP features. Currently this includes the ability to load remote images. | | ipc | Enables the IPC server. | | cli | Enables the CLI. Will also enable `ipc`. | | config+all | Enables support for all configuration languages. | | config+json | Enables configuration support for JSON. | | config+yaml | Enables configuration support for YAML. | | config+toml | Enables configuration support for TOML. | | config+corn | Enables configuration support for [Corn](https://github.com/jakestanger/corn). | | config+ron | Enables configuration support for [Ron](https://github.com/ron-rs/ron). | | **Modules** | | | cairo | Enables the `cairo` module | | clipboard | Enables the `clipboard` module. | | clock | Enables the `clock` module. | | focused | Enables the `focused` module. | | launcher | Enables the `launcher` module. | | music+all | Enables the `music` module with support for all player types. | | music+mpris | Enables the `music` module with MPRIS support. | | music+mpd | Enables the `music` module with MPD support. | | network_manager | Enables the `network_manager` module. | | notifications | Enables the `notiications` module. | | sys_info | Enables the `sys_info` module. | | tray | Enables the `tray` module. | | upower | Enables the `upower` module. | | volume | Enables the `volume` module. | | workspaces+all | Enables the `workspaces` module with support for all compositors. | | workspaces+sway | Enables the `workspaces` module with support for Sway. | | workspaces+hyprland | Enables the `workspaces` module with support for Hyprland. | | **Other** | | | schema | Enables JSON schema support and the CLI `--print-schema` flag. | ## Speeding up compiling With the full feature set, Ironbar can take a good while to compile. There are a couple of tricks which can be used to improve compile times. ## Linker The default GCC linker is *slow* - it takes nearly half of the compile time. As an alternative, you can use [mold](https://github.com/rui314/mold). Install the package for your distro, create/modify the `.cargo/config.toml` file inside the project dir, then add the following: ```toml [target.x86_64-unknown-linux-gnu] rustflags = ["-C", "link-arg=-fuse-ld=mold"] ``` ## Caching To speed up subsequent rebuilds, Mozilla's [sccache](https://github.com/mozilla/sccache) tool can be used. This provides a cache of Rust modules which can be re-used when compiling any other crate. Install the package for your distro, create/modify the `.cargo/config.toml` file inside the project dir, then add the following: ```toml [build] rustc-wrapper = "/usr/bin/sccache" ``` > [!TIP] > To get the most of out `sccache`, > you can add this to `$HOME/.cargo/config.toml` to enable caching for all Cargo builds. ## Codegen Backend > [!WARNING] > The Cranelift backend is experimental and requires the use of the nightly compiler. > It is designed for development builds only. If working on the Ironbar codebase, you may see some benefit from using the [Cranelift](https://github.com/rust-lang/rustc_codegen_cranelift) compiler backend. This is known to shave a further few seconds off the compile time (bringing down from 10 to 7-8 on my own hardware). Firstly install the component: ```shell rustup component add rustc-codegen-cranelift-preview --toolchain nightly ``` Then create/modify the `.cargo/config.toml` file inside the project dir, and add the following: ```toml [unstable] codegen-backend = true [profile.dev] codegen-backend = "cranelift" ```