mirror of
https://github.com/richfelker/musl-cross-make.git
synced 2025-04-19 23:44:58 +02:00
261 lines
8.0 KiB
Bash
Executable File
261 lines
8.0 KiB
Bash
Executable File
#!/bin/sh -e
|
|
|
|
#===============================================================
|
|
# Filename : macsimum
|
|
# Purpose : Builds Mac-to-Linux cross-compiler toolchains.
|
|
# Authors : Zach van Rijn <me@zv.io>
|
|
# License : MIT
|
|
# Revision : 20200303
|
|
#===============================================================
|
|
|
|
#---------------------------------------------------------------
|
|
# README
|
|
#
|
|
# overview
|
|
# --------
|
|
#
|
|
# This script builds "musl-cross-make" cross-compiler toolchains
|
|
# that are hosted on macOS and target Linux. For example, your
|
|
# Macintosh machine can use up-to-date versions of GCC to build
|
|
# code (C, C++, Fortran) for your MIPS router. The libc used is
|
|
# called 'musl': https://www.musl-libc.org/faq.html
|
|
#
|
|
# Others have tried and failed to deliver what you're able to do
|
|
# with this tiny script.
|
|
#
|
|
# What does this look like? Modern GCC that does:
|
|
#
|
|
# * macOS --> ARM, Motorola 68000, MIPS, OpenRISC, PowerPC,
|
|
# RISC-V, S/390, SuperH, x86-based, more?
|
|
#
|
|
# The goal, of course, is to achieve parity with musl.cc's Linux
|
|
# offerings. A link to pre-built macOS binaries is now public,
|
|
# and this is the script to reproduce them. https://mac.musl.cc/
|
|
#
|
|
#
|
|
# requirements
|
|
# ------------
|
|
#
|
|
# Basically, you need XCode Command Line Tools. I don't know any
|
|
# specific version requirements, but if you encounter problems I
|
|
# would appreciate a heads up.
|
|
#
|
|
# This document may be useful: https://git.zv.io/snippets/34/raw
|
|
#
|
|
# You'll also need a working internet connection.
|
|
#
|
|
# A previous version of this script relied on Homebrew for some
|
|
# of the utilities that we're using. This, contrary to intent,
|
|
# created a Homebrew dependency. No longer! Build products are
|
|
# now fully portable (across compatible macOS / OS X versions).
|
|
|
|
|
|
#---------------------------------------------------------------
|
|
# Dependency versions (for bootstrap compiler and tooling)
|
|
|
|
V_SED=4.7 ;
|
|
V_PAT=2.7.6 ;
|
|
V_GMP=6.1.2 ;
|
|
V_MPF=4.0.2 ;
|
|
V_MPC=1.1.0 ;
|
|
V_ISL=0.21 ;
|
|
V_GCC=9.2.0 ;
|
|
V_BUT=2.34 ;
|
|
|
|
V_GM4=1.4.18;
|
|
V_BIS=3.4.2 ;
|
|
V_FLX=2.6.4 ;
|
|
V_CUT=8.31 ;
|
|
|
|
|
|
#---------------------------------------------------------------
|
|
# Production compiler configuration data (or use heredoc)
|
|
|
|
tool=musl-cross-make; # musl-cross-make repository
|
|
conf=$(curl -s https://conf.musl.cc/mac_20200229_9-2-1.txt);
|
|
|
|
|
|
#---------------------------------------------------------------
|
|
# Dependency mirrors
|
|
|
|
M_GNU=https://ftp.gnu.org/gnu;
|
|
M_ISL=http://isl.gforge.inria.fr;
|
|
|
|
M_FLX=https://github.com/westes/flex/releases/download;
|
|
|
|
|
|
#---------------------------------------------------------------
|
|
# Build configuration
|
|
|
|
##
|
|
# It is possible to build all library and utility dependencies
|
|
# for the building of musl-cross-make production toolchains on a
|
|
# RAM disk. This may improve performance on systems with slow
|
|
# disks, and requires approximately 3GB of space. 4GB is safe:
|
|
#
|
|
# $ diskutil erasevolume HFS+ "RAMDISK" \
|
|
# `hdiutil attach -nomount ram://$((2048 * 1024 * 4))`
|
|
#
|
|
# The '4' in the above example represents gigabytes.
|
|
|
|
rdsk=/Volumes/RAMDISK; # dependency build prefix
|
|
|
|
##
|
|
# When the production toolchains are built, a significant bit of
|
|
# disk space is required. Do not attempt to build them in RAM if
|
|
# you are not on a server server with several dozen gigabytes of
|
|
# RAM and the assurance that your system won't crash :)
|
|
|
|
bdsk=/tmp; # production build prefix
|
|
|
|
##
|
|
# This directory will contain dependency build trees. It can be
|
|
# deleted after the toolchains are built.
|
|
|
|
bdir=${rdsk}/tmp; # scratch directory location
|
|
|
|
##
|
|
# Within each dependency build tree, we want to perform an out-
|
|
# of-tree build. This is the (arbitrary) name of that directory.
|
|
|
|
tdir=x; # out-of-tree directory name
|
|
|
|
##
|
|
# This directory will contain the dependency libraries and tools
|
|
# and can also be deleted after the toolchains are built, but it
|
|
# may be useful to maintain this directory for future builds.
|
|
|
|
sdir=${rdsk}/sys; # system installation directory
|
|
|
|
|
|
#---------------------------------------------------------------
|
|
# Supporting routines
|
|
|
|
# prep <URL> <TARFLAG> <STRIP> [<CONFIG> ...]
|
|
prep ()
|
|
{
|
|
_tar="${1}"; shift;
|
|
_str="${1}"; shift;
|
|
_url="${1}"; shift;
|
|
_cnf="${@}";
|
|
|
|
base=$(basename ${_url}); # name of file being downloaded
|
|
name=${base%-*}; # name of project w/o version
|
|
|
|
[ ! -f "${sdir}/._${base}" ] || return 0;
|
|
|
|
rm -fr "${bdir}/${name}";
|
|
mkdir -p "${bdir}/${name}/${tdir}";
|
|
|
|
cd "${bdir}/${name}";
|
|
curl -sL ${_url} \
|
|
| tar --strip-components=${_str} -x${_tar}f -;
|
|
|
|
cd "${tdir}";
|
|
|
|
( # subshell for isolation
|
|
export PATH="${sdir}/bin:$PATH";
|
|
|
|
export CPPFLAGS="-I${sdir}/include";
|
|
export CFLAGS="";
|
|
export CXXFLAGS="";
|
|
export LDFLAGS="-L${sdir}/lib";
|
|
|
|
../configure --prefix="${sdir}" ${_cnf};
|
|
make && make install;
|
|
|
|
touch "${sdir}/._${base}";
|
|
)
|
|
}
|
|
|
|
# (no args) Builds production toolchains for mac.musl.cc
|
|
musl ()
|
|
{
|
|
cd "${bdsk}";
|
|
|
|
if [ ! -d "${tool}" ]; then
|
|
git clone https://git.zv.io/toolchains/${tool}.git;
|
|
fi
|
|
|
|
cd ${tool};
|
|
|
|
printf > config.mak "%s\n" "${conf}";
|
|
|
|
PATH="${sdir}/bin:$PATH" ./scripts/buildmac;
|
|
}
|
|
|
|
|
|
#---------------------------------------------------------------
|
|
# Stage 1: Bootstrap compiler
|
|
|
|
prep j 1 ${M_GNU}/sed/sed-${V_SED}.tar.xz \
|
|
;
|
|
|
|
prep j 1 ${M_GNU}/patch/patch-${V_PAT}.tar.xz \
|
|
;
|
|
|
|
prep j 1 ${M_GNU}/m4/m4-${V_GM4}.tar.xz \
|
|
;
|
|
|
|
prep j 1 ${M_GNU}/bison/bison-${V_BIS}.tar.xz \
|
|
;
|
|
|
|
prep z 1 ${M_FLX}/v${V_FLX}/flex-${V_FLX}.tar.gz \
|
|
--disable-shared \
|
|
--enable-static \
|
|
;
|
|
|
|
prep j 1 ${M_GNU}/gmp/gmp-${V_GMP}.tar.xz \
|
|
--disable-shared \
|
|
--enable-static \
|
|
--enable-cxx \
|
|
;
|
|
|
|
prep j 1 ${M_GNU}/mpfr/mpfr-${V_MPF}.tar.xz \
|
|
--disable-shared \
|
|
--enable-static \
|
|
--with-gmp="${sdir}" \
|
|
;
|
|
|
|
prep z 1 ${M_GNU}/mpc/mpc-${V_MPC}.tar.gz \
|
|
--disable-shared \
|
|
--enable-static \
|
|
--with-gmp="${sdir}" \
|
|
;
|
|
|
|
prep j 1 ${M_ISL}/isl-${V_ISL}.tar.xz \
|
|
--disable-shared \
|
|
--enable-static \
|
|
--with-gmp-prefix="${sdir}" \
|
|
;
|
|
|
|
prep j 1 ${M_GNU}/coreutils/coreutils-${V_CUT}.tar.xz \
|
|
--disable-shared \
|
|
--enable-static \
|
|
FORCE_UNSAFE_CONFIGURE=1 \
|
|
;
|
|
|
|
prep j 1 ${M_GNU}/gcc/gcc-${V_GCC}/gcc-${V_GCC}.tar.xz \
|
|
--enable-languages=c,c++ \
|
|
--with-gmp="${sdir}" \
|
|
--with-mpfr="${sdir}" \
|
|
--with-mpc="${sdir}" \
|
|
--with-isl="${sdir}" \
|
|
--enable-multilib \
|
|
--disable-bootstrap \
|
|
;
|
|
|
|
if false; then
|
|
prep j 1 ${M_GNU}/binutils/binutils-${V_BUT}.tar.xz \
|
|
--disable-shared \
|
|
--enable-static \
|
|
--disable-multilib \
|
|
;
|
|
fi
|
|
|
|
|
|
#---------------------------------------------------------------
|
|
# Stage 2: Production toolchains
|
|
|
|
musl;
|