29 changes: 19 additions & 10 deletions Dockerfile
@@ -1,7 +1,8 @@

FROM ubuntu:18.04
FROM ubuntu:20.04

ENV HOST_CLANG_VER 12
ENV PATH="/opt/zig-linux-x86_64-0.11.0:$PATH"

# Install common build utilities
RUN apt update && \
Expand All @@ -11,6 +12,8 @@ RUN apt update && \
DEBIAN_FRONTEND=noninteractive eatmydata \
add-apt-repository ppa:deadsnakes/ppa && \
DEBIAN_FRONTEND=noninteractive eatmydata \
wget --quiet https://ziglang.org/download/0.11.0/zig-linux-x86_64-0.11.0.tar.xz && \
tar xf ./zig-linux-x86_64-0.11.0.tar.xz --directory /opt && \
wget https://apt.llvm.org/llvm.sh && \
chmod +x ./llvm.sh && \
bash -x ./llvm.sh ${HOST_CLANG_VER} && \
Expand All @@ -30,7 +33,9 @@ RUN apt update && \
rsync \
wget \
build-essential \
python3.6 \
python-is-python3 \
python3.8 \
python3.8-venv \
curl \
xz-utils \
ca-certificates \
Expand All @@ -45,9 +50,9 @@ RUN cat /etc/apt/sources.list | sed "s/^deb\ /deb-src /" >> /etc/apt/sources.lis

RUN apt update && \
DEBIAN_FRONTEND=noninteractive eatmydata \
apt build-dep -yy --arch-only qemu clang python
apt build-dep -yy --arch-only qemu clang python3

ENV VER 14.0.0
ENV VER 12.Dec.2023
ENV TOOLCHAIN_INSTALL /usr/local/clang+llvm-${VER}-cross-hexagon-unknown-linux-musl/
ENV ROOT_INSTALL /usr/local/hexagon-unknown-linux-musl-rootfs
ENV ARTIFACT_BASE /usr/local/hexagon-artifacts
Expand All @@ -56,24 +61,28 @@ ENV MAKE_TARBALLS 1
#ENV CMAKE_VER 3.16.6
#ENV CMAKE_URL https://github.com/Kitware/CMake/releases/download/v3.16.6/cmake-3.16.6-Linux-x86_64.tar.gz

ENV LLVM_SRC_URL https://github.com/llvm/llvm-project/archive/llvmorg-${VER}.tar.gz
#ARG QEMU_REPO=https://github.com/quic/qemu
#ARG QEMU_SHA=master
ARG QEMU_SRC_URL=https://download.qemu.org/qemu-6.2.0.tar.xz
#ENV LLVM_SRC_URL https://github.com/llvm/llvm-project/archive/llvmorg-${VER}.tar.gz
ENV LLVM_SRC_URL https://github.com/llvm/llvm-project/archive/a930fec033a80bc92f5a11cc334ff4fc44cbe0ca.tar.gz

ARG QEMU_REPO=https://github.com/quic/qemu
ARG QEMU_REF=hexagon-sysemu-12-dec-2023

ENV MUSL_SRC_URL https://github.com/quic/musl/archive/7243e0d3a9d7e0f08d21fc194a05749e0bb26725.tar.gz
ENV LINUX_SRC_URL https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.14.tar.xz
ENV LINUX_SRC_URL https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.4.13.tar.xz

#ENV PYTHON_SRC_URL https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
#ADD get-host-clang-cmake-python.sh /root/hexagon-toolchain/get-host-clang-cmake-python.sh
#RUN cd /root/hexagon-toolchain && ./get-host-clang-cmake-python.sh

ADD test-suite-patches /root/hexagon-toolchain/test-suite-patches
ADD get-src-tarballs.sh /root/hexagon-toolchain/get-src-tarballs.sh
ADD *.cmake /root/hexagon-toolchain/
RUN cd /root/hexagon-toolchain && ./get-src-tarballs.sh ${PWD} ${TOOLCHAIN_INSTALL}/manifest

ENV IN_CONTAINER 1
ARG ARTIFACT_TAG=${VER}
ADD build-toolchain.sh /root/hexagon-toolchain/build-toolchain.sh
RUN cd /root/hexagon-toolchain && ./build-toolchain.sh 14.0.0
RUN cd /root/hexagon-toolchain && ./build-toolchain.sh ${ARTIFACT_TAG}

ARG TEST_TOOLCHAIN=1

Expand Down
36 changes: 36 additions & 0 deletions README.md
Expand Up @@ -6,3 +6,39 @@ Check the releases page for links to binary cross toolchain releases. These can

## License
Toolchain for Hexagon is licensed under the BSD 3-clause "New" or "Revised" License. Check out the [LICENSE](LICENSE) for more details.


## Usage

Checkout the required source repos like `llvm-project`, `musl`, etc. Invoke
`get-src-tarballs.sh` with the corresponding `*_SRC_URL` links to the specific
releases to use (see `Dockerfile` for reference / last-known-good versions).
Or instead you can check out the trunk of those projects' repos using
`git` - try invoking `get_src_repos.sh`.

Once the source repos are setup, build the toolchain using `build-toolchain.sh`.

`build-toolchain.sh` / `build-rootfs.sh` expect the inputs below as environment
variables:

* `ARTIFACT_TAG` - the tag from the llvm-project repo with which this release
should be labeled.
* `TOOLCHAIN_INSTALL` - the path to install the toolchain to.
* `ROOT_INSTALL` - the path to install the rootfs to. Initially this will
only contain the target includes + libraries.
* `ARTIFACT_BASE` - the path to put the tarballs + manifests.
* optional `MAKE_TARBALLS` - if `MAKE_TARBALLS` is set to `1`, it will create
tarballs of the release and purge the intermediate build artifacts.

Sample usage:

export ARTIFACT_TAG=17.0.0
export TOOLCHAIN_INSTALL=$PWD/clang+llvm-${ARTIFACT_TAG}-cross-hexagon-unknown-linux-musl
export ROOT_INSTALL=$PWD/install_rootfs
export ARTIFACT_BASE=$PWD/artifacts

mkdir -p ${ARTIFACT_BASE}

./build-toolchain.sh 2>&1 | tee build_${ARTIFACT_TAG}.log
BUSYBOX_SRC_URL=https://busybox.net/downloads/busybox-1.33.1.tar.bz2 \
./build-rootfs.sh 2>&1 | tee build_root.log
23 changes: 11 additions & 12 deletions build-rootfs.sh
Expand Up @@ -70,10 +70,9 @@ build_busybox() {

build_canadian_clang() {
cd ${BASE}
mkdir -p obj_canadian
cd obj_canadian

cmake -G Ninja \
PATH=${TOOLCHAIN_BIN}:${PATH} \
cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX:PATH=${ROOTFS} \
-DLLVM_CCACHE_BUILD:BOOL=OFF \
Expand All @@ -82,20 +81,16 @@ build_canadian_clang() {
-DLLVM_ENABLE_TERMINFO:BOOL=OFF \
-DCMAKE_CROSSCOMPILING:BOOL=ON \
-DCMAKE_SYSTEM_NAME:STRING=Linux \
-DCMAKE_C_COMPILER:STRING="${TOOLCHAIN_BIN}/hexagon-unknown-linux-musl-clang" \
-DCMAKE_ASM_COMPILER:STRING="${TOOLCHAIN_BIN}/hexagon-unknown-linux-musl-clang" \
-DCMAKE_CXX_COMPILER:STRING="${TOOLCHAIN_BIN}/hexagon-unknown-linux-musl-clang++" \
-DLLVM_CONFIG_PATH=${TOOLCHAIN_BIN}/llvm-config \
-DLLVM_TABLEGEN=${TOOLCHAIN_BIN}/llvm-tblgen \
-DCLANG_TABLEGEN=${BASE}/obj_llvm/bin/clang-tblgen \
-DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF \
-DLLVM_BUILD_BENCHMARKS:BOOL=OFF \
-DCMAKE_C_FLAGS:STRING="-G0 -mlong-calls" \
-DCMAKE_CXX_FLAGS:STRING="-G0 -mlong-calls" \
-DLLVM_DEFAULT_TARGET_TRIPLE=hexagon-unknown-linux-musl \
-DLLVM_TARGET_ARCH="Hexagon" \
-DLLVM_BUILD_RUNTIME:BOOL=OFF \
-DBUILD_SHARED_LIBS:BOOL=OFF \
-DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF \
-DLLVM_BUILD_BENCHMARKS:BOOL=OFF \
-DLLVM_INCLUDE_TESTS:BOOL=OFF \
-DLLVM_INCLUDE_EXAMPLES:BOOL=OFF \
-DLLVM_INCLUDE_UTILS:BOOL=OFF \
Expand All @@ -104,10 +99,13 @@ build_canadian_clang() {
-DLLVM_ENABLE_PIC:BOOL=OFF \
-DLLVM_TARGETS_TO_BUILD:STRING="Hexagon" \
-DLLVM_ENABLE_PROJECTS:STRING="clang;lld" \
../llvm-project/llvm
-C ./hexagon-unknown-linux-musl-clang.cmake \
-C ./hexagon-linux-cross.cmake \
-B ./obj_canadian \
-S ./llvm-project/llvm

ninja -v
ninja -v install
cmake --build ./obj_canadian -- -v
cmake --build ./obj_canadian -- -v install
}

build_dropbear() {
Expand Down Expand Up @@ -144,6 +142,7 @@ build_kernel() {
LLVM_IAS=1 \
KBUILD_VERBOSE=1 \
vmlinux
install -D ../obj_linux/vmlinux ${ROOTFS}/boot/vmlinux
}

get_src_tarballs() {
Expand Down