New toolchain builder script for GCC and LLVM (#2320)

* Move build-toolchain.sh

* New toolchain builder script for GCC and LLVM
This commit is contained in:
Mathieu Gouttenoire 2024-07-04 07:46:41 +00:00 committed by GitHub
parent 66caecdfe6
commit d98ac1490a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 555 additions and 306 deletions

4
.gitignore vendored
View file

@ -45,8 +45,8 @@ __pycache__
.bender/ .bender/
Bender.lock Bender.lock
/tools/ /tools/
/util/gcc-toolchain-builder/src/ /util/toolchain-builder/src/
/util/gcc-toolchain-builder/build/ /util/toolchain-builder/build/
# Both following lines are needed to list contents of ISA manual build dir. # Both following lines are needed to list contents of ISA manual build dir.
!/vendor/riscv/riscv-isa-manual/build/ !/vendor/riscv/riscv-isa-manual/build/
!/vendor/riscv/riscv-isa-manual/build/* !/vendor/riscv/riscv-isa-manual/build/*

View file

@ -1,223 +0,0 @@
#!/bin/sh
#############################################################################
#
# Copyright 2020-2023 Thales
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#############################################################################
#
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security
#
#############################################################################
# Paths in configuration files are relative to this directory.
ROOT_DIR=$(dirname $(readlink -f $0))
# Assumptions:
# - the required binutils source is in src/binutils-gdb
# - the required GCC source is in src/gcc
# - the required newlib is in src/newlib
# - the user invoking this script has sufficient permissions
# to create/populate the installation directory.
# - there are no restrictions on the parallelism of the build process
# ("make -j" without an explicit job limit causes no significant harm)
#
# Builds of individual tools are performed under the matching
# build/... subdirectories
# Provide a means of throttling parallel 'make' executions.
# Use a conservative setting to avoid overloading the host machine.
if [ -z "$NUM_JOBS" ]; then
NUM_JOBS=1
fi
# Helper function to print usage information.
print_usage()
{
echo Usage:
echo " $SHELL $0 [-h|--help]"
echo " $SHELL $0 [-f|--force] [CONFIG_NAME] INSTALL_PREFIX"
echo ""
echo " -h, --help Print this help message and exit."
echo " -f, --force Rebuild toolchain from scratch (remove build dirs,"
echo " configure and build again.)"
echo " CONFIG_NAME Use configuration from file config/CONFIG_NAME.sh"
echo " (default: '$CONFIG_NAME')"
echo " INSTALL_PREFIX Path where the toolchain should be installed"
echo " (relative paths will be converted to absolute ones,"
echo " missing parent directories will be created as needed.)"
}
# Helper function to parse the cmdline args.
# Takes the complete list of positional args, drops them as they get parsed.
parse_cmdline()
{
# Print help message and exit.
if [ $# -ge 1 ]; then
if [ $1 = "-h" -o $1 = "--help" ]; then
print_usage
exit 0
fi
fi
# "Force rebuild" mode: try before any file/directory names.
# Valid only with 2+ cmdline args.
if [ $# -ge 2 ]; then
if [ $1 = "-f" -o $1 = "--force" ]; then
FORCE_REBUILD=yes
shift
fi
fi
# Check for the config name. Valid only with 2+ cmdline args left.
if [ $# -ge 2 ]; then
CONFIG_NAME=$1
shift
fi
# Check for the installation prefix. Must exist after dropping previous args.
if [ $# -eq 1 ]; then
# Resolve the path to an absolute one (it needs NOT to exist yet.)
PREFIX=`readlink -m "$1"`
shift
fi
# Any remaining arg past the prefix means an error.
if [ $# -gt 0 ]; then
echo "*** Excess arguments past INSTALL_PREFIX: please correct the command line!"
echo ""
print_usage
exit 12
fi
}
# ======== Default settings: GCC 13.1.0 baremetal, no forced rebuild ========
# - toolchain configuration.
# NOTE: config/$CONFIG_NAME.sh can be a symbolic link.
CONFIG_NAME="gcc-13.1.0-baremetal"
# - rebuild mode
FORCE_REBUILD=no
# The INSTALL_PREFIX argument is required
if [ $# -lt 1 ]; then
echo "*** Please specify the installation prefix of the toolchain!"
echo ""
print_usage;
exit 11
fi
# ======== Parse the command line. Drop each successfully parsed arg. ========
echo "### Parsing the cmdline..."
parse_cmdline "$@"
# ======== Check if config file exists, and load it if it does ========
# Check for the presence of source code and build configuration.
CONFIG_FILE="$ROOT_DIR/config/$CONFIG_NAME.sh"
if [ -f $CONFIG_FILE ]; then
# File present: read the settings.
. $CONFIG_FILE
else
echo "*** Configuration file '$CONFIG_FILE' missing!"
echo ""
print_usage
exit 13
fi
# ======== Actual build process ========
# Force rebuilding if asked to: remove all build directories.
[ $FORCE_REBUILD = "yes" ] && rm -rf $ROOT_DIR/build/{binutils-gdb,gcc,newlib}
# Overall build policy: try to be as push-button as possible...
# - If a Makefile already exists, do not configure again - just build+install.
# - If there is no Makefile, run configure, then build and install.
# - If the first configure attempt failed try making 'clean' and 'distclean'
# targets.
# - In case of build error in GCC once configured, remove the target-specific
# build subdirectories and try making again.
# - binutils and GCC are built with CFLAGS and CXXFLAGS set to "-O2"
# ("production" mode: no debug, stripping disabled = 10x smaller binaries).
# - CFLAGS and CXXFLAGS are left unset for newlib.
# Disable debug support to reduce size of executables and speed up their launching.
export CFLAGS="-O2"
export CXXFLAGS="-O2"
# Configure and build binutils (required by GCC).
# Binutils 2.40 has an annoying bug caused by a missing 'gas/doc'
# directory ==> create it prior to launching 'make'.
[ -d $ROOT_DIR/build/binutils-gdb ] || mkdir -p $ROOT_DIR/build/binutils-gdb
cd $ROOT_DIR/build/binutils-gdb
[ -f Makefile ] || \
../../$BINUTILS_DIR/configure $BINUTILS_CONFIGURE_OPTS || \
{ [ -f Makefile ] && make clean && make distclean && \
../../$BINUTILS_DIR/configure $BINUTILS_CONFIGURE_OPTS || \
{ echo "Could not configure binutils-gdb, bailing out!" ; \
exit 2 ; } ; } && \
{ [ -d gas/doc ] || mkdir -p gas/doc; } && \
make -j"$NUM_JOBS" all && make install || \
{ echo "*** Could not build binutils, bailing out!" ; exit 2; }
cd -
# Configure and build GCC (required by newlib).
# If an initial configure failed (e.g., due to a change in PREFIX),
# try making 'distclean' target and configuring again.
# The target-specific subdirectories configured during *build*
# are simply removed in case of build error, and 'make all' is
# then restarted.
[ -d $ROOT_DIR/build/gcc ] || mkdir -p $ROOT_DIR/build/gcc
cd $ROOT_DIR/build/gcc
[ -f Makefile ] || \
../../$GCC_DIR/configure $GCC_CONFIGURE_OPTS || \
{ [ -f Makefile ] && make clean && make distclean && \
make -C libcc1 distclean && \
../../$GCC_DIR/configure $GCC_CONFIGURE_OPTS || \
{ echo "Could not configure GCC, bailing out!" ; \
exit 2 ; } ; } && \
make -j"$NUM_JOBS" all || { rm -rf $TARGET && \
make -j"$NUM_JOBS" all ; } && make install || \
{ echo "*** Could not build GCC (even after removing target dirs), bailing out!" ; exit 2; }
cd -
# Unset the variables forced for binutils and GCC builds.
unset CFLAGS CXXFLAGS
# Configure and build newlib.
# We need the path to the newly installed tools
# when running 'configure' and building newlib.
[ -d $ROOT_DIR/build/newlib ] || mkdir -p $ROOT_DIR/build/newlib
cd $ROOT_DIR/build/newlib
export PATH="$PREFIX/bin:$PATH"
# Assume a fully capable code model (medium)
export CFLAGS="-mcmodel=medium"
# If an initial configure failed, try making 'distclean' target
# and configuring again.
[ -f Makefile ] || \
../../$NEWLIB_DIR/configure $NEWLIB_CONFIGURE_OPTS || \
{ [ -f Makefile ] && make clean && make distclean && \
../../$NEWLIB_DIR/configure $NEWLIB_CONFIGURE_OPTS || \
{ echo "Could not configure newlib, bailing out!" ; \
exit 2 ; } ; } && \
make -j"$NUM_JOBS" all && make install || \
{ echo "*** Could not build newlib, bailing out!" ; exit 2; }
cd -
# Exit happily.
exit 0

View file

@ -1,8 +1,8 @@
# `gcc-toolchain-builder`: Basic scripts for building a RISC-V GCC compiler toolchain # `toolchain-builder`: Basic scripts for building a RISC-V GCC or LLVM compiler toolchain
## Overview ## Overview
This directory contains basic scripts for building local instances of CORE-V GCC toolchains. This directory contains basic scripts for building local instances of CORE-V GCC or LLVM toolchains.
The scripts provide the means of fetching the source code and building the executables The scripts provide the means of fetching the source code and building the executables
and libraries for well-defined toolchain configurations. The intention is to and libraries for well-defined toolchain configurations. The intention is to
simplify the processs of building such toolchains and make it as "push-button" simplify the processs of building such toolchains and make it as "push-button"
@ -14,6 +14,7 @@ These configurations are deliberately lightweight and consist of:
* `binutils-gdb`: assembler, linker, GDB debugger, and object file utilities * `binutils-gdb`: assembler, linker, GDB debugger, and object file utilities
* `GCC`: the GNU GCC compiler configured for C only * `GCC`: the GNU GCC compiler configured for C only
* `LLVM`: the LLVM compiler infrastructure
* `newlib`: an open-source C library suitable for embedded applications. * `newlib`: an open-source C library suitable for embedded applications.
## Prerequisites ## Prerequisites
@ -25,7 +26,7 @@ from source code:
* 1.1 GB is needed for the build space; * 1.1 GB is needed for the build space;
* 0.5 GB is needed for the installed toolchain. * 0.5 GB is needed for the installed toolchain.
Several **standard packages** are needed to build the GCC-based compiler Several **standard packages** are needed to build the compiler
toolchains. On Debian/Ubuntu, executing the following command should suffice: toolchains. On Debian/Ubuntu, executing the following command should suffice:
$ sudo apt-get install autoconf automake autotools-dev curl git libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool bc zlib1g-dev $ sudo apt-get install autoconf automake autotools-dev curl git libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool bc zlib1g-dev
@ -41,7 +42,7 @@ On macOS, you can use [Homebrew](http://brew.sh) to install the dependencies:
## Getting started ## Getting started
Once the prerequisites (see [above](#prerequisites)) are satisfied, you can fetch and build the Once the prerequisites (see [above](#prerequisites)) are satisfied, you can fetch and build the
upstream GCC toolchain (default: 13.1.0) for bare-metal 32-bit and 64-bit applications in just three steps. upstream toolchain (default: GCC 13.1.0) for bare-metal 32-bit and 64-bit applications in just three steps.
# 1. Select an installation location for the toolchain (here: the default RISC-V tooling directory $RISCV). # 1. Select an installation location for the toolchain (here: the default RISC-V tooling directory $RISCV).
INSTALL_DIR=$RISCV INSTALL_DIR=$RISCV
@ -66,11 +67,11 @@ different toolchain components in suitable order.
In the process of building the toolchain, two new directory trees are created In the process of building the toolchain, two new directory trees are created
under the current working directory: under the current working directory:
* `src/`: Source code is fetched and checked out into subdirectories of `src` in * `SRC_DIR`: Source code is fetched and checked out into subdirectories of `$SRC_DIR`, which
the current working directory. defaults to `src/` in the current working directory when it is not set.
* `build/`: The building of the various components of the toolchain occurs in * `BUILD_DIR`: The building of the various components of the toolchain occurs in subdirectories
subdirectories of `build` in the current working directory. of `$BUILD_DIR`, which defaults to `build/` in the current working directory when it is not set.
This directory structure was chosen to keep the source and build directories This directory structure was chosen to keep the source and build directories
local to the user's workspace while supporting systematic out-of-source-tree local to the user's workspace while supporting systematic out-of-source-tree
@ -89,12 +90,12 @@ yet: any missing directories will be created during the building process. _The u
`build-toolchain.sh` script must have sufficient permissions to create the `build-toolchain.sh` script must have sufficient permissions to create the
missing directories of the installation location._ missing directories of the installation location._
Once a configuration name `CONFIG_NAME` and an installation location Once a configuration name `CONFIG_NAME` and an installation
`INSTALL_LOCATION` are chosen, use location `INSTALL_DIR` are chosen, use
sh get-toolchain.sh CONFIG_NAME sh get-toolchain.sh CONFIG_NAME
# E.g., # E.g.,
# sh get-toolchain.sh gcc-10.2.0-baremetal # sh get-toolchain.sh gcc-13.1.0-baremetal
to fetch/update the source code and to check out the matching baseline of code. to fetch/update the source code and to check out the matching baseline of code.
@ -112,6 +113,13 @@ To build the toolchain from the retrieved source baseline, use
# E.g., # E.g.,
# sh build-toolchain.sh gcc-13.1.0-baremetal $RISCV # sh build-toolchain.sh gcc-13.1.0-baremetal $RISCV
To speedup the building it is recommended to set the number of threads to use
# Use all available threads
export NUM_JOBS=$(nproc)
# Use 8 threads
export NUM_JOBS=8
The `build-toolchain.sh` script incorporates fallbacks for several commonly encountered configuration and The `build-toolchain.sh` script incorporates fallbacks for several commonly encountered configuration and
build issues. However, it is not meant to auto-detect major reconfigurations of source build issues. However, it is not meant to auto-detect major reconfigurations of source
code such as a change of baseline configuration. _Whenever the source code such as a change of baseline configuration. _Whenever the source
@ -144,15 +152,13 @@ adjusting the values of per-component variables. Taking `GCC` as an example:
`get-toolchain.sh` will update the local repository to the tip of the remote `get-toolchain.sh` will update the local repository to the tip of the remote
branch at every invocation._ branch at every invocation._
* `GCC_CONFIGURE_OPTS` is the list of options to pass to the configure script. \ * `GCC_CONFIGURE_OPTS` is the list of options to pass to the configure script.
_**NOTE:** Since `GCC_CONFIGURE_OPTS` is a Bourne shell variable, any double-quotes in It is located in `config/global.sh`.
the option list must be duly escaped to be correctly handled by the shell._
## Potential additions ## Potential additions
Several extensions are envisioned: Several extensions are envisioned:
* Explicit selection of GDB version * Explicit selection of GDB version
* Addition of LLVM/Clang compilers
* Support for Linux-based target environments * Support for Linux-based target environments
* Addition of full-featured C library implementations * Addition of full-featured C library implementations

View file

@ -0,0 +1,253 @@
#!/bin/bash
#############################################################################
#
# Copyright 2024 Thales DIS France SAS
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#############################################################################
#
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security
#
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
#############################################################################
# Assumptions:
# - the required binutils source is in src/binutils-gdb
# - the required GCC source is in src/gcc
# - the required LLVM source is in src/llvm-project
# - the required newlib is in src/newlib
# - the user invoking this script has sufficient permissions
# to create/populate the installation directory.
# - there are no restrictions on the parallelism of the build process
# ("make -j" without an explicit job limit causes no significant harm)
# Helper function to print usage information.
print_usage() {
echo Usage:
echo " $SHELL $0 [-h|--help]"
echo " $SHELL $0 [-f|--force] [CONFIG_NAME] INSTALL_DIR"
echo ""
echo " -h, --help Print this help message and exit."
echo " -f, --force Rebuild toolchain from scratch (remove build dirs,"
echo " configure and build again.)"
echo " CONFIG_NAME Use configuration from file config/CONFIG_NAME.sh"
echo " (default: '$CONFIG_NAME')"
echo " INSTALL_DIR Path where the toolchain should be installed"
echo " (relative paths will be converted to absolute ones,"
echo " missing parent directories will be created as needed.)"
}
# Helper function to parse the cmdline args.
# Takes the complete list of cmdline args, drops them as they get parsed.
parse_cmdline() {
POSITIONAL_ARGS=()
while [ $# -gt 0 ]; do
case $1 in
-h|--help)
print_usage
exit 0
;;
-f|--force)
FORCE_REBUILD=yes
shift
;;
-*|--*)
echo "*** Unknown option $1"
print_usage
exit 1
;;
*)
POSITIONAL_ARGS+=("$1")
shift
;;
esac
done
case ${#POSITIONAL_ARGS[@]} in
0)
echo "*** Argument INSTALL_DIR is missing!"
print_usage
exit 1
;;
1)
export INSTALL_DIR="${POSITIONAL_ARGS[0]}"
;;
2)
CONFIG_NAME="${POSITIONAL_ARGS[0]}"
export INSTALL_DIR="${POSITIONAL_ARGS[1]}"
;;
*)
echo "*** Too may arguments were given!"
print_usage
exit 1
;;
esac
}
build_binutils() {
# Create build directory
mkdir -p "$BUILD_DIR/binutils-$1"
cd "$BUILD_DIR/binutils-$1"
[ -d gas/doc ] || mkdir -p gas/doc # Binutils 2.40 has a bug caused by a missing 'gas/doc'
[ -f Makefile ] || CFLAGS="-O2" CXXFLAGS="-O2" \
$SRC_DIR/$BINUTILS_DIR/configure $(BINUTILS_CONFIGURE_OPTS $1)
make -j$NUM_JOBS
make install
# Add symlinks for riscv64 triple
shopt -s nullglob
cd "$INSTALL_DIR/bin"
for TOOL in riscv32-unknown-elf-*; do
ln -sv ${TOOL} riscv64-unknown-elf-${TOOL#riscv32-unknown-elf-}
done
}
build_gcc() {
# Create build directory
mkdir -p "$BUILD_DIR/gcc"
cd "$BUILD_DIR/gcc"
[ -f Makefile ] || CFLAGS="-O2" CXXFLAGS="-O2" \
$SRC_DIR/$GCC_DIR/configure $(GCC_CONFIGURE_OPTS)
make -j$NUM_JOBS
make install
}
build_llvm() {
# Create build directory
mkdir -p "$BUILD_DIR/llvm"
cd "$BUILD_DIR/llvm"
[ -f Makefile ] || cmake $SRC_DIR/$LLVM_DIR/llvm $(LLVM_CONFIGURE_OPTS)
make -j$NUM_JOBS
make install-distribution
# Add symlinks to LLVM tools
cd "$INSTALL_DIR/bin"
for TOOL in clang clang++ cc c++; do
ln -sv clang riscv32-unknown-elf-$TOOL
ln -sv clang riscv64-unknown-elf-$TOOL
done
}
build_newlib() {
# Create build directory
PATH=${INSTALL_DIR}/bin:${PATH}
mkdir -p "$BUILD_DIR/newlib-$1"
cd "$BUILD_DIR/newlib-$1"
[ -f Makefile ] || CFLAGS_FOR_TARGET="-O2 -mcmodel=medany -Wno-unused-command-line-argument -Wno-implicit-function-declaration -Wno-int-conversion" \
$SRC_DIR/$NEWLIB_DIR/configure $(NEWLIB_CONFIGURE_OPTS $1)
make -j$NUM_JOBS
make install
}
build_compiler_rt() {
# Create build directory
mkdir -p "$BUILD_DIR/compiler-rt-$1"
cd "$BUILD_DIR/compiler-rt-$1"
COMPILER_RT_CONFIGURE_OPTS $1
[ -f Makefile ] || cmake $SRC_DIR/$LLVM_DIR/compiler-rt $(COMPILER_RT_CONFIGURE_OPTS $1)
make -j$NUM_JOBS
make install
}
build_gcc_toolchain() {
[ $FORCE_REBUILD = "yes" ] && rm -rf $BUILD_DIR/{gcc,*-none-elf}
echo "### Building Binutils ..."
build_binutils riscv-none-elf
echo "### Building GCC ..."
build_gcc
echo "### Building Newlib ..."
build_newlib riscv-none-elf
}
build_llvm_toolchain() {
[ $FORCE_REBUILD = "yes" ] && rm -rf $BUILD_DIR/{llvm,*-unknown-elf}
echo "### Building Binutils ..."
build_binutils riscv32-unknown-elf
echo "### Building LLVM ..."
build_llvm
echo "### Building Newlib 32 bits ..."
build_newlib riscv32-unknown-elf
echo "### Building Newlib 64 bits ..."
build_newlib riscv64-unknown-elf
echo "### Building Compiler-RT 32 bits ..."
build_compiler_rt riscv32-unknown-elf
echo "### Building Compiler-RT 64 bits ..."
build_compiler_rt riscv64-unknown-elf
}
# Absolute path of the toolchain-builder directory
export ROOT_DIR=$(dirname $(readlink -f $0))
# ======== Default settings: GCC 13.1.0 baremetal, no forced rebuild ========
# - toolchain configuration.
# NOTE: config/$CONFIG_NAME.sh can be a symbolic link.
CONFIG_NAME="gcc-13.1.0-baremetal"
# - rebuild mode
FORCE_REBUILD=no
echo "### Parsing the cmdline..."
parse_cmdline "$@"
# Load global config
. $ROOT_DIR/config/global.sh
# Make sure the install directory exists and is empty
if [ -n "$(ls -A $INSTALL_DIR 2>/dev/null)" ]; then
echo "Install directory $INSTALL_DIR is not empty!"
exit 1
else
mkdir -p "$INSTALL_DIR"
fi
if [[ $CONFIG_NAME == "gcc"* ]]; then
build_gcc_toolchain
else
build_llvm_toolchain
fi
# Exit happily.
exit 0

View file

@ -1,6 +1,6 @@
############################################################################# #############################################################################
# #
# Copyright 2020-2023 Thales # Copyright 2024 Thales DIS France SAS
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -18,44 +18,20 @@
# #
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security # Original Author: Zbigniew CHAMSKI, Thales Silicon Security
# #
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
############################################################################# #############################################################################
# Name of the target to use for the toolchain.
export TARGET=riscv-none-elf
# ======= Source code setup: path, repo, commit, configure options ========
# Each *_COMMIT variable can designate any valid 'commit-ish' entity: # Each *_COMMIT variable can designate any valid 'commit-ish' entity:
# typically a tag, a commit or the output of "git describe" of a Git tree. # typically a tag, a commit or the output of "git describe" of a Git tree.
# Binutils # Binutils
BINUTILS_DIR=src/binutils-gdb
BINUTILS_REPO=https://sourceware.org/git/binutils-gdb.git
BINUTILS_COMMIT=binutils-2_40 BINUTILS_COMMIT=binutils-2_40
BINUTILS_CONFIGURE_OPTS="\
--prefix=$PREFIX \
--target=$TARGET \
--disable-nls \
--disable-werror"
# GCC # GCC
GCC_DIR=src/gcc
GCC_REPO=https://github.com/gcc-mirror/gcc.git
GCC_COMMIT=releases/gcc-13.1.0 GCC_COMMIT=releases/gcc-13.1.0
GCC_CONFIGURE_OPTS="\
--prefix=$PREFIX \
--target=$TARGET \
--enable-languages=c \
--disable-libssp \
--disable-libgomp \
--disable-libmudflap"
# newlib # newlib
NEWLIB_DIR=src/newlib
NEWLIB_REPO=https://sourceware.org/git/newlib-cygwin.git
NEWLIB_COMMIT=newlib-4.3.0 NEWLIB_COMMIT=newlib-4.3.0
NEWLIB_CONFIGURE_OPTS="\
--prefix=$PREFIX \
--target=$TARGET \
--enable-multilib"

View file

@ -0,0 +1,37 @@
#############################################################################
#
# Copyright 2024 Thales DIS France SAS
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#############################################################################
#
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security
#
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
#############################################################################
# Each *_COMMIT variable can designate any valid 'commit-ish' entity:
# typically a tag, a commit or the output of "git describe" of a Git tree.
# Binutils
BINUTILS_COMMIT=binutils-2_41
# GCC
GCC_COMMIT=releases/gcc-14.1.0
# newlib
NEWLIB_COMMIT=newlib-4.4.0

View file

@ -1,6 +1,6 @@
############################################################################# #############################################################################
# #
# Copyright 2020-2023 Thales # Copyright 2024 Thales DIS France SAS
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -18,44 +18,20 @@
# #
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security # Original Author: Zbigniew CHAMSKI, Thales Silicon Security
# #
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
############################################################################# #############################################################################
# Name of the target to use for the toolchain.
export TARGET=riscv-none-elf
# ======= Source code setup: path, repo, commit, configure options ========
# Each *_COMMIT variable can designate any valid 'commit-ish' entity: # Each *_COMMIT variable can designate any valid 'commit-ish' entity:
# typically a tag, a commit or the output of "git describe" of a Git tree. # typically a tag, a commit or the output of "git describe" of a Git tree.
# Binutils # Binutils
BINUTILS_DIR=src/binutils-gdb
BINUTILS_REPO=https://sourceware.org/git/binutils-gdb.git
BINUTILS_COMMIT=binutils-2_41 BINUTILS_COMMIT=binutils-2_41
BINUTILS_CONFIGURE_OPTS="\
--prefix=$PREFIX \
--target=$TARGET \
--disable-nls \
--disable-werror"
# GCC # GCC
GCC_DIR=src/gcc
GCC_REPO=https://github.com/gcc-mirror/gcc.git
GCC_COMMIT=master GCC_COMMIT=master
GCC_CONFIGURE_OPTS="\
--prefix=$PREFIX \
--target=$TARGET \
--enable-languages=c \
--disable-libssp \
--disable-libgomp \
--disable-libmudflap"
# newlib # newlib
NEWLIB_DIR=src/newlib
NEWLIB_REPO=https://sourceware.org/git/newlib-cygwin.git
NEWLIB_COMMIT=newlib-4.3.0 NEWLIB_COMMIT=newlib-4.3.0
NEWLIB_CONFIGURE_OPTS="\
--prefix=$PREFIX \
--target=$TARGET \
--enable-multilib"

View file

@ -0,0 +1,137 @@
#!/bin/bash
#############################################################################
#
# Copyright 2024 Thales DIS France SAS
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#############################################################################
#
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security
#
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
#############################################################################
# Set the default build directory to build/ if it isn't already set
if [ -z "$BUILD_DIR" ]; then
export BUILD_DIR="$ROOT_DIR/build"
fi
# Set the default source directory to src/ if it isn't already set
if [ -z "$SRC_DIR" ]; then
export SRC_DIR="$ROOT_DIR/src"
fi
# Provide a means of throttling parallel 'make' executions.
# Use a conservative setting to avoid overloading the host machine.
if [ -z "$NUM_JOBS" ]; then
NUM_JOBS=1
fi
# Name of the source directories
BINUTILS_DIR=binutils-gdb
GCC_DIR=gcc
LLVM_DIR=llvm-project
NEWLIB_DIR=newlib
# Address of the Git repositories
BINUTILS_REPO=https://sourceware.org/git/binutils-gdb.git
GCC_REPO=https://github.com/gcc-mirror/gcc.git
LLVM_REPO=https://github.com/llvm/llvm-project.git
NEWLIB_REPO=https://sourceware.org/git/newlib-cygwin.git
BINUTILS_CONFIGURE_OPTS() {
OPTS=(
--target=$1
--prefix=${INSTALL_DIR}
--disable-werror
--disable-gdb
--disable-nls
--disable-sim
--disable-libdecnumber
--disable-readline
)
echo "${OPTS[@]}"
}
GCC_CONFIGURE_OPTS() {
OPTS=(
--prefix=${INSTALL_DIR}
--target=riscv-none-elf
--enable-languages=c
--disable-libssp
--disable-libgomp
--disable-libmudflap
)
echo "${OPTS[@]}"
}
LLVM_CONFIGURE_OPTS() {
OPTS=(
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
-DLLVM_ENABLE_PROJECTS='clang;lld'
-DLLVM_BINUTILS_INCDIR=${SRC_DIR}/${BINUTILS_DIR}/include
-DLLVM_DISTRIBUTION_COMPONENTS='clang;clang-resource-headers;lld;llvm-ar;llvm-cov;llvm-cxxfilt;llvm-dwp;llvm-nm;llvm-objcopy;llvm-objdump;llvm-ranlib;llvm-readobj;llvm-size;llvm-strings;llvm-strip;llvm-profdata;llvm-symbolizer'
-DLLVM_TARGETS_TO_BUILD='RISCV'
-DLLVM_OPTIMIZED_TABLEGEN=ON
-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON
-DLLVM_INSTALL_BINUTILS_SYMLINKS=ON
)
echo "${OPTS[@]}"
}
NEWLIB_CONFIGURE_OPTS() {
OPTS=(
--target=$1
--prefix=${INSTALL_DIR}
--enable-multilib
--enable-newlib-io-long-double
--enable-newlib-io-long-long
--enable-newlib-io-c99-formats
--enable-newlib-register-fini
)
echo "${OPTS[@]}"
}
COMPILER_RT_CONFIGURE_OPTS() {
OPTS=(
-DCMAKE_INSTALL_PREFIX=$(${INSTALL_DIR}/bin/clang -print-resource-dir)
-DCMAKE_C_COMPILER=${INSTALL_DIR}/bin/clang
-DCMAKE_CXX_COMPILER=${INSTALL_DIR}/bin/clang
-DCMAKE_AR=${INSTALL_DIR}/bin/llvm-ar
-DCMAKE_NM=${INSTALL_DIR}/bin/llvm-nm
-DCMAKE_RANLIB=${INSTALL_DIR}/bin/llvm-ranlib
-DCMAKE_C_COMPILER_TARGET=$1
-DCMAKE_CXX_COMPILER_TARGET=$1
-DCMAKE_ASM_COMPILER_TARGET=$1
-DCMAKE_EXE_LINKER_FLAGS=-nostdlib
-DLLVM_CONFIG_PATH=${BUILD_DIR}/llvm/bin/llvm-config
-DCOMPILER_RT_BAREMETAL_BUILD=ON
-DCOMPILER_RT_BUILD_BUILTINS=ON
-DCOMPILER_RT_BUILD_LIBFUZZER=OFF
-DCOMPILER_RT_BUILD_MEMPROF=OFF
-DCOMPILER_RT_BUILD_PROFILE=OFF
-DCOMPILER_RT_BUILD_SANITIZERS=OFF
-DCOMPILER_RT_BUILD_XRAY=OFF
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
-DCOMPILER_RT_OS_DIR=
)
echo "${OPTS[@]}"
}

View file

@ -0,0 +1,37 @@
#############################################################################
#
# Copyright 2024 Thales DIS France SAS
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#############################################################################
#
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security
#
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
#############################################################################
# Each *_COMMIT variable can designate any valid 'commit-ish' entity:
# typically a tag, a commit or the output of "git describe" of a Git tree.
# Binutils
BINUTILS_COMMIT=binutils-2_42
# LLVM
LLVM_COMMIT=release/18.x
# newlib
NEWLIB_COMMIT=newlib-4.4.0

View file

@ -0,0 +1,37 @@
#############################################################################
#
# Copyright 2024 Thales DIS France SAS
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#############################################################################
#
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security
#
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
#############################################################################
# Each *_COMMIT variable can designate any valid 'commit-ish' entity:
# typically a tag, a commit or the output of "git describe" of a Git tree.
# Binutils
BINUTILS_COMMIT=master
# LLVM
LLVM_COMMIT=main
# newlib
NEWLIB_COMMIT=master

View file

@ -2,7 +2,7 @@
############################################################################# #############################################################################
# #
# Copyright 2020-2023 Thales # Copyright 2024 Thales DIS France SAS
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -20,6 +20,8 @@
# #
# Original Author: Zbigniew CHAMSKI, Thales Silicon Security # Original Author: Zbigniew CHAMSKI, Thales Silicon Security
# #
# Adapted by Mathieu Gouttenoire, Thales DIS France SAS
#
############################################################################# #############################################################################
# Prerequisites: # Prerequisites:
@ -38,6 +40,10 @@
# Paths in config files are relative to this directory. # Paths in config files are relative to this directory.
ROOT_DIR=$(dirname $(readlink -f $0)) ROOT_DIR=$(dirname $(readlink -f $0))
# Load global config
. $ROOT_DIR/config/global.sh
# Helper function to print usage information. # Helper function to print usage information.
print_usage() print_usage()
{ {
@ -98,7 +104,7 @@ fi
# fi # fi
# Overall directory infrastructure: make sure `pwd`/src exists. # Overall directory infrastructure: make sure `pwd`/src exists.
[ ! -d $ROOT_DIR/src ] && mkdir $ROOT_DIR/src [ ! -d "$SRC_DIR" ] && mkdir "$SRC_DIR"
# All Git-based source trees are handled in the same way. # All Git-based source trees are handled in the same way.
# Positional args: # Positional args:
@ -110,13 +116,13 @@ setup_sources_from_git()
# make sure the source directory exists and is populated # make sure the source directory exists and is populated
# with Git information. If a stale non-Git directory exits, # with Git information. If a stale non-Git directory exits,
# remove it unless it is write-protected. # remove it unless it is write-protected.
[ -d $ROOT_DIR/$2 -a -d $ROOT_DIR/$2/.git ] || \ [ -d $SRC_DIR/$2 -a -d $SRC_DIR/$2/.git ] || \
{ rm -rf $ROOT_DIR/$2 && \ { rm -rf $SRC_DIR/$2 && \
git clone --depth=1 --branch="$3" $1 $ROOT_DIR/$2 ; } git clone --depth=1 --branch="$3" $1 $SRC_DIR/$2 ; }
# Check out the required revision as local branch (the shallow clone # Check out the required revision as local branch (the shallow clone
# leaves a "detached HEAD" state.) # leaves a "detached HEAD" state.)
cd $ROOT_DIR/$2 cd $SRC_DIR/$2
LOCAL_BRANCH="${3}-local" LOCAL_BRANCH="${3}-local"
{ git branch | grep -q "$LOCAL_BRANCH" ; } || git checkout -b "$LOCAL_BRANCH" { git branch | grep -q "$LOCAL_BRANCH" ; } || git checkout -b "$LOCAL_BRANCH"
git checkout "$LOCAL_BRANCH" git checkout "$LOCAL_BRANCH"
@ -125,17 +131,24 @@ setup_sources_from_git()
cd - cd -
} }
# Binutils # Get Binutils sources
echo "# Step 1: Obtaining sources of binutils-gdb..." echo "# Step 1: Obtaining sources of binutils..."
setup_sources_from_git $BINUTILS_REPO $BINUTILS_DIR $BINUTILS_COMMIT setup_sources_from_git $BINUTILS_REPO $BINUTILS_DIR $BINUTILS_COMMIT
# GCC if [[ $CONFIG_NAME == "gcc"* ]]; then
echo "# Step 2: Obtaining sources of GCC..." # Get GCC sources
setup_sources_from_git $GCC_REPO $GCC_DIR $GCC_COMMIT echo "# Step 2: Obtaining sources of GCC..."
setup_sources_from_git $GCC_REPO $GCC_DIR $GCC_COMMIT
else
# Get LLVM sources
echo "# Step 2: Obtaining sources of LLVM..."
setup_sources_from_git $LLVM_REPO $LLVM_DIR $LLVM_COMMIT
fi
# Newlib # Get Newlib sources
echo "# Step 3: Obtaining sources of newlib..." echo "# Step 3: Obtaining sources of newlib..."
setup_sources_from_git $NEWLIB_REPO $NEWLIB_DIR $NEWLIB_COMMIT setup_sources_from_git $NEWLIB_REPO $NEWLIB_DIR $NEWLIB_COMMIT
# Exit happily. # Exit happily.
exit 0 exit 0