diff mbox series

[v8,35/35] Add Dockerfile for hexagon

Message ID 1612763186-18161-36-git-send-email-tsimpson@quicinc.com
State New
Headers show
Series [v8,01/35] Hexagon Update MAINTAINERS file | expand

Commit Message

Taylor Simpson Feb. 8, 2021, 5:46 a.m. UTC
From: Alessandro Di Federico <ale@rev.ng>

Signed-off-by: Alessandro Di Federico <ale@rev.ng>
Tested-by: Taylor Simpson <tsimpson@quicinc.com>
---
 .../debian-hexagon-cross-build-local.docker        |  18 +++
 .../debian-hexagon-cross.build-toolchain.sh        | 141 +++++++++++++++++++++
 .../docker/dockerfiles/debian-hexagon-cross.docker |   1 +
 tests/tcg/configure.sh                             |   4 +
 4 files changed, 164 insertions(+)
 create mode 100644 tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
 create mode 100755 tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh
 create mode 100644 tests/docker/dockerfiles/debian-hexagon-cross.docker

Comments

Philippe Mathieu-Daudé Feb. 14, 2021, 6:50 p.m. UTC | #1
Hi Alessandro!

On 2/8/21 6:46 AM, Taylor Simpson wrote:
> From: Alessandro Di Federico <ale@rev.ng>
> 
> Signed-off-by: Alessandro Di Federico <ale@rev.ng>
> Tested-by: Taylor Simpson <tsimpson@quicinc.com>
> ---
>  .../debian-hexagon-cross-build-local.docker        |  18 +++
>  .../debian-hexagon-cross.build-toolchain.sh        | 141 +++++++++++++++++++++
>  .../docker/dockerfiles/debian-hexagon-cross.docker |   1 +
>  tests/tcg/configure.sh                             |   4 +
>  4 files changed, 164 insertions(+)
>  create mode 100644 tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
>  create mode 100755 tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh
>  create mode 100644 tests/docker/dockerfiles/debian-hexagon-cross.docker
> 
> diff --git a/tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker b/tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
> new file mode 100644
> index 0000000..355adbf
> --- /dev/null
> +++ b/tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
> @@ -0,0 +1,18 @@
> +FROM debian:10
> +
> +RUN apt update && \
> +    DEBIAN_FRONTEND=noninteractive \
> +    apt install -y --no-install-recommends \
> +        ca-certificates build-essential cmake clang lld ninja-build \
> +	flex bison pkg-config wget python3 rsync
> +
> +ENV TOOLCHAIN_INSTALL /usr
> +ENV ROOTFS /usr
> +
> +ENV LLVM_URL https://github.com/llvm/llvm-project/archive/3d8149c2a1228609fd7d7c91a04681304a2f0ca9.tar.gz
> +ENV MUSL_URL https://github.com/quic/musl/archive/aff74b395fbf59cd7e93b3691905aa1af6c0778c.tar.gz
> +ENV LINUX_URL https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
> +
> +COPY debian-hexagon-cross.build-toolchain.sh /root/hexagon-toolchain/

I had to add this to build your image with QEMU build system:

-- >8 --
diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
index 93b29ad823e..ba73fb4b1f0 100644
--- a/tests/docker/Makefile.include
+++ b/tests/docker/Makefile.include
@@ -146,6 +146,8 @@ docker-image-debian-riscv64-cross: docker-image-debian10
 docker-image-debian-s390x-cross: docker-image-debian10
 docker-image-debian-sh4-cross: docker-image-debian10
 docker-image-debian-sparc64-cross: docker-image-debian10
+docker-image-debian-hexagon-cross-build-local: \
+
EXTRA_FILES:=$(SRC_PATH)/tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh

 docker-image-travis: NOUSER=1

---

> +++ b/tests/docker/dockerfiles/debian-hexagon-cross.docker
> @@ -0,0 +1 @@
> +FROM revng/qemu:debian-hexagon-cross

Once this patch gets merged, the image will be available on
qemu/qemu:debian-hexagon-cross.

I suppose for the final merge patch we want:
- rm debian-hexagon-cross.docker
- mv debian-hexagon-cross-build-local.docker debian-hexagon-cross.docker

Is that correct? If so, can you amend that detail after the '---'
separator of the commit description so we don't merge this patch
as it?

Also, can you add a job to build your image in .gitlab-ci.d/containers.yml?

Meanwhile:
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Regards,

Phil.
Philippe Mathieu-Daudé Feb. 17, 2021, 5:33 p.m. UTC | #2
On 2/17/21 6:23 PM, Alessandro Di Federico via wrote:
> On Sun, 14 Feb 2021 19:50:41 +0100
> Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> 
>> Hi Alessandro!
> 
> Hi Philippe!
> 
>> I had to add this to build your image with QEMU build system:
>>
>> -- >8 --  
>>
>> diff --git a/tests/docker/Makefile.include
>> b/tests/docker/Makefile.include index 93b29ad823e..ba73fb4b1f0 100644
>> --- a/tests/docker/Makefile.include
>> +++ b/tests/docker/Makefile.include
>> @@ -146,6 +146,8 @@ docker-image-debian-riscv64-cross:
>> docker-image-debian10 docker-image-debian-s390x-cross:
>> docker-image-debian10 docker-image-debian-sh4-cross:
>> docker-image-debian10 docker-image-debian-sparc64-cross:
>> docker-image-debian10
>> +docker-image-debian-hexagon-cross-build-local:
>> \
>> +
>> EXTRA_FILES:=$(SRC_PATH)/tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh
>>
>>  docker-image-travis: NOUSER=1
>>
>> ---
> 
> OK, I'll drop `-local` (see below).
> 
>>> +++ b/tests/docker/dockerfiles/debian-hexagon-cross.docker
>>> @@ -0,0 +1 @@
>>> +FROM revng/qemu:debian-hexagon-cross  
>>
>> Once this patch gets merged, the image will be available on
>> qemu/qemu:debian-hexagon-cross.
>>
>> I suppose for the final merge patch we want:
>> - rm debian-hexagon-cross.docker
>> - mv debian-hexagon-cross-build-local.docker
>> debian-hexagon-cross.docker
>>
>> Is that correct?
> 
> The `revng/qemu:debian-hexagon-cross` image was there only to let
> people quickly try out a toolchain without building it from source.

OK, not obvious from the commit description ;)

> If building from source is OK with you, that works for us.
> In any case, people will be able to use
> `qemu/qemu:debian-hexagon-cross`, right?

If you add a job to build it (see .gitlab-ci.d/containers.yml)
it will then be pushed to the Gitlab QEMU namespace. So Yes.

When we need a Docker image to build things, we first try to pull
from QEMU namespace, then build locally if not available
(see tests/docker/Makefile.include).

>> If so, can you amend that detail after the '---'
>> separator of the commit description so we don't merge this patch
>> as it?
> 
> I'm a bit confused, do you want me to send a patch corrected by hand
> here?
> I'll send a new patch tomorrow.

I basically meant, "If this is the case and you want to keep it as it,
please describe this better, so this patch doesn't get merged".

>> Also, can you add a job to build your image in
>> .gitlab-ci.d/containers.yml?
> 
> OK, is there a quick way for me to test changes I make to that file?

Open a Gitlab account, clone QEMU, push your change :)

https://wiki.qemu.org/Testing/CI/GitLabCI

Regards,

Phil.
Philippe Mathieu-Daudé Feb. 27, 2021, 2:10 p.m. UTC | #3
On 2/8/21 6:46 AM, Taylor Simpson wrote:
> From: Alessandro Di Federico <ale@rev.ng>
> 
> Signed-off-by: Alessandro Di Federico <ale@rev.ng>
> Tested-by: Taylor Simpson <tsimpson@quicinc.com>
> ---
>  .../debian-hexagon-cross-build-local.docker        |  18 +++
>  .../debian-hexagon-cross.build-toolchain.sh        | 141 +++++++++++++++++++++
>  .../docker/dockerfiles/debian-hexagon-cross.docker |   1 +
>  tests/tcg/configure.sh                             |   4 +
>  4 files changed, 164 insertions(+)
>  create mode 100644 tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
>  create mode 100755 tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh
>  create mode 100644 tests/docker/dockerfiles/debian-hexagon-cross.docker
...

> +build_llvm_clang() {
> +  fetch "$BASE/llvm-project" "$LLVM_URL"
> +  cdp "$BASE/build-llvm"
> +
> +  cmake -G Ninja \
> +    -DCMAKE_BUILD_TYPE=Release \
> +    -DCMAKE_INSTALL_PREFIX=${TOOLCHAIN_INSTALL} \
> +    -DLLVM_ENABLE_LLD=ON \
> +    -DLLVM_TARGETS_TO_BUILD="X86;Hexagon" \

Is the X86 target really required?

> +    -DLLVM_ENABLE_PROJECTS="clang;lld" \
> +    "$BASE/llvm-project/llvm"
> +  ninja all install
> +  cd ${TOOLCHAIN_BIN}
> +  ln -sf clang hexagon-unknown-linux-musl-clang
> +  ln -sf clang++ hexagon-unknown-linux-musl-clang++
> +  ln -sf llvm-ar hexagon-unknown-linux-musl-ar
> +  ln -sf llvm-objdump hexagon-unknown-linux-musl-objdump
> +  ln -sf llvm-objcopy hexagon-unknown-linux-musl-objcopy
> +  ln -sf llvm-readelf hexagon-unknown-linux-musl-readelf
> +  ln -sf llvm-ranlib hexagon-unknown-linux-musl-ranlib
> +
> +  # workaround for now:
> +  cat <<EOF > hexagon-unknown-linux-musl.cfg
> +-G0 --sysroot=${HEX_SYSROOT}
> +EOF
> +}
Brian Cain Feb. 27, 2021, 2:32 p.m. UTC | #4
> -----Original Message-----
> From: Philippe Mathieu-Daudé <philippe.mathieu.daude@gmail.com> On
> Behalf Of Philippe Mathieu-Daudé
> Sent: Saturday, February 27, 2021 8:10 AM
> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org
> Cc: richard.henderson@linaro.org; alex.bennee@linaro.org;
> laurent@vivier.eu; ale@rev.ng; Brian Cain <bcain@quicinc.com>; Fam Zheng
> <fam@euphon.net>
> Subject: [EXT] Re: [PATCH v8 35/35] Add Dockerfile for hexagon
>
> On 2/8/21 6:46 AM, Taylor Simpson wrote:
> > From: Alessandro Di Federico <ale@rev.ng>
> >
> > Signed-off-by: Alessandro Di Federico <ale@rev.ng>
> > Tested-by: Taylor Simpson <tsimpson@quicinc.com>
> > ---
> >  .../debian-hexagon-cross-build-local.docker        |  18 +++
> >  .../debian-hexagon-cross.build-toolchain.sh        | 141
> +++++++++++++++++++++
> >  .../docker/dockerfiles/debian-hexagon-cross.docker |   1 +
> >  tests/tcg/configure.sh                             |   4 +
> >  4 files changed, 164 insertions(+)
> >  create mode 100644
> > tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
> >  create mode 100755
> > tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh
> >  create mode 100644
> > tests/docker/dockerfiles/debian-hexagon-cross.docker
> ...
>
> > +build_llvm_clang() {
> > +  fetch "$BASE/llvm-project" "$LLVM_URL"
> > +  cdp "$BASE/build-llvm"
> > +
> > +  cmake -G Ninja \
> > +    -DCMAKE_BUILD_TYPE=Release \
> > +    -DCMAKE_INSTALL_PREFIX=${TOOLCHAIN_INSTALL} \
> > +    -DLLVM_ENABLE_LLD=ON \
> > +    -DLLVM_TARGETS_TO_BUILD="X86;Hexagon" \
>
> Is the X86 target really required?

No, it isn't.  When I was developing this recipe it was useful to have as another backend to compare against.  Also many of the tests of target-independent functionality require the x86 backend, so it was useful during experimentation to check for regressions.

> > +    -DLLVM_ENABLE_PROJECTS="clang;lld" \
> > +    "$BASE/llvm-project/llvm"
> > +  ninja all install
> > +  cd ${TOOLCHAIN_BIN}
> > +  ln -sf clang hexagon-unknown-linux-musl-clang  ln -sf clang++
> > + hexagon-unknown-linux-musl-clang++
> > +  ln -sf llvm-ar hexagon-unknown-linux-musl-ar  ln -sf llvm-objdump
> > + hexagon-unknown-linux-musl-objdump
> > +  ln -sf llvm-objcopy hexagon-unknown-linux-musl-objcopy
> > +  ln -sf llvm-readelf hexagon-unknown-linux-musl-readelf
> > +  ln -sf llvm-ranlib hexagon-unknown-linux-musl-ranlib
> > +
> > +  # workaround for now:
> > +  cat <<EOF > hexagon-unknown-linux-musl.cfg
> > +-G0 --sysroot=${HEX_SYSROOT}
> > +EOF
> > +}
diff mbox series

Patch

diff --git a/tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker b/tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
new file mode 100644
index 0000000..355adbf
--- /dev/null
+++ b/tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker
@@ -0,0 +1,18 @@ 
+FROM debian:10
+
+RUN apt update && \
+    DEBIAN_FRONTEND=noninteractive \
+    apt install -y --no-install-recommends \
+        ca-certificates build-essential cmake clang lld ninja-build \
+	flex bison pkg-config wget python3 rsync
+
+ENV TOOLCHAIN_INSTALL /usr
+ENV ROOTFS /usr
+
+ENV LLVM_URL https://github.com/llvm/llvm-project/archive/3d8149c2a1228609fd7d7c91a04681304a2f0ca9.tar.gz
+ENV MUSL_URL https://github.com/quic/musl/archive/aff74b395fbf59cd7e93b3691905aa1af6c0778c.tar.gz
+ENV LINUX_URL https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
+
+COPY debian-hexagon-cross.build-toolchain.sh /root/hexagon-toolchain/
+
+RUN cd /root/hexagon-toolchain/ && ./debian-hexagon-cross.build-toolchain.sh && cd / && rm -rf /root/hexagon-toolchain/
diff --git a/tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh b/tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh
new file mode 100755
index 0000000..a08c6cd
--- /dev/null
+++ b/tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh
@@ -0,0 +1,141 @@ 
+#!/bin/bash
+
+set -e
+
+BASE=$(readlink -f ${PWD})
+
+TOOLCHAIN_INSTALL=$(readlink -f "$TOOLCHAIN_INSTALL")
+ROOTFS=$(readlink -f "$ROOTFS")
+
+TOOLCHAIN_BIN=${TOOLCHAIN_INSTALL}/bin
+HEX_SYSROOT=${TOOLCHAIN_INSTALL}/hexagon-unknown-linux-musl
+HEX_TOOLS_TARGET_BASE=${HEX_SYSROOT}/usr
+
+function cdp() {
+  DIR="$1"
+  mkdir -p "$DIR"
+  cd "$DIR"
+}
+
+function fetch() {
+  DIR="$1"
+  URL="$2"
+  TEMP="$(readlink -f "$PWD/tmp.tar.gz")"
+  wget --quiet "$URL" -O "$TEMP"
+  cdp "$DIR"
+  tar xaf "$TEMP" --strip-components=1
+  rm "$TEMP"
+  cd -
+}
+
+build_llvm_clang() {
+  fetch "$BASE/llvm-project" "$LLVM_URL"
+  cdp "$BASE/build-llvm"
+
+  cmake -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_INSTALL_PREFIX=${TOOLCHAIN_INSTALL} \
+    -DLLVM_ENABLE_LLD=ON \
+    -DLLVM_TARGETS_TO_BUILD="X86;Hexagon" \
+    -DLLVM_ENABLE_PROJECTS="clang;lld" \
+    "$BASE/llvm-project/llvm"
+  ninja all install
+  cd ${TOOLCHAIN_BIN}
+  ln -sf clang hexagon-unknown-linux-musl-clang
+  ln -sf clang++ hexagon-unknown-linux-musl-clang++
+  ln -sf llvm-ar hexagon-unknown-linux-musl-ar
+  ln -sf llvm-objdump hexagon-unknown-linux-musl-objdump
+  ln -sf llvm-objcopy hexagon-unknown-linux-musl-objcopy
+  ln -sf llvm-readelf hexagon-unknown-linux-musl-readelf
+  ln -sf llvm-ranlib hexagon-unknown-linux-musl-ranlib
+
+  # workaround for now:
+  cat <<EOF > hexagon-unknown-linux-musl.cfg
+-G0 --sysroot=${HEX_SYSROOT}
+EOF
+}
+
+build_clang_rt() {
+  cdp "$BASE/build-clang_rt"
+  cmake -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DLLVM_CONFIG_PATH="$BASE/build-llvm/bin/llvm-config" \
+    -DCMAKE_ASM_FLAGS="-G0 -mlong-calls -fno-pic --target=hexagon-unknown-linux-musl " \
+    -DCMAKE_SYSTEM_NAME=Linux \
+    -DCMAKE_C_COMPILER="${TOOLCHAIN_BIN}/hexagon-unknown-linux-musl-clang" \
+    -DCMAKE_ASM_COMPILER="${TOOLCHAIN_BIN}/hexagon-unknown-linux-musl-clang" \
+    -DCMAKE_INSTALL_PREFIX=${HEX_TOOLS_TARGET_BASE} \
+    -DCMAKE_CROSSCOMPILING=ON \
+    -DCMAKE_C_COMPILER_FORCED=ON \
+    -DCMAKE_CXX_COMPILER_FORCED=ON \
+    -DCOMPILER_RT_BUILD_BUILTINS=ON \
+    -DCOMPILER_RT_BUILTINS_ENABLE_PIC=OFF \
+    -DCMAKE_SIZEOF_VOID_P=4 \
+    -DCOMPILER_RT_OS_DIR= \
+    -DCAN_TARGET_hexagon=1 \
+    -DCAN_TARGET_x86_64=0 \
+    -DCOMPILER_RT_SUPPORTED_ARCH=hexagon \
+    -DLLVM_ENABLE_PROJECTS="compiler-rt" \
+    "$BASE/llvm-project/compiler-rt"
+  ninja install-compiler-rt
+}
+
+build_musl_headers() {
+  fetch "$BASE/musl" "$MUSL_URL"
+  cd "$BASE/musl"
+  make clean
+  CC=${TOOLCHAIN_BIN}/hexagon-unknown-linux-musl-clang \
+    CROSS_COMPILE=hexagon-unknown-linux-musl \
+    LIBCC=${HEX_TOOLS_TARGET_BASE}/lib/libclang_rt.builtins-hexagon.a \
+    CROSS_CFLAGS="-G0 -O0 -mv65 -fno-builtin -fno-rounding-math --target=hexagon-unknown-linux-musl" \
+    ./configure --target=hexagon --prefix=${HEX_TOOLS_TARGET_BASE}
+  PATH=${TOOLCHAIN_BIN}:$PATH make CROSS_COMPILE= install-headers
+
+  cd ${HEX_SYSROOT}/..
+  ln -sf hexagon-unknown-linux-musl hexagon
+}
+
+build_kernel_headers() {
+  fetch "$BASE/linux" "$LINUX_URL"
+  mkdir -p "$BASE/build-linux"
+  cd "$BASE/linux"
+  make O=../build-linux ARCH=hexagon \
+   KBUILD_CFLAGS_KERNEL="-mlong-calls" \
+   CC=${TOOLCHAIN_BIN}/hexagon-unknown-linux-musl-clang \
+   LD=${TOOLCHAIN_BIN}/ld.lld \
+   KBUILD_VERBOSE=1 comet_defconfig
+  make mrproper
+
+  cd "$BASE/build-linux"
+  make \
+    ARCH=hexagon \
+    CC=${TOOLCHAIN_BIN}/clang \
+    INSTALL_HDR_PATH=${HEX_TOOLS_TARGET_BASE} \
+    V=1 \
+    headers_install
+}
+
+build_musl() {
+  cd "$BASE/musl"
+  make clean
+  CROSS_COMPILE=hexagon-unknown-linux-musl- \
+    AR=llvm-ar \
+    RANLIB=llvm-ranlib \
+    STRIP=llvm-strip \
+    CC=clang \
+    LIBCC=${HEX_TOOLS_TARGET_BASE}/lib/libclang_rt.builtins-hexagon.a \
+    CFLAGS="-G0 -O0 -mv65 -fno-builtin -fno-rounding-math --target=hexagon-unknown-linux-musl" \
+    ./configure --target=hexagon --prefix=${HEX_TOOLS_TARGET_BASE}
+  PATH=${TOOLCHAIN_BIN}/:$PATH make -j CROSS_COMPILE= install
+  cd ${HEX_TOOLS_TARGET_BASE}/lib
+  ln -sf libc.so ld-musl-hexagon.so
+  ln -sf ld-musl-hexagon.so ld-musl-hexagon.so.1
+  cdp ${HEX_TOOLS_TARGET_BASE}/../lib
+  ln -sf ../usr/lib/ld-musl-hexagon.so.1
+}
+
+build_llvm_clang
+build_kernel_headers
+build_musl_headers
+build_clang_rt
+build_musl
diff --git a/tests/docker/dockerfiles/debian-hexagon-cross.docker b/tests/docker/dockerfiles/debian-hexagon-cross.docker
new file mode 100644
index 0000000..92c586e
--- /dev/null
+++ b/tests/docker/dockerfiles/debian-hexagon-cross.docker
@@ -0,0 +1 @@ 
+FROM revng/qemu:debian-hexagon-cross
diff --git a/tests/tcg/configure.sh b/tests/tcg/configure.sh
index 35f1a77..4efb3f7 100755
--- a/tests/tcg/configure.sh
+++ b/tests/tcg/configure.sh
@@ -124,6 +124,10 @@  for target in $target_list; do
       container_image=fedora-cris-cross
       container_cross_cc=cris-linux-gnu-gcc
       ;;
+    hexagon-*)
+      container_image=debian-hexagon-cross
+      container_cross_cc=hexagon-unknown-linux-musl-clang
+      ;;
     hppa-*)
       container_image=debian-hppa-cross
       container_cross_cc=hppa-linux-gnu-gcc