xref: /llvm-project/libcxx/utils/ci/build-picolibc.sh (revision 52dc4918ca8b874ddd4e4fcad873a66ecc5b6953)
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 a known good version of picolibc.
73picolibc_commit="48fbc2009c6473293d03d5ec6f190565c6223a5c"
74curl -L "https://github.com/picolibc/picolibc/archive/${picolibc_commit}.zip" --output "${picolibc_source_dir}/picolibc.zip"
75unzip -q "${picolibc_source_dir}/picolibc.zip" -d "${picolibc_source_dir}"
76mv "${picolibc_source_dir}/picolibc-${picolibc_commit}"/* "${picolibc_source_dir}"
77rm -rf "${picolibc_source_dir}/picolibc-${picolibc_commit}"
78
79cat <<EOF > "${picolibc_build_dir}/meson-cross-build.txt"
80[binaries]
81c = ['${CC:-cc}', '--target=${target}', '-mfloat-abi=soft', '-nostdlib']
82ar = 'llvm-ar'
83as = 'llvm-as'
84ld = 'lld'
85strip = 'llvm-strip'
86[host_machine]
87system = 'none'
88cpu_family = 'arm'
89cpu = 'arm'
90endian = 'little'
91[properties]
92skip_sanity_check = true
93EOF
94
95venv_dir="${build_dir}/meson-venv"
96python3 -m venv "${venv_dir}"
97# Install the version of meson that was the latest at the time this script was written.
98"${venv_dir}/bin/pip" install "meson==1.1.1"
99
100"${venv_dir}/bin/meson" setup \
101  -Dincludedir=include -Dlibdir=lib -Dspecsdir=none -Dmultilib=false -Dpicoexit=false \
102  --prefix "${install_dir}" \
103  --cross-file "${picolibc_build_dir}/meson-cross-build.txt" \
104  "${picolibc_build_dir}" \
105  "${picolibc_source_dir}"
106
107"${venv_dir}/bin/meson" install -C "${picolibc_build_dir}"
108