mussel icon indicating copy to clipboard operation
mussel copied to clipboard

The shortest and fastest script to build working cross compilers targeting musl libc

mussel

mussel is the shortest and fastest script available today to build working cross compilers that target musl libc.

Features

  1. Up-to-date: uses latest available upstream sources for packages
  2. Fast: probably the fastest script around to build a cross compiler targeting musl libc, and runs fully under dash
  3. Short: has the least amount of steps (see below) required to build a cross compiler targeting musl libc (even less than musl-cross-make)
  4. Small: all installation steps use install-strip where applicable
  5. Simple: easy to read, modify and extend
  6. POSIX Compliant: the entire script is POSIX compliant
  7. Well Documented: the script comes with a DOCUMENTATION.md file that includes state of the art information explaining what is being done and why

Requirements:

To confirm you have all required packages, you can execute ./check.sh.

For Fedora:

sudo dnf install bash bc binutils bison bison-devel bzip2 ccache coreutils diffutils findutils gawk gcc gcc-c++ git glibc grep gzip libarchive lzip libzstd-devel m4 make perl rsync sed texinfo xz zstd

Usage

Building a Cross Compiler

./mussel.sh (arch) (flags)

(arch): See Supported Architectures below

(flags):

  h | -h | --help                  Display help message
  k | -k | --enable-pkg-config     Enable optional pkg-config support
  l | -l | --enable-linux-headers  Enable optional Linux Headers support
  o | -o | --enable-openmp         Enable optional OpenMP support
  p | -p | --parallel              Use all available cores on the host system
  x | -x | --disable-cxx           Disable optional C++ support

Other Commands

./mussel.sh (command)

(command):

  c | -c | --clean                 Clean mussel's build environment

Sources will be preserved.

Supported Architectures

  • aarch64
  • armv6zk (Raspberry Pi 1 Models A, B, B+, the Compute Module, and the Raspberry Pi Zero)
  • armv7
  • i586
  • i686
  • microblaze
  • microblazeel
  • mips64
  • mips64el
  • mipsisa64r6
  • mipsisa64r6el
  • or1k
  • powerpc
  • powerpc64
  • powerpc64le
  • riscv64
  • s390x
  • x86-64

Packages

  1. binutils: 2.38
  2. gcc: 12.1.0
  3. gmp: 6.2.1
  4. isl: 0.24
  5. linux: 5.17.7 (Optional Linux Headers Support) (Disabled by default)
  6. mpc: 1.2.1
  7. mpfr: 4.1.0
  8. musl: 1.2.3
  9. pkgconf: 1.8.0 (Optional pkg-config Support) (Disabled by default)

How Is mussel Doing It?

  1. Install musl headers
  2. Configure, build and install cross binutils
  3. Configure, build and install cross gcc (with libgcc-static)
  4. Configure, build and install musl
  5. Build, and install libgcc-shared

Optional Steps

  • Build and install libstdc++-v3 (Optional C++ Support) (Enabled by default)
  • Build and install libgomp (Optional OpenMP Support) (Disabled by default)
  • Install linux-headers (Optional Linux Headers Support) (Disabled by default)
  • Configure, build and install pkgconf (Optional pkg-config Support) (Disabled by default)

Using mussel With Host's pkg-config or pkgconf

The reason we included pkgconf with mussel as an optional step is because we can easily configure the host's pkg-config or pkgconf to work with mussel without having to build our own version of pkg-config or pkgconf.

Here are the five magical environment variables that we need to set to configure the host's pkg-config or pkgconf to work with mussel:

export PKG_CONFIG_PATH=$MSYSROOT/usr/lib/pkgconfig:$MSYSROOT/usr/share/pkgconfig
export PKG_CONFIG_LIBDIR=$MSYSROOT/usr/lib/pkgconfig:$MSYSROOT/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=$MSYSROOT

export PKG_CONFIG_SYSTEM_INCLUDE_PATH=$MSYSROOT/usr/include
export PKG_CONFIG_SYSTEM_LIBRARY_PATH=$MSYSROOT/usr/lib

The last two I believe are pkgconf specific but setting them won't do any harm.

Using mussel With Host's meson

mussel now provides cross-compilation configuration files for meson that support all listed architectures, and a wrapper around host's meson (mussel-meson) in an effort to make dealing with meson a bit easier.

Credits and Inspiration

mussel is possible thanks to the awesome work done by Aurelian, Rich Felker, qword, The Managram Project, glaucus (where it's actually implemented) and musl-cross-make.

Author

Firas Khalil Khana (firasuke) <[email protected]>

Contributors

License

mussel is licensed under the Internet Systems Consortium (ISC) license.

Dedication

mussel is dedicated to all those that believe setting up a cross compiler targeting musl libc is a complicated process.

Community

Mirrors