• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env bash
2#===----------------------------------------------------------------------===##
3#
4# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5# See https://llvm.org/LICENSE.txt for license information.
6# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7#
8#===----------------------------------------------------------------------===##
9
10#
11# This script builds picolibc (https://github.com/picolibc/picolibc) from
12# source to facilitate building libc++ against it.
13#
14
15set -e
16
17PROGNAME="$(basename "${0}")"
18
19function error() { printf "error: %s\n" "$*" >&2; exit 1; }
20
21function usage() {
22cat <<EOF
23Usage:
24${PROGNAME} [options]
25
26[-h|--help]                  Display this help and exit.
27
28--build-dir <DIR>            Path to the directory to use for building.
29
30--install-dir <DIR>          Path to the directory to install the library to.
31EOF
32}
33
34while [[ $# -gt 0 ]]; do
35    case ${1} in
36        -h|--help)
37            usage
38            exit 0
39            ;;
40        --build-dir)
41            build_dir="${2}"
42            shift; shift
43            ;;
44        --install-dir)
45            install_dir="${2}"
46            shift; shift
47            ;;
48        --target)
49            target="${2}"
50            shift; shift
51            ;;
52        *)
53            error "Unknown argument '${1}'"
54            ;;
55    esac
56done
57
58for arg in build_dir install_dir target; do
59    if [ -z ${!arg+x} ]; then
60        error "Missing required argument '--${arg//_/-}'"
61    elif [ "${!arg}" == "" ]; then
62        error "Argument to --${arg//_/-} must not be empty"
63    fi
64done
65
66
67echo "--- Downloading picolibc"
68picolibc_source_dir="${build_dir}/picolibc-source"
69picolibc_build_dir="${build_dir}/picolibc-build"
70mkdir -p "${picolibc_source_dir}"
71mkdir -p "${picolibc_build_dir}"
72# Download the version of picolibc that was the latest at the time this script was written.
73# Following changes are required and were introduced after version 1.8.5:
74# - updated semihost arguments handling,
75# - added missing macros in stdio.h
76# Version following 1.8.5, was not released by the time of writing.
77picolibc_commit="4b9b8ef01d18cf0563348ad4af4ae89a7277e7ca"
78curl -L "https://github.com/picolibc/picolibc/archive/${picolibc_commit}.zip" --output "${picolibc_source_dir}/picolibc.zip"
79unzip -q "${picolibc_source_dir}/picolibc.zip" -d "${picolibc_source_dir}"
80mv "${picolibc_source_dir}/picolibc-${picolibc_commit}"/* "${picolibc_source_dir}"
81rm -rf "${picolibc_source_dir}/picolibc-${picolibc_commit}"
82
83cat <<EOF > "${picolibc_build_dir}/meson-cross-build.txt"
84[binaries]
85c = ['${CC:-cc}', '--target=${target}', '-mfloat-abi=soft', '-nostdlib']
86ar = 'llvm-ar'
87as = 'llvm-as'
88ld = 'lld'
89strip = 'llvm-strip'
90[host_machine]
91system = 'none'
92cpu_family = 'arm'
93cpu = 'arm'
94endian = 'little'
95[properties]
96skip_sanity_check = true
97EOF
98
99venv_dir="${build_dir}/meson-venv"
100python3 -m venv "${venv_dir}"
101# Install the version of meson that was the latest at the time this script was written.
102"${venv_dir}/bin/pip" install "meson==1.1.1"
103
104"${venv_dir}/bin/meson" setup \
105  -Dincludedir=include -Dlibdir=lib -Dspecsdir=none -Dmultilib=false -Dpicoexit=false \
106  --prefix "${install_dir}" \
107  --cross-file "${picolibc_build_dir}/meson-cross-build.txt" \
108  "${picolibc_build_dir}" \
109  "${picolibc_source_dir}"
110
111"${venv_dir}/bin/meson" install -C "${picolibc_build_dir}"
112