113 lines
3.3 KiB
Bash
113 lines
3.3 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
#===----------------------------------------------------------------------===##
|
||
|
#
|
||
|
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
# See https://llvm.org/LICENSE.txt for license information.
|
||
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
#
|
||
|
#===----------------------------------------------------------------------===##
|
||
|
|
||
|
#
|
||
|
# This script builds picolibc (https://github.com/picolibc/picolibc) from
|
||
|
# source to facilitate building libc++ against it.
|
||
|
#
|
||
|
|
||
|
set -e
|
||
|
|
||
|
PROGNAME="$(basename "${0}")"
|
||
|
|
||
|
function error() { printf "error: %s\n" "$*" >&2; exit 1; }
|
||
|
|
||
|
function usage() {
|
||
|
cat <<EOF
|
||
|
Usage:
|
||
|
${PROGNAME} [options]
|
||
|
|
||
|
[-h|--help] Display this help and exit.
|
||
|
|
||
|
--build-dir <DIR> Path to the directory to use for building.
|
||
|
|
||
|
--install-dir <DIR> Path to the directory to install the library to.
|
||
|
EOF
|
||
|
}
|
||
|
|
||
|
while [[ $# -gt 0 ]]; do
|
||
|
case ${1} in
|
||
|
-h|--help)
|
||
|
usage
|
||
|
exit 0
|
||
|
;;
|
||
|
--build-dir)
|
||
|
build_dir="${2}"
|
||
|
shift; shift
|
||
|
;;
|
||
|
--install-dir)
|
||
|
install_dir="${2}"
|
||
|
shift; shift
|
||
|
;;
|
||
|
--target)
|
||
|
target="${2}"
|
||
|
shift; shift
|
||
|
;;
|
||
|
*)
|
||
|
error "Unknown argument '${1}'"
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
for arg in build_dir install_dir target; do
|
||
|
if [ -z ${!arg+x} ]; then
|
||
|
error "Missing required argument '--${arg//_/-}'"
|
||
|
elif [ "${!arg}" == "" ]; then
|
||
|
error "Argument to --${arg//_/-} must not be empty"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
|
||
|
echo "--- Downloading picolibc"
|
||
|
picolibc_source_dir="${build_dir}/picolibc-source"
|
||
|
picolibc_build_dir="${build_dir}/picolibc-build"
|
||
|
mkdir -p "${picolibc_source_dir}"
|
||
|
mkdir -p "${picolibc_build_dir}"
|
||
|
# Download the version of picolibc that was the latest at the time this script was written.
|
||
|
# Following changes are required and were introduced after version 1.8.5:
|
||
|
# - updated semihost arguments handling,
|
||
|
# - added missing macros in stdio.h
|
||
|
# - external linkage for isblank
|
||
|
# Version following 1.8.5, was not released by the time of writing.
|
||
|
picolibc_commit="04a90c56d7aac61880f205ec29b3dce6a9de0342"
|
||
|
curl -L "https://github.com/picolibc/picolibc/archive/${picolibc_commit}.zip" --output "${picolibc_source_dir}/picolibc.zip"
|
||
|
unzip -q "${picolibc_source_dir}/picolibc.zip" -d "${picolibc_source_dir}"
|
||
|
mv "${picolibc_source_dir}/picolibc-${picolibc_commit}"/* "${picolibc_source_dir}"
|
||
|
rm -rf "${picolibc_source_dir}/picolibc-${picolibc_commit}"
|
||
|
|
||
|
cat <<EOF > "${picolibc_build_dir}/meson-cross-build.txt"
|
||
|
[binaries]
|
||
|
c = ['${CC:-cc}', '--target=${target}', '-mfloat-abi=soft', '-nostdlib']
|
||
|
ar = 'llvm-ar'
|
||
|
as = 'llvm-as'
|
||
|
ld = 'lld'
|
||
|
strip = 'llvm-strip'
|
||
|
[host_machine]
|
||
|
system = 'none'
|
||
|
cpu_family = 'arm'
|
||
|
cpu = 'arm'
|
||
|
endian = 'little'
|
||
|
[properties]
|
||
|
skip_sanity_check = true
|
||
|
EOF
|
||
|
|
||
|
venv_dir="${build_dir}/meson-venv"
|
||
|
python3 -m venv "${venv_dir}"
|
||
|
# Install the version of meson that was the latest at the time this script was written.
|
||
|
"${venv_dir}/bin/pip" install "meson==1.1.1"
|
||
|
|
||
|
"${venv_dir}/bin/meson" setup \
|
||
|
-Dincludedir=include -Dlibdir=lib -Dspecsdir=none -Dmultilib=false -Dpicoexit=false \
|
||
|
--prefix "${install_dir}" \
|
||
|
--cross-file "${picolibc_build_dir}/meson-cross-build.txt" \
|
||
|
"${picolibc_build_dir}" \
|
||
|
"${picolibc_source_dir}"
|
||
|
|
||
|
"${venv_dir}/bin/meson" install -C "${picolibc_build_dir}"
|