bevy/docs/linux_dependencies.md
figsoda d2963267ba improve nix docs (#7044)
# Objective

`xlibsWrapper` is being deprecated: https://github.com/NixOS/nixpkgs/issues/194054, this pr removes the deprecated xlibsWrapper and makes a couple more improvements

## Solution

- rename NixOS to Nix since this is not specific to NixOS
- remove usage of `xlibsWrapper`
- add instructions for nix flakes with `nix develop`
- add example of a packaged bevy program in nixpkgs
- minor cosmetic/grammatical changes
2022-12-29 21:37:27 +00:00

6 KiB

Installing Linux dependencies

This page lists the required dependencies to build a Bevy project on your Linux machine.

If you don't see your distro present in the list, feel free to add the instructions in this document.

Ubuntu

sudo apt-get install g++ pkg-config libx11-dev libasound2-dev libudev-dev

if using Wayland, you will also need to install

sudo apt-get install libwayland-dev libxkbcommon-dev

Depending on your graphics card, you may have to install one of the following: vulkan-radeon, vulkan-intel, or mesa-vulkan-drivers

Compiling with clang is also possible - replace the g++ package with clang.

Windows Subsystem for Linux (WSL 2)

Graphics and audio need to be configured for them to work with WSL 2 backend. Please see the ubuntu WSL documentation on how to set up graphics and audio.

Fedora

sudo dnf install gcc-c++ libX11-devel alsa-lib-devel systemd-devel

if using Wayland, you will also need to install

sudo dnf install wayland-devel libxkbcommon-devel

If there are errors with linking during the build process such as:

 = note: /usr/bin/ld: skipping incompatible /usr/lib/libasound.so when searching for -lasound
          /usr/bin/ld: skipping incompatible /usr/lib/libasound.so when searching for -lasound
          /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/10/../../../libasound.so when searching for -lasound
          /usr/bin/ld: skipping incompatible /lib/libasound.so when searching for -lasound
          /usr/bin/ld: skipping incompatible /usr/lib/libasound.so when searching for -lasound
          /usr/bin/ld: cannot find -lasound

Add your arch to the end of the package to remove the linker error. For example:

sudo dnf install alsa-lib-devel.x86_64

Or if there are errors such as:

  --- stderr
  thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "`\"pkg-config\" \"--libs\" \"--cflags\" \"libudev\"` did not exit successfully: exit status: 1\n--- stderr\nPackage libudev was not found in the pkg-config search path.\nPerhaps you should add the directory containing `libudev.pc'\nto the PKG_CONFIG_PATH environment variable\nNo package 'libudev' found\n"', /home/<user>/.cargo/registry/src/github.com-1ecc6299db9ec823/libudev-sys-0.1.4/build.rs:38:41
  stack backtrace:
     0: rust_begin_unwind
               at /rustc/9bb77da74dac4768489127d21e32db19b59ada5b/library/std/src/panicking.rs:517:5
     1: core::panicking::panic_fmt
               at /rustc/9bb77da74dac4768489127d21e32db19b59ada5b/library/core/src/panicking.rs:96:14
     2: core::result::unwrap_failed
               at /rustc/9bb77da74dac4768489127d21e32db19b59ada5b/library/core/src/result.rs:1617:5
     3: core::result::Result<T,E>::unwrap
               at /rustc/9bb77da74dac4768489127d21e32db19b59ada5b/library/core/src/result.rs:1299:23
     4: build_script_build::main
               at ./build.rs:38:5
     5: core::ops::function::FnOnce::call_once
               at /rustc/9bb77da74dac4768489127d21e32db19b59ada5b/library/core/src/ops/function.rs:227:5
  note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
warning: build failed, waiting for other jobs to finish...
error: build failed

Set the PKG_CONFIG_PATH env var to /usr/lib/<target>/pkgconfig/. For example on an x86_64 system:

export PKG_CONFIG_PATH="/usr/lib/x86_64-linux-gnu/pkgconfig/"

Arch / Manjaro

sudo pacman -S libx11 pkgconf alsa-lib

Install pipewire-alsa or pulseaudio-alsa depending on the sound server you are using.

Depending on your graphics card, you may have to install one of the following: vulkan-radeon, vulkan-intel, or mesa-vulkan-drivers

Void

sudo xbps-install -S pkgconf alsa-lib-devel libX11-devel eudev-libudev-devel

Nix

Add a shell.nix file to the root of the project containing:

{ pkgs ? import <nixpkgs> { } }:

with pkgs;

mkShell rec {
  nativeBuildInputs = [
    pkg-config
  ];
  buildInputs = [
    udev alsa-lib vulkan-loader
    xorg.libX11 xorg.libXcursor xorg.libXi xorg.libXrandr # To use the x11 feature
    libxkbcommon wayland # To use the wayland feature
  ];
  LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs;
}

And enter it by just running nix-shell. You should be able compile Bevy programs using cargo run within this nix-shell. You can do this in one line with nix-shell --run "cargo run".

This is also possible with Nix flakes. Instead of creating shell.nix, you just need to add the derivation (mkShell) to your devShells in flake.nix. Run nix develop to enter the shell and nix develop -c cargo run to run the program. See Nix's documentation for more information about devShells.

Note that this template does not add Rust to the environment because there are many ways to do it. For example, to use stable Rust from nixpkgs, you can add cargo and rustc to nativeBuildInputs.

Here is an example of packaging a Bevy program in nix.

OpenSUSE

   sudo zypper install libudev-devel gcc-c++ alsa-lib-devel

Gentoo

   sudo emerge --ask libX11 pkgconf alsa-lib

When using an AMD Radeon GPU, you may also need to emerge amdgpu-pro-vulkan to get Bevy to find the GPU.

When using a NVIDIA GPU with the proprietary driver (eg. x11-drivers/nvidia-drivers), you may also need to emerge media-libs/vulkan-loader to get Bevy to find the GPU. NVIDIA Vulkan driver is included in nvidia-driver, but may need the loader to find the correct driver. See Gentoo Documentation for details.

Clear Linux OS

sudo swupd bundle-add devpkg-alsa-lib
sudo swupd bundle-add devpkg-libgudev