Skip to content

Commit 4302e4f

Browse files
committed
lib picolib: add build scripts
1 parent d6230f8 commit 4302e4f

File tree

7 files changed

+188
-0
lines changed

7 files changed

+188
-0
lines changed

picolib/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
libtock-picolib*
2+
picolib-*
3+
picolibc-*

picolib/Makefile

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
all: rebuild-picolib
2+
3+
ifeq ($(PICOLIB_VERSION),)
4+
$(error Need to set the PICOLIB_VERSION variable to choose which to build.)
5+
endif
6+
7+
picolib-$(PICOLIB_VERSION).tar.xz:
8+
@echo "Downloading picolib source $(@F)"
9+
@wget -q -O $@ https://github.com/picolibc/picolibc/releases/download/$(PICOLIB_VERSION)/picolibc-$(PICOLIB_VERSION).tar.xz
10+
11+
picolibc-$(PICOLIB_VERSION): picolib-$(PICOLIB_VERSION).tar.xz
12+
@echo "Extracting $(<F)"
13+
@tar -xzf $<
14+
@touch $@ # Touch so directory appears newer than tarball
15+
16+
rebuild-picolib: picolibc-$(PICOLIB_VERSION)
17+
@rm -rf picolib-arm-$(PICOLIB_VERSION)-out
18+
@rm -rf picolib-arm-$(PICOLIB_VERSION)-install
19+
@rm -rf picolib-riscv-$(PICOLIB_VERSION)-out
20+
@rm -rf picolib-riscv-$(PICOLIB_VERSION)-install
21+
@rm -rf libtock-picolib-$(PICOLIB_VERSION).zip
22+
@rm -rf libtock-picolib-$(PICOLIB_VERSION)
23+
@echo ""
24+
@echo "=== BEGINNING ARM BUILD =========================="
25+
@echo ""
26+
@mkdir -p picolib-arm-$(PICOLIB_VERSION)-out
27+
@mkdir -p picolib-arm-$(PICOLIB_VERSION)-install
28+
@echo "Entering directory picolib-arm-$(PICOLIB_VERSION)-out"
29+
cd picolib-arm-$(PICOLIB_VERSION)-out; ../build-arm.sh ../$< ../picolib-arm-$(PICOLIB_VERSION)-install | tee build-arm.log
30+
@echo ""
31+
@echo "=== BEGINNING RISC-V BUILD ======================="
32+
@echo ""
33+
@mkdir -p picolib-riscv-$(PICOLIB_VERSION)-out
34+
@mkdir -p picolib-riscv-$(PICOLIB_VERSION)-install
35+
@echo "Entering directory picolib-riscv-$(PICOLIB_VERSION)-out"
36+
cd picolib-riscv-$(PICOLIB_VERSION)-out; ../build-riscv.sh ../$< ../picolib-riscv-$(PICOLIB_VERSION)-install | tee build-riscv.log
37+
@echo ""
38+
@echo "=== PACKAGING PICOLIB ARTIFACTS ==================="
39+
@echo ""
40+
@mkdir -p libtock-picolib-$(PICOLIB_VERSION)/arm
41+
@mkdir -p libtock-picolib-$(PICOLIB_VERSION)/riscv
42+
@cp -r picolib-arm-$(PICOLIB_VERSION)-install/picolibc/arm-none-eabi libtock-picolib-$(PICOLIB_VERSION)/arm
43+
@cp -r picolib-riscv-$(PICOLIB_VERSION)-install/picolibc/riscv64-unknown-elf libtock-picolib-$(PICOLIB_VERSION)/riscv
44+
@mv picolib-arm-$(PICOLIB_VERSION)-out/build-arm.log picolib-riscv-$(PICOLIB_VERSION)-out/build-riscv.log libtock-picolib-$(PICOLIB_VERSION)
45+
@zip -r libtock-picolib-$(PICOLIB_VERSION).zip libtock-picolib-$(PICOLIB_VERSION)
46+
@echo ""
47+
@echo "=== FINISHED PICOLIB ZIP =========================="
48+
@echo ""
49+
@sha256sum libtock-picolib-$(PICOLIB_VERSION).zip

picolib/README.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
Tock Userland libc - Picolibc
2+
==============================
3+
4+
[Picolibc](https://github.com/picolibc/picolibc) is a port of the C standard
5+
library designed for embedded systems. Tock uses a version of Picolibc compiled
6+
to support the position independent code that Tock applications require.
7+
8+
Compiling a new version of Picolibc
9+
-----------------------------------
10+
11+
This folder contains scripts to build and package picolibc for libtock-c.
12+
13+
### Simple Directions
14+
15+
If you want to build and package picolibc locally you can use the provided
16+
`Makefile`.
17+
18+
You must choose by setting the variable `PICOLIB_VERSION` with the version you
19+
want to compile. The releases are listed
20+
[here](https://github.com/picolibc/picolibc/releases).
21+
22+
Then:
23+
24+
$ make PICOLIB_VERSION=1.8.5
25+
26+
When the build finishes (it takes a while), a zip folder named
27+
`libtock-picolib-<version>.zip` will contain the built libraries. You can move
28+
that folder to the `libtock-c/lib` directory to use the new version of newlib.
29+
30+
### Docker
31+
32+
To help with reproducibility, we provide Dockerfiles for various versions of
33+
newlib that can generate the compiled version of libtock-picolib.
34+
35+
```bash
36+
cd docker/docker-picolib-<version>
37+
./docker-create.sh
38+
```

picolib/build-arm.sh

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env bash
2+
3+
set -x
4+
5+
PICOLIB_SRC_DIR=$1
6+
PICOLIB_INSTALL_DIR=$2
7+
8+
# We want to end up with newlib compiled for at least the `v6-m/nofp`,
9+
# `v7-m/nofp`, and `v7e-m/nofp` architectures. For that to happen the
10+
# arm-none-eabi-gcc compiler must have been compiled with multilib support for
11+
# those architectures. We verify that here before actually building anything.
12+
if ! arm-none-eabi-gcc --print-multi-lib | grep -q 'v6-m/nofp'; then
13+
echo "ERROR: arm-none-eabi-gcc not configured with multilib support for v6-m/nofp"
14+
exit -1
15+
fi
16+
if ! arm-none-eabi-gcc --print-multi-lib | grep -q 'v7-m/nofp'; then
17+
echo "ERROR: arm-none-eabi-gcc not configured with multilib support for v7-m/nofp"
18+
exit -1
19+
fi
20+
if ! arm-none-eabi-gcc --print-multi-lib | grep -q 'v7e-m/nofp'; then
21+
echo "ERROR: arm-none-eabi-gcc not configured with multilib support for v7e-m/nofp"
22+
exit -1
23+
fi
24+
25+
# Picolibc Configure Flags
26+
#
27+
# picolib=false # Do not use picolib sbrk. We need to use the memop syscalls.
28+
# picocrt=false # Do not build crt0, we have our own.
29+
# picocrt-lib=false # Do not package crt0.
30+
# tinystdio=false # Do not use AVR tinystdio, which uses a different underlying interface (aka stdout object).
31+
# newlib-stdio64=false # Do not include 64 bit APIs.
32+
# newlib-reent-small=true # ?
33+
# newlib-global-atexit=true # ?
34+
$PICOLIB_SRC_DIR/scripts/do-configure arm-none-eabi -Dprefix=`realpath $PICOLIB_INSTALL_DIR` \
35+
-Dpicolib=false \
36+
-Dpicocrt=false \
37+
-Dpicocrt-lib=false \
38+
-Dtinystdio=false \
39+
-Dnewlib-stdio64=false \
40+
-Dnewlib-reent-small=true \
41+
-Dnewlib-global-atexit=true \
42+
-Dmultilib-list=thumb/v6-m/nofp,thumb/v7-m/nofp,thumb/v7e-m/nofp \
43+
-Dc_args="-g -Os -ffunction-sections -fdata-sections -fPIC -msingle-pic-base -mno-pic-data-is-text-relative"
44+
45+
ninja
46+
ninja install

picolib/build-riscv.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/usr/bin/env bash
2+
3+
set -x
4+
5+
PICOLIB_SRC_DIR=$1
6+
PICOLIB_INSTALL_DIR=$2
7+
8+
$PICOLIB_SRC_DIR/scripts/do-configure riscv64-unknown-elf -Dprefix=`realpath $PICOLIB_INSTALL_DIR` \
9+
-Dpicolib=false \
10+
-Dpicocrt=false \
11+
-Dpicocrt-lib=false \
12+
-Dtinystdio=false \
13+
-Dnewlib-stdio64=false \
14+
-Dmultilib-list=rv32i/ilp32,rv32im/ilp32,rv32imac/ilp32 \
15+
-Dnewlib-reent-small=true \
16+
-Dnewlib-global-atexit=true
17+
18+
ninja
19+
ninja install
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
###
2+
### Dockerfile to build libtock-picolib-1.8.5
3+
###
4+
5+
# We get version 12 of arm-none-eabi-gcc/riscv64-unknown-elf-gcc.
6+
FROM debian:bookworm
7+
8+
LABEL maintainer="Tock Project Developers <[email protected]>"
9+
LABEL version="0.1"
10+
LABEL description="Dockerfile to build libtock-c picolib 1.8.5."
11+
12+
# Disable Prompt During Packages Installation
13+
ARG DEBIAN_FRONTEND=noninteractive
14+
# Update Ubuntu Software repository
15+
RUN apt update
16+
17+
# Install our toolchains
18+
RUN apt install -y gcc-arm-none-eabi gcc-riscv64-unknown-elf
19+
20+
# Install needed tools
21+
RUN apt install -y git build-essential ninja-build meson zip
22+
23+
# Clone the libtock-c source so we can use the build scripts
24+
RUN git clone https://github.com/tock/libtock-c -b make-precompiled-picolib
25+
RUN cd libtock-c && git fetch && git checkout 6dc8907938e7daa307650ba6577a59c25214ef3f
26+
27+
# Actually build the toolchain
28+
RUN cd libtock-c/picolib && make PICOLIB_VERSION=1.8.5
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/usr/bin/env bash
2+
3+
docker build -t libtock-c-picolib-1.8.5 .
4+
id=$(docker create libtock-c-picolib-1.8.5)
5+
docker cp $id:/libtock-c/newlib/libtock-picolib-1.8.5.zip libtock-picolib-1.8.5.zip

0 commit comments

Comments
 (0)