#git clone https://github.com/llvm/llvm-project
#git clone https://github.com/quic/musl -b hexagon
#git clone https://github.com/torvalds/linux

TOP="$PWD"
PREFIX="$PWD"/ccc
TYPE=hexagon-unknown-linux-musl
CROSS="$PREFIX"/cross_bin/$TYPE-
USR="$PREFIX/$TYPE/usr"

# Build clang/llvm

mkdir -p build-llvm && cd build-llvm &&
# yanked -DLLVM_ENABLE_LLD=ON
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX \
    -DLLVM_ENABLE_PROJECTS="clang;lld" "$TOP/llvm-project/llvm" \
    -DLLVM_TARGETS_TO_BUILD="Hexagon" &&
ninja all install &&
echo "-G0 --sysroot='$PREFIX/$TYPE'" > "$PREFIX"/bin/$TYPE.cfg &&
mkdir $PREFIX/cross_bin &&
ln -sf ../bin/clang "$CROSS"cc &&
ln -sf ../bin/clang++ "$CROSS"c++ &&
ln -sf ../bin/lld "$CROSS"ld &&
for i in ar nm objdump objcopy readelf ranlib
do ln -sf ../bin/llvm-$i "$CROSS"$i; done &&
cd .. && rm -rf build-llvm || exit 1

# Add it to the path, create arch directory.

export PATH="$PREFIX/cross_bin:$PATH"
mkdir -p "$USR"

# Install kernel and musl headers
(cd linux && make ARCH=hexagon INSTALL_HDR_PATH="$USR" \
   distclean comet_defconfig headers_install) || exit 1
(cd musl && make clean &&
 CROSS_COMPILE="$CROSS" ./configure --target=hexagon --prefix=/ &&
 make DESTDIR="$USR" install-headers) || exit 1

# build clang-rt: depends on the userspace headers for some reason?!??
mkdir -p build-rt && cd build-rt &&
cmake -G Ninja \
    -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME=Linux \
    -DLLVM_CONFIG_PATH="$PREFIX/bin/llvm-config" \
    -DCMAKE_ASM_FLAGS="-G0 -mlong-calls -fno-pic --target=$TYPE " \
    -DCMAKE_C_COMPILER="${CROSS}cc" -DCMAKE_ASM_COMPILER="${CROSS}cc" \
    -DCMAKE_INSTALL_PREFIX="$USR" -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" "$TOP/llvm-project/compiler-rt" &&
ninja install-compiler-rt &&
cd .. && rm -rf build-rt || exit 1

# build musl
cd musl && make clean &&
CROSS_COMPILE="$CROSS" LIBCC="$USR"/lib/libclang_rt.builtins-hexagon.a \
  ./configure --target=hexagon --prefix=/ &&
make -j $(nproc) DESTDIR="$USR" install
