This is a modern statically-linked GNU C2X toolchain.

You have the freedom to obtain the original sources to these binaries,
and build ones just like them, by visiting:

   https://www.gnu.org/
   https://github.com/richfelker/musl-cross-make

The musl-cross-make tool also produces libraries and header files. We've
only vendored the statically-linked executable files, since Cosmopolitan
won't depend on GPL-licensed headers / runtime libraries.

We haven't made any modifications to the original software. The versions
we chose are documented in $PKG/LICENSE.txt. Here's our Musl
build config for maximum transparency:

commit 38e52db8358c043ae82b346a2e6e66bc86a53bc1
Author: Rich Felker <dalias@aerifal.cx>
Date:   Wed Dec 18 14:29:07 2019 -0500

    switch linux kernel headers to 4.19.88 by default
    
    using slim headers-only version. this change is needed to support all
    future versions of musl on 32-bit archs, since prior to 4.16 the
    kernel headers had incompatibility with userspace time_t not matching
    the kernel's old (32-bit) time_t. support for older headers will be
    dropped entirely soon.

TARGET = x86_64-linux-musl
OUTPUT = /opt/cross9
GCC_VER = 9.2.0
export LANG=en_US.UTF-8
export LC_CTYPE=en_US.UTF-8
COMMON_CONFIG += CC="/opt/cross9/bin/x86_64-linux-musl-cc -static --static -g -Os -ftree-vectorize -fvect-cost-model=unlimited -mstringop-strategy=vector_loop -save-temps -fno-ident"
COMMON_CONFIG += CXX="/opt/cross9/bin/x86_64-linux-musl-c++ -static --static -g -Os -ftree-vectorize -fvect-cost-model=unlimited -mstringop-strategy=vector_loop -save-temps -fno-ident"
COMMON_CONFIG += LD="/opt/cross9/bin/x86_64-linux-musl-ld --build-id=none"
COMMON_CONFIG += NM="/opt/cross9/bin/x86_64-linux-musl-nm"
COMMON_CONFIG += LDFLAGS="-Wl,--build-id=none"
COMMON_CONFIG += OBJCOPY="/opt/cross9/bin/x86_64-linux-musl-objcopy"
COMMON_CONFIG += --disable-nls --disable-lto
GCC_CONFIG += --enable-languages=c,c++
GCC_CONFIG += --disable-multilib
GCC_CONFIG += --with-gnu-as
GCC_CONFIG += --with-gnu-ld
GCC_CONFIG += --disable-multilib
GCC_CONFIG += --enable-sjlj-exceptions
GCC_CONFIG += --disable-threads
GCC_CONFIG += --disable-tls
COMMON_CONFIG += --with-debug-prefix-map=$(CURDIR)=

#!/bin/sh
set -e
export LC_ALL=C
export GUNZ="/bin/gzip --rsyncable -9 -c"
BASE=/opt/cross9
PKG=third_party/gcc
VERS=9.2.0

if [ ! -d $BASE ]; then
  echo error: run make install >&2
  exit 1
fi

if [ -d $BASE/$PKG ]; then
  rm -rf $BASE/$PKG
fi

mkdir -p $BASE/$PKG/bin
mkdir -p $BASE/$PKG/libexec/gcc/x86_64-linux-musl/$VERS
mkdir -p $BASE/$PKG/x86_64-linux-musl/bin

cp $BASE/bin/x86_64-linux-musl-gcov-dump              $BASE/$PKG/bin/x86_64-linux-musl-gcov-dump
cp $BASE/bin/x86_64-linux-musl-cc                     $BASE/$PKG/bin/x86_64-linux-musl-gcc
cp $BASE/bin/x86_64-linux-musl-addr2line              $BASE/$PKG/bin/x86_64-linux-musl-addr2line
cp $BASE/bin/x86_64-linux-musl-ar                     $BASE/$PKG/bin/x86_64-linux-musl-ar
cp $BASE/libexec/gcc/x86_64-linux-musl/9.2.0/cc1plus  $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1plus
cp $BASE/bin/x86_64-linux-musl-c++                    $BASE/$PKG/bin/x86_64-linux-musl-g++
cp $BASE/libexec/gcc/x86_64-linux-musl/9.2.0/collect2 $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/collect2
cp $BASE/bin/x86_64-linux-musl-gcc-nm                 $BASE/$PKG/bin/x86_64-linux-musl-gcc-nm
cp $BASE/bin/x86_64-linux-musl-c++filt                $BASE/$PKG/bin/x86_64-linux-musl-c++filt
cp $BASE/bin/x86_64-linux-musl-elfedit                $BASE/$PKG/bin/x86_64-linux-musl-elfedit
cp $BASE/bin/x86_64-linux-musl-ld                     $BASE/$PKG/x86_64-linux-musl/bin/ld.bfd
cp $BASE/bin/x86_64-linux-musl-size                   $BASE/$PKG/bin/x86_64-linux-musl-size
cp $BASE/bin/x86_64-linux-musl-strings                $BASE/$PKG/bin/x86_64-linux-musl-strings
cp $BASE/bin/x86_64-linux-musl-objcopy                $BASE/$PKG/bin/x86_64-linux-musl-objcopy
cp $BASE/bin/x86_64-linux-musl-nm                     $BASE/$PKG/bin/x86_64-linux-musl-nm
cp $BASE/libexec/gcc/x86_64-linux-musl/9.2.0/cc1      $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1
cp $BASE/bin/x86_64-linux-musl-readelf                $BASE/$PKG/bin/x86_64-linux-musl-readelf
cp $BASE/bin/x86_64-linux-musl-objdump                $BASE/$PKG/bin/x86_64-linux-musl-objdump
cp $BASE/bin/x86_64-linux-musl-gcc-ar                 $BASE/$PKG/bin/x86_64-linux-musl-gcc-ar
cp $BASE/bin/x86_64-linux-musl-gcov                   $BASE/$PKG/bin/x86_64-linux-musl-gcov
cp $BASE/bin/x86_64-linux-musl-ranlib                 $BASE/$PKG/bin/x86_64-linux-musl-ranlib
cp $BASE/bin/x86_64-linux-musl-as                     $BASE/$PKG/bin/x86_64-linux-musl-as
cp $BASE/bin/x86_64-linux-musl-gcc-ranlib             $BASE/$PKG/bin/x86_64-linux-musl-gcc-ranlib
cp $BASE/bin/x86_64-linux-musl-cpp                    $BASE/$PKG/bin/x86_64-linux-musl-cpp
cp $BASE/bin/x86_64-linux-musl-strip                  $BASE/$PKG/bin/x86_64-linux-musl-strip
cp $BASE/bin/x86_64-linux-musl-gprof                  $BASE/$PKG/bin/x86_64-linux-musl-gprof
cp $BASE/bin/x86_64-linux-musl-gcov-tool              $BASE/$PKG/bin/x86_64-linux-musl-gcov-tool

$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gcov-dump
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gcc
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-addr2line
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-ar
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1plus
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-g++
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/collect2
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gcc-nm
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-c++filt
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-elfedit
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/x86_64-linux-musl/bin/ld.bfd
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-size
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-strings
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-objcopy
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-nm
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-readelf
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-objdump
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gcc-ar
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gcov
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-ranlib
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-as
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gcc-ranlib
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-cpp
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-strip
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gprof
$BASE/bin/x86_64-linux-musl-strip $BASE/$PKG/bin/x86_64-linux-musl-gcov-tool

$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gcov-dump              >$BASE/$PKG/bin/x86_64-linux-musl-gcov-dump.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gcc                    >$BASE/$PKG/bin/x86_64-linux-musl-gcc.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-addr2line              >$BASE/$PKG/bin/x86_64-linux-musl-addr2line.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-ar                     >$BASE/$PKG/bin/x86_64-linux-musl-ar.gz
$GUNZ $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1plus  >$BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1plus.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-g++                    >$BASE/$PKG/bin/x86_64-linux-musl-g++.gz
$GUNZ $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/collect2 >$BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/collect2.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gcc-nm                 >$BASE/$PKG/bin/x86_64-linux-musl-gcc-nm.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-c++filt                >$BASE/$PKG/bin/x86_64-linux-musl-c++filt.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-elfedit                >$BASE/$PKG/bin/x86_64-linux-musl-elfedit.gz
$GUNZ $BASE/$PKG/x86_64-linux-musl/bin/ld.bfd                 >$BASE/$PKG/x86_64-linux-musl/bin/ld.bfd.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-size                   >$BASE/$PKG/bin/x86_64-linux-musl-size.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-strings                >$BASE/$PKG/bin/x86_64-linux-musl-strings.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-objcopy                >$BASE/$PKG/bin/x86_64-linux-musl-objcopy.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-nm                     >$BASE/$PKG/bin/x86_64-linux-musl-nm.gz
$GUNZ $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1      >$BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-readelf                >$BASE/$PKG/bin/x86_64-linux-musl-readelf.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-objdump                >$BASE/$PKG/bin/x86_64-linux-musl-objdump.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gcc-ar                 >$BASE/$PKG/bin/x86_64-linux-musl-gcc-ar.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gcov                   >$BASE/$PKG/bin/x86_64-linux-musl-gcov.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-ranlib                 >$BASE/$PKG/bin/x86_64-linux-musl-ranlib.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-as                     >$BASE/$PKG/bin/x86_64-linux-musl-as.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gcc-ranlib             >$BASE/$PKG/bin/x86_64-linux-musl-gcc-ranlib.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-cpp                    >$BASE/$PKG/bin/x86_64-linux-musl-cpp.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-strip                  >$BASE/$PKG/bin/x86_64-linux-musl-strip.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gprof                  >$BASE/$PKG/bin/x86_64-linux-musl-gprof.gz
$GUNZ $BASE/$PKG/bin/x86_64-linux-musl-gcov-tool              >$BASE/$PKG/bin/x86_64-linux-musl-gcov-tool.gz

rm $BASE/$PKG/bin/x86_64-linux-musl-gcov-dump
rm $BASE/$PKG/bin/x86_64-linux-musl-gcc
rm $BASE/$PKG/bin/x86_64-linux-musl-addr2line
rm $BASE/$PKG/bin/x86_64-linux-musl-ar
rm $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1plus
rm $BASE/$PKG/bin/x86_64-linux-musl-g++
rm $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/collect2
rm $BASE/$PKG/bin/x86_64-linux-musl-gcc-nm
rm $BASE/$PKG/bin/x86_64-linux-musl-c++filt
rm $BASE/$PKG/bin/x86_64-linux-musl-elfedit
rm $BASE/$PKG/x86_64-linux-musl/bin/ld.bfd
rm $BASE/$PKG/bin/x86_64-linux-musl-size
rm $BASE/$PKG/bin/x86_64-linux-musl-strings
rm $BASE/$PKG/bin/x86_64-linux-musl-objcopy
rm $BASE/$PKG/bin/x86_64-linux-musl-nm
rm $BASE/$PKG/libexec/gcc/x86_64-linux-musl/9.2.0/cc1
rm $BASE/$PKG/bin/x86_64-linux-musl-readelf
rm $BASE/$PKG/bin/x86_64-linux-musl-objdump
rm $BASE/$PKG/bin/x86_64-linux-musl-gcc-ar
rm $BASE/$PKG/bin/x86_64-linux-musl-gcov
rm $BASE/$PKG/bin/x86_64-linux-musl-ranlib
rm $BASE/$PKG/bin/x86_64-linux-musl-as
rm $BASE/$PKG/bin/x86_64-linux-musl-gcc-ranlib
rm $BASE/$PKG/bin/x86_64-linux-musl-cpp
rm $BASE/$PKG/bin/x86_64-linux-musl-strip
rm $BASE/$PKG/bin/x86_64-linux-musl-gprof
rm $BASE/$PKG/bin/x86_64-linux-musl-gcov-tool

ln -s x86_64-linux-musl-gcc               $BASE/$PKG/bin/x86_64-linux-musl-cc
ln -s x86_64-linux-musl-gcc               $BASE/$PKG/bin/x86_64-linux-musl-gcc-9.2.0
ln -s ../../bin/x86_64-linux-musl-ar      $BASE/$PKG/x86_64-linux-musl/bin/ar
ln -s x86_64-linux-musl-g++               $BASE/$PKG/bin/x86_64-linux-musl-c++
ln -s ld.bfd                              $BASE/$PKG/x86_64-linux-musl/bin/ld
ln -s ../x86_64-linux-musl/bin/ld.bfd     $BASE/$PKG/bin/x86_64-linux-musl-ld.bfd
ln -s ../x86_64-linux-musl/bin/ld.bfd     $BASE/$PKG/bin/x86_64-linux-musl-ld
ln -s ../../bin/x86_64-linux-musl-objcopy $BASE/$PKG/x86_64-linux-musl/bin/objcopy
ln -s ../../bin/x86_64-linux-musl-nm      $BASE/$PKG/x86_64-linux-musl/bin/nm
ln -s ../../bin/x86_64-linux-musl-readelf $BASE/$PKG/x86_64-linux-musl/bin/readelf
ln -s ../../bin/x86_64-linux-musl-objdump $BASE/$PKG/x86_64-linux-musl/bin/objdump
ln -s ../../bin/x86_64-linux-musl-ranlib  $BASE/$PKG/x86_64-linux-musl/bin/ranlib
ln -s ../../bin/x86_64-linux-musl-as      $BASE/$PKG/x86_64-linux-musl/bin/as
ln -s ../../bin/x86_64-linux-musl-strip   $BASE/$PKG/x86_64-linux-musl/bin/strip

{
  cat <<'EOF'
This is a modern statically-linked GNU C2X toolchain.

You have the freedom to obtain the original sources to these binaries,
and build ones just like them, by visiting:

   https://www.gnu.org/
   https://github.com/richfelker/musl-cross-make

The musl-cross-make tool also produces libraries and header files. We've
only vendored the statically-linked executable files, since Cosmopolitan
won't depend on GPL-licensed headers / runtime libraries.

We haven't made any modifications to the original software. The versions
we chose are documented in $PKG/LICENSE.txt. Here's our Musl
build config for maximum transparency:

EOF
  git show --quiet
  echo
  cat config.mak
  echo
  cat bundle.sh
} >$BASE/$PKG/README.cosmo

{
  for f in $(find . -iname \*copying\* -or -iname \*license\* | sort); do
    printf '\n'
    printf '%s\n' "$f"
    printf '========================================================================\n'
    cat "$f"
  done
} >$BASE/$PKG/LICENSE.txt
