2018-11-08 01:51:56 +00:00
#!/usr/bin/env bash
2020-04-24 17:34:25 +00:00
set -e
2018-11-08 01:51:56 +00:00
usage( )
{
2020-03-31 13:04:58 +00:00
echo " Usage: $0 [BuildArch] [CodeName] [lldbx.y] [--skipunmount] --rootfsdir <directory>] "
2018-11-08 01:51:56 +00:00
echo "BuildArch can be: arm(default), armel, arm64, x86"
2021-09-14 13:05:57 +00:00
echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine, alpine3.13 or alpine3.14. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen."
2022-01-26 18:30:11 +00:00
echo " for FreeBSD can be: freebsd12, freebsd13"
2020-06-11 17:47:07 +00:00
echo " for illumos can be: illumos."
2021-08-06 20:18:02 +00:00
echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD"
2018-11-08 01:51:56 +00:00
echo "--skipunmount - optional, will skip the unmount of rootfs folder."
2020-06-11 17:47:07 +00:00
echo "--use-mirror - optional, use mirror URL to fetch resources, when available."
2018-11-08 01:51:56 +00:00
exit 1
}
2020-03-31 13:04:58 +00:00
__CodeName = xenial
2018-11-08 01:51:56 +00:00
__CrossDir = $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd )
__InitialDir = $PWD
__BuildArch = arm
2020-04-24 17:34:25 +00:00
__AlpineArch = armv7
__QEMUArch = arm
2018-11-08 01:51:56 +00:00
__UbuntuArch = armhf
__UbuntuRepo = "http://ports.ubuntu.com/"
2019-05-08 12:25:49 +00:00
__LLDB_Package = "liblldb-3.9-dev"
2018-11-08 01:51:56 +00:00
__SkipUnmount = 0
# base development support
__UbuntuPackages = "build-essential"
__AlpinePackages = "alpine-base"
__AlpinePackages += " build-base"
__AlpinePackages += " linux-headers"
2021-09-14 13:05:57 +00:00
__AlpinePackages += " lldb-dev"
__AlpinePackages += " python3"
__AlpinePackages += " libedit"
2018-11-08 01:51:56 +00:00
# symlinks fixer
__UbuntuPackages += " symlinks"
# CoreCLR and CoreFX dependencies
__UbuntuPackages += " libicu-dev"
__UbuntuPackages += " liblttng-ust-dev"
__UbuntuPackages += " libunwind8-dev"
__AlpinePackages += " gettext-dev"
__AlpinePackages += " icu-dev"
__AlpinePackages += " libunwind-dev"
__AlpinePackages += " lttng-ust-dev"
# CoreFX dependencies
__UbuntuPackages += " libcurl4-openssl-dev"
__UbuntuPackages += " libkrb5-dev"
__UbuntuPackages += " libssl-dev"
__UbuntuPackages += " zlib1g-dev"
__AlpinePackages += " curl-dev"
__AlpinePackages += " krb5-dev"
__AlpinePackages += " openssl-dev"
__AlpinePackages += " zlib-dev"
2022-01-26 18:30:11 +00:00
__FreeBSDBase = "12.3-RELEASE"
__FreeBSDPkg = "1.17.0"
2021-08-06 20:18:02 +00:00
__FreeBSDABI = "12"
2020-03-31 13:04:58 +00:00
__FreeBSDPackages = "libunwind"
__FreeBSDPackages += " icu"
__FreeBSDPackages += " libinotify"
2022-01-26 18:30:11 +00:00
__FreeBSDPackages += " openssl"
2020-03-31 13:04:58 +00:00
__FreeBSDPackages += " krb5"
2021-08-06 20:18:02 +00:00
__FreeBSDPackages += " terminfo-db"
2020-03-31 13:04:58 +00:00
2020-06-11 17:47:07 +00:00
__IllumosPackages = "icu-64.2nb2"
__IllumosPackages += " mit-krb5-1.16.2nb4"
__IllumosPackages += " openssl-1.1.1e"
__IllumosPackages += " zlib-1.2.11"
2021-05-05 13:06:29 +00:00
# ML.NET dependencies
__UbuntuPackages += " libomp5"
__UbuntuPackages += " libomp-dev"
2020-06-11 17:47:07 +00:00
__UseMirror = 0
2018-11-08 01:51:56 +00:00
__UnprocessedBuildArgs =
2019-05-08 12:25:49 +00:00
while :; do
if [ $# -le 0 ] ; then
break
fi
2021-01-09 13:53:15 +00:00
lowerI = " $( echo $1 | tr "[:upper:]" "[:lower:]" ) "
2018-11-08 01:51:56 +00:00
case $lowerI in
-?| -h| --help)
usage
exit 1
; ;
arm)
__BuildArch = arm
__UbuntuArch = armhf
2020-04-24 17:34:25 +00:00
__AlpineArch = armv7
2018-11-08 01:51:56 +00:00
__QEMUArch = arm
; ;
2021-12-09 14:33:51 +00:00
armv6)
__BuildArch = armv6
__UbuntuArch = armhf
__QEMUArch = arm
__UbuntuRepo = "http://raspbian.raspberrypi.org/raspbian/"
__CodeName = buster
__LLDB_Package = "liblldb-6.0-dev"
__Keyring = "/usr/share/keyrings/raspbian-archive-keyring.gpg"
; ;
2018-11-08 01:51:56 +00:00
arm64)
__BuildArch = arm64
__UbuntuArch = arm64
__AlpineArch = aarch64
__QEMUArch = aarch64
; ;
armel)
__BuildArch = armel
__UbuntuArch = armel
__UbuntuRepo = "http://ftp.debian.org/debian/"
2020-03-31 13:04:58 +00:00
__CodeName = jessie
2018-11-08 01:51:56 +00:00
; ;
2022-02-11 16:15:13 +00:00
ppc64le)
__BuildArch = ppc64le
__UbuntuArch = ppc64el
__UbuntuRepo = "http://ports.ubuntu.com/ubuntu-ports/"
__UbuntuPackages = $( echo ${ __UbuntuPackages } | sed 's/ libunwind8-dev//' )
__UbuntuPackages = $( echo ${ __UbuntuPackages } | sed 's/ libomp-dev//' )
__UbuntuPackages = $( echo ${ __UbuntuPackages } | sed 's/ libomp5//' )
unset __LLDB_Package
; ;
2020-10-29 12:58:51 +00:00
s390x)
__BuildArch = s390x
__UbuntuArch = s390x
__UbuntuRepo = "http://ports.ubuntu.com/ubuntu-ports/"
__UbuntuPackages = $( echo ${ __UbuntuPackages } | sed 's/ libunwind8-dev//' )
2021-07-14 16:48:29 +00:00
__UbuntuPackages = $( echo ${ __UbuntuPackages } | sed 's/ libomp-dev//' )
__UbuntuPackages = $( echo ${ __UbuntuPackages } | sed 's/ libomp5//' )
2020-10-29 12:58:51 +00:00
unset __LLDB_Package
; ;
2018-11-08 01:51:56 +00:00
x86)
__BuildArch = x86
__UbuntuArch = i386
__UbuntuRepo = "http://archive.ubuntu.com/ubuntu/"
; ;
lldb3.6)
__LLDB_Package = "lldb-3.6-dev"
; ;
lldb3.8)
__LLDB_Package = "lldb-3.8-dev"
; ;
lldb3.9)
__LLDB_Package = "liblldb-3.9-dev"
; ;
lldb4.0)
__LLDB_Package = "liblldb-4.0-dev"
; ;
2019-05-08 12:25:49 +00:00
lldb5.0)
__LLDB_Package = "liblldb-5.0-dev"
; ;
lldb6.0)
__LLDB_Package = "liblldb-6.0-dev"
; ;
2018-11-08 01:51:56 +00:00
no-lldb)
unset __LLDB_Package
; ;
2019-05-15 12:11:39 +00:00
xenial) # Ubuntu 16.04
2020-03-31 13:04:58 +00:00
if [ " $__CodeName " != "jessie" ] ; then
__CodeName = xenial
2018-11-08 01:51:56 +00:00
fi
; ;
2019-05-15 12:11:39 +00:00
zesty) # Ubuntu 17.04
2020-03-31 13:04:58 +00:00
if [ " $__CodeName " != "jessie" ] ; then
__CodeName = zesty
2018-11-08 01:51:56 +00:00
fi
; ;
2019-05-08 12:25:49 +00:00
bionic) # Ubuntu 18.04
2020-03-31 13:04:58 +00:00
if [ " $__CodeName " != "jessie" ] ; then
__CodeName = bionic
2018-11-08 01:51:56 +00:00
fi
; ;
2019-05-08 12:25:49 +00:00
jessie) # Debian 8
2020-03-31 13:04:58 +00:00
__CodeName = jessie
2018-11-08 01:51:56 +00:00
__UbuntuRepo = "http://ftp.debian.org/debian/"
; ;
2019-05-15 12:11:39 +00:00
stretch) # Debian 9
2020-03-31 13:04:58 +00:00
__CodeName = stretch
2019-05-15 12:11:39 +00:00
__UbuntuRepo = "http://ftp.debian.org/debian/"
__LLDB_Package = "liblldb-6.0-dev"
; ;
buster) # Debian 10
2020-03-31 13:04:58 +00:00
__CodeName = buster
2019-05-15 12:11:39 +00:00
__UbuntuRepo = "http://ftp.debian.org/debian/"
__LLDB_Package = "liblldb-6.0-dev"
; ;
2018-11-08 01:51:56 +00:00
tizen)
2021-12-24 14:09:22 +00:00
if [ " $__BuildArch " != "arm" ] && [ " $__BuildArch " != "armel" ] && [ " $__BuildArch " != "arm64" ] ; then
echo "Tizen is available only for arm, armel and arm64."
2018-11-08 01:51:56 +00:00
usage;
exit 1;
fi
2020-03-31 13:04:58 +00:00
__CodeName =
2018-11-08 01:51:56 +00:00
__UbuntuRepo =
__Tizen = tizen
; ;
2021-09-14 13:05:57 +00:00
alpine| alpine3.13)
2020-03-31 13:04:58 +00:00
__CodeName = alpine
2018-11-08 01:51:56 +00:00
__UbuntuRepo =
2021-09-14 13:05:57 +00:00
__AlpineVersion = 3.13
__AlpinePackages += " llvm10-libs"
2021-02-26 13:51:15 +00:00
; ;
2021-09-14 13:05:57 +00:00
alpine3.14)
2021-02-26 13:51:15 +00:00
__CodeName = alpine
__UbuntuRepo =
2021-09-14 13:05:57 +00:00
__AlpineVersion = 3.14
__AlpinePackages += " llvm11-libs"
2018-11-08 01:51:56 +00:00
; ;
2020-03-31 13:04:58 +00:00
freebsd12)
__CodeName = freebsd
__BuildArch = x64
__SkipUnmount = 1
; ;
2021-08-06 20:18:02 +00:00
freebsd13)
__CodeName = freebsd
__FreeBSDBase = "13.0-RELEASE"
__FreeBSDABI = "13"
__BuildArch = x64
__SkipUnmount = 1
2021-08-07 13:00:09 +00:00
; ;
2020-06-11 17:47:07 +00:00
illumos)
__CodeName = illumos
__BuildArch = x64
__SkipUnmount = 1
; ;
2018-11-08 01:51:56 +00:00
--skipunmount)
__SkipUnmount = 1
; ;
2019-05-08 12:25:49 +00:00
--rootfsdir| -rootfsdir)
shift
__RootfsDir = $1
; ;
2020-06-11 17:47:07 +00:00
--use-mirror)
__UseMirror = 1
; ;
2018-11-08 01:51:56 +00:00
*)
2019-05-08 12:25:49 +00:00
__UnprocessedBuildArgs = " $__UnprocessedBuildArgs $1 "
2018-11-08 01:51:56 +00:00
; ;
esac
2019-05-08 12:25:49 +00:00
shift
2018-11-08 01:51:56 +00:00
done
2021-12-09 14:33:51 +00:00
if [ -e " $__Keyring " ] ; then
__Keyring = " --keyring= $__Keyring "
else
__Keyring = ""
fi
2018-11-08 01:51:56 +00:00
if [ " $__BuildArch " = = "armel" ] ; then
__LLDB_Package = "lldb-3.5-dev"
fi
__UbuntuPackages += " ${ __LLDB_Package :- } "
2019-05-08 12:25:49 +00:00
if [ -z " $__RootfsDir " ] && [ ! -z " $ROOTFS_DIR " ] ; then
2018-11-08 01:51:56 +00:00
__RootfsDir = $ROOTFS_DIR
fi
2019-05-08 12:25:49 +00:00
if [ -z " $__RootfsDir " ] ; then
2019-06-05 12:10:31 +00:00
__RootfsDir = " $__CrossDir /../../../.tools/rootfs/ $__BuildArch "
2019-05-08 12:25:49 +00:00
fi
2018-11-08 01:51:56 +00:00
if [ -d " $__RootfsDir " ] ; then
if [ $__SkipUnmount = = 0 ] ; then
2020-04-24 17:34:25 +00:00
umount $__RootfsDir /* || true
2018-11-08 01:51:56 +00:00
fi
rm -rf $__RootfsDir
fi
2020-06-11 17:47:07 +00:00
mkdir -p $__RootfsDir
__RootfsDir = " $( cd " $__RootfsDir " && pwd ) "
2020-03-31 13:04:58 +00:00
if [ [ " $__CodeName " = = "alpine" ] ] ; then
2018-11-08 01:51:56 +00:00
__ApkToolsVersion = 2.9.1
__ApkToolsDir = $( mktemp -d)
wget https://github.com/alpinelinux/apk-tools/releases/download/v$__ApkToolsVersion /apk-tools-$__ApkToolsVersion -x86_64-linux.tar.gz -P $__ApkToolsDir
tar -xf $__ApkToolsDir /apk-tools-$__ApkToolsVersion -x86_64-linux.tar.gz -C $__ApkToolsDir
mkdir -p $__RootfsDir /usr/bin
cp -v /usr/bin/qemu-$__QEMUArch -static $__RootfsDir /usr/bin
2020-01-22 13:31:03 +00:00
2018-11-08 01:51:56 +00:00
$__ApkToolsDir /apk-tools-$__ApkToolsVersion /apk \
-X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion /main \
-X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion /community \
-U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \
add $__AlpinePackages
2020-01-22 13:31:03 +00:00
2018-11-08 01:51:56 +00:00
rm -r $__ApkToolsDir
2020-03-31 13:04:58 +00:00
elif [ [ " $__CodeName " = = "freebsd" ] ] ; then
mkdir -p $__RootfsDir /usr/local/etc
2021-08-06 20:18:02 +00:00
JOBS = " $( getconf _NPROCESSORS_ONLN) "
2020-03-31 13:04:58 +00:00
wget -O - https://download.freebsd.org/ftp/releases/amd64/${ __FreeBSDBase } /base.txz | tar -C $__RootfsDir -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version
2021-08-06 20:18:02 +00:00
echo " ABI = \"FreeBSD: ${ __FreeBSDABI } :amd64\"; FINGERPRINTS = \" ${ __RootfsDir } /usr/share/keys\"; REPOS_DIR = [\" ${ __RootfsDir } /etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO; " > ${ __RootfsDir } /usr/local/etc/pkg.conf
2020-03-31 13:04:58 +00:00
echo "FreeBSD: { url: " pkg+http://pkg.FreeBSD.org/\$ { ABI} /quarterly" , mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \" ${ __RootfsDir } /usr/share/keys/pkg\", enabled: yes } " > ${ __RootfsDir } /etc/pkg/FreeBSD.conf
mkdir -p $__RootfsDir /tmp
# get and build package manager
wget -O - https://github.com/freebsd/pkg/archive/${ __FreeBSDPkg } .tar.gz | tar -C $__RootfsDir /tmp -zxf -
cd $__RootfsDir /tmp/pkg-${ __FreeBSDPkg }
2020-04-24 17:34:25 +00:00
# needed for install to succeed
mkdir -p $__RootfsDir /host/etc
2021-08-06 20:18:02 +00:00
./autogen.sh && ./configure --prefix= $__RootfsDir /host && make -j " $JOBS " && make install
2020-03-31 13:04:58 +00:00
rm -rf $__RootfsDir /tmp/pkg-${ __FreeBSDPkg }
# install packages we need.
2020-04-30 12:44:30 +00:00
INSTALL_AS_USER = $( whoami) $__RootfsDir /host/sbin/pkg -r $__RootfsDir -C $__RootfsDir /usr/local/etc/pkg.conf update
INSTALL_AS_USER = $( whoami) $__RootfsDir /host/sbin/pkg -r $__RootfsDir -C $__RootfsDir /usr/local/etc/pkg.conf install --yes $__FreeBSDPackages
2020-06-11 17:47:07 +00:00
elif [ [ " $__CodeName " = = "illumos" ] ] ; then
mkdir " $__RootfsDir /tmp "
pushd " $__RootfsDir /tmp "
JOBS = " $( getconf _NPROCESSORS_ONLN) "
echo "Downloading sysroot."
wget -O - https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C " $__RootfsDir " -xzf -
echo "Building binutils. Please wait.."
wget -O - https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.bz2 | tar -xjf -
mkdir build-binutils && cd build-binutils
../binutils-2.33.1/configure --prefix= " $__RootfsDir " --target= "x86_64-sun-solaris2.10" --program-prefix= "x86_64-illumos-" --with-sysroot= " $__RootfsDir "
make -j " $JOBS " && make install && cd ..
echo "Building gcc. Please wait.."
wget -O - https://ftp.gnu.org/gnu/gcc/gcc-8.4.0/gcc-8.4.0.tar.xz | tar -xJf -
CFLAGS = "-fPIC"
CXXFLAGS = "-fPIC"
CXXFLAGS_FOR_TARGET = "-fPIC"
CFLAGS_FOR_TARGET = "-fPIC"
export CFLAGS CXXFLAGS CXXFLAGS_FOR_TARGET CFLAGS_FOR_TARGET
mkdir build-gcc && cd build-gcc
../gcc-8.4.0/configure --prefix= " $__RootfsDir " --target= "x86_64-sun-solaris2.10" --program-prefix= "x86_64-illumos-" --with-sysroot= " $__RootfsDir " --with-gnu-as \
--with-gnu-ld --disable-nls --disable-libgomp --disable-libquadmath --disable-libssp --disable-libvtv --disable-libcilkrts --disable-libada --disable-libsanitizer \
--disable-libquadmath-support --disable-shared --enable-tls
make -j " $JOBS " && make install && cd ..
BaseUrl = https://pkgsrc.joyent.com
if [ [ " $__UseMirror " = = 1 ] ] ; then
BaseUrl = http://pkgsrc.smartos.skylime.net
fi
BaseUrl = " $BaseUrl " /packages/SmartOS/2020Q1/x86_64/All
echo "Downloading dependencies."
read -ra array <<< " $__IllumosPackages "
for package in " ${ array [@] } " ; do
echo " Installing $package ... "
wget " $BaseUrl " /" $package " .tgz
ar -x " $package " .tgz
tar --skip-old-files -xzf " $package " .tmp.tgz -C " $__RootfsDir " 2>/dev/null
done
echo "Cleaning up temporary files."
popd
rm -rf " $__RootfsDir " /{ tmp,+*}
mkdir -p " $__RootfsDir " /usr/include/net
mkdir -p " $__RootfsDir " /usr/include/netpacket
wget -P " $__RootfsDir " /usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/bpf.h
wget -P " $__RootfsDir " /usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h
wget -P " $__RootfsDir " /usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h
wget -P " $__RootfsDir " /usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h
2020-03-31 13:04:58 +00:00
elif [ [ -n $__CodeName ] ] ; then
2021-12-09 14:33:51 +00:00
qemu-debootstrap $__Keyring --arch $__UbuntuArch $__CodeName $__RootfsDir $__UbuntuRepo
2020-03-31 13:04:58 +00:00
cp $__CrossDir /$__BuildArch /sources.list.$__CodeName $__RootfsDir /etc/apt/sources.list
2018-11-08 01:51:56 +00:00
chroot $__RootfsDir apt-get update
chroot $__RootfsDir apt-get -f -y install
chroot $__RootfsDir apt-get -y install $__UbuntuPackages
chroot $__RootfsDir symlinks -cr /usr
2020-11-20 17:08:04 +00:00
chroot $__RootfsDir apt-get clean
2018-11-08 01:51:56 +00:00
if [ $__SkipUnmount = = 0 ] ; then
2020-04-24 17:34:25 +00:00
umount $__RootfsDir /* || true
2018-11-08 01:51:56 +00:00
fi
2020-11-20 17:08:04 +00:00
if [ [ " $__BuildArch " = = "armel" && " $__CodeName " = = "jessie" ] ] ; then
pushd $__RootfsDir
patch -p1 < $__CrossDir /$__BuildArch /armel.jessie.patch
popd
fi
2020-06-11 17:47:07 +00:00
elif [ [ " $__Tizen " = = "tizen" ] ] ; then
2018-11-08 01:51:56 +00:00
ROOTFS_DIR = $__RootfsDir $__CrossDir /$__BuildArch /tizen-build-rootfs.sh
else
echo "Unsupported target platform."
usage;
exit 1
fi