| #!/usr/bin/env bash |
| # Copyright 2016 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| |
| # N.B. This must be an absolute path. |
| readonly ROOT_DIR="$(dirname "${SCRIPT_DIR}")" |
| |
| readonly HOST_ARCH=$(uname -m) |
| readonly HOST_OS=$(uname | tr '[:upper:]' '[:lower:]') |
| readonly HOST_TRIPLE="${HOST_ARCH}-${HOST_OS}" |
| |
| if [[ "x${HOST_OS}" == "xlinux" ]]; then |
| readonly DEFAULT_JOBS=$(grep ^processor /proc/cpuinfo | wc -l) |
| readonly CMAKE_HOST_TOOLS="\ |
| -DCMAKE_MAKE_PROGRAM=${ROOT_DIR}/buildtools/ninja \ |
| -DCMAKE_C_COMPILER=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/clang \ |
| -DCMAKE_CXX_COMPILER=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/clang++ \ |
| -DCMAKE_AR=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-ar \ |
| -DCMAKE_NM=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-nm \ |
| -DCMAKE_RANLIB=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-ranlib \ |
| -DCMAKE_OBJDUMP=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-objdump \ |
| -DCMAKE_OBJCOPY=false \ |
| -DCMAKE_STRIP=false" |
| readonly LLVM_CONFIG_OPTS="-DLLVM_ENABLE_LLD=ON" |
| elif [[ "x${HOST_OS}" == "xdarwin" ]]; then |
| readonly DEFAULT_JOBS=$(sysctl -n hw.ncpu) |
| readonly CMAKE_HOST_TOOLS="\ |
| -DCMAKE_MAKE_PROGRAM=${ROOT_DIR}/buildtools/ninja" |
| else |
| echo "Unsupported system: ${HOST_OS}" 1>&2 |
| exit 1 |
| fi |
| |
| set -eo pipefail; [[ "${TRACE}" ]] && set -x |
| |
| usage() { |
| printf >&2 '%s: [-c] [-o outdir] [-d destdir] [-j jobs]\n' "$0" |
| echo >&2 "-c: clean the build directories first" |
| echo >&2 "-o outdir: build the tools here" |
| echo >&2 "-d destdir: install the tools here" |
| echo >&2 "-j jobs: passed to make/ninja" |
| exit 1 |
| } |
| |
| build() { |
| local outdir="$1" destdir="$2" clean="$3" jobs="$4" |
| local toolchain="${destdir}/clang+llvm-${HOST_TRIPLE}" |
| |
| if [[ "${clean}" = "true" ]]; then |
| rm -rf -- "${outdir}/build-binutils-gdb-${HOST_TRIPLE}" "${outdir}/build-clang+llvm-${HOST_TRIPLE}" "${outdir}/build-compiler-rt-aarch64+x86_64" "${outdir}/build-shaderc-${HOST_TRIPLE}" |
| fi |
| |
| rm -rf -- "${toolchain}" && mkdir -p -- "${toolchain}" |
| |
| mkdir -p -- "${outdir}/build-binutils-gdb-${HOST_TRIPLE}" |
| pushd "${outdir}/build-binutils-gdb-${HOST_TRIPLE}" |
| [[ -f "${outdir}/build-binutils-gdb-${HOST_TRIPLE}/Makefile" ]] || ${ROOT_DIR}/third_party/binutils-gdb/configure \ |
| --prefix='' \ |
| --program-prefix='' \ |
| --enable-targets=arm-elf,aarch64-elf,x86_64-elf \ |
| --enable-deterministic-archives \ |
| --disable-werror \ |
| --disable-nls |
| make -j "${jobs}" all-binutils |
| mkdir -p -- "${toolchain}/bin" |
| cp -- "${outdir}/build-binutils-gdb-${HOST_TRIPLE}/binutils/objcopy" "${toolchain}/bin/objcopy" |
| cp -- "${outdir}/build-binutils-gdb-${HOST_TRIPLE}/binutils/strip-new" "${toolchain}/bin/strip" |
| popd |
| |
| mkdir -p -- "${outdir}/build-clang+llvm-${HOST_TRIPLE}" |
| pushd "${outdir}/build-clang+llvm-${HOST_TRIPLE}" |
| [[ -f "${outdir}/build-clang+llvm-${HOST_TRIPLE}/build.ninja" ]] || ${ROOT_DIR}/buildtools/cmake/bin/cmake -GNinja \ |
| ${CMAKE_HOST_TOOLS:-} \ |
| ${LLVM_CONFIG_OPTS:-} \ |
| -DCMAKE_BUILD_TYPE=Release \ |
| -DCMAKE_INSTALL_PREFIX='' \ |
| -DLLVM_APPEND_VC_REV=ON \ |
| -DLLVM_ENABLE_LIBCXX=ON \ |
| -DLLVM_ENABLE_LTO=ON \ |
| -DLLVM_TARGETS_TO_BUILD='ARM;AArch64;X86' \ |
| -DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \ |
| -DLLVM_TOOLCHAIN_TOOLS='llvm-ar;llvm-cxxfilt;llvm-ranlib;llvm-dwarfdump;llvm-objdump;llvm-readobj;llvm-nm;llvm-size;llvm-symbolizer' \ |
| ${ROOT_DIR}/third_party/llvm |
| env LD_LIBRARY_PATH="${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/lib" DESTDIR="${toolchain}" ${ROOT_DIR}/buildtools/ninja -j "${jobs}" install |
| popd |
| |
| mkdir -p -- "${outdir}/build-compiler-rt-aarch64+x86_64" |
| pushd "${outdir}/build-compiler-rt-aarch64+x86_64" |
| [[ -f "${outdir}/build-compiler-rt-aarch64+x86_64/build.ninja" ]] || CFLAGS="-fPIC -isystem ${ROOT_DIR}/magenta/third_party/ulib/musl/include" ${ROOT_DIR}/buildtools/cmake/bin/cmake -GNinja \ |
| -DCMAKE_MAKE_PROGRAM=${ROOT_DIR}/buildtools/ninja \ |
| -DCMAKE_C_COMPILER=${toolchain}/bin/clang \ |
| -DCMAKE_CXX_COMPILER=${toolchain}/bin/clang++ \ |
| -DCMAKE_AR=${toolchain}/bin/llvm-ar \ |
| -DCMAKE_NM=${toolchain}/bin/llvm-nm \ |
| -DCMAKE_RANLIB=${toolchain}/bin/llvm-ranlib \ |
| -DCMAKE_OBJDUMP=${toolchain}/llvm-objdump \ |
| -DCMAKE_BUILD_TYPE=Release \ |
| -DCMAKE_INSTALL_PREFIX= \ |
| -DCMAKE_TOOLCHAIN_FILE=${ROOT_DIR}/third_party/llvm/cmake/platforms/Fuchsia.cmake \ |
| -DLLVM_CONFIG_PATH=${outdir}/build-clang+llvm-${HOST_TRIPLE}/bin/llvm-config \ |
| ${ROOT_DIR}/third_party/llvm/runtimes/compiler-rt/lib/builtins |
| env DESTDIR="${toolchain}" ${ROOT_DIR}/buildtools/ninja -j "${jobs}" install |
| popd |
| |
| mkdir -p -- "${outdir}/build-shaderc-${HOST_TRIPLE}" |
| pushd "${outdir}/build-shaderc-${HOST_TRIPLE}" |
| [[ -f "${outdir}/build-shaderc-${HOST_TRIPLE}/build.ninja" ]] || ${ROOT_DIR}/buildtools/cmake/bin/cmake -GNinja \ |
| ${CMAKE_HOST_TOOLS:-} \ |
| -DCMAKE_BUILD_TYPE=Release \ |
| -DCMAKE_INSTALL_PREFIX='' \ |
| -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ |
| -DCMAKE_INSTALL_RPATH="\$ORIGIN/../lib" \ |
| -DCMAKE_CXX_FLAGS="-stdlib=libc++" \ |
| -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" \ |
| -DSHADERC_SKIP_TESTS=ON \ |
| -DSPIRV_SKIP_TESTS=ON \ |
| ${ROOT_DIR}/third_party/shaderc |
| ${ROOT_DIR}/buildtools/ninja -j "${jobs}" |
| cp -- glslc/glslc third_party/spirv-tools/tools/spirv-as third_party/spirv-tools/tools/spirv-dis third_party/spirv-tools/tools/spirv-val ${toolchain}/bin |
| popd |
| |
| local stamp="$(LC_ALL=POSIX cat $(find "${toolchain}" -type f | sort) | shasum -a1 | awk '{print $1}')" |
| echo "${stamp}" > "${toolchain}/.stamp" |
| } |
| |
| declare CLEAN="${CLEAN:-false}" |
| declare OUTDIR="${OUTDIR:-${ROOT_DIR}/out}" |
| declare DESTDIR="${DESTDIR:-${OUTDIR}/toolchain}" |
| declare JOBS="${DEFAULT_JOBS}" |
| |
| while getopts "cd:j:o:" opt; do |
| case "${opt}" in |
| c) CLEAN="true" ;; |
| d) DESTDIR="${OPTARG}" ;; |
| j) JOBS="${OPTARG}" ;; |
| o) OUTDIR="${OPTARG}" ;; |
| *) usage;; |
| esac |
| done |
| |
| absolute_path() { |
| local -r path="$1" |
| case "$path" in |
| /*) echo "$path" ;; |
| *) echo "$(pwd)/$path" ;; |
| esac |
| } |
| |
| # These must be absolute paths. |
| OUTDIR=$(absolute_path "${OUTDIR}") |
| DESTDIR=$(absolute_path "${DESTDIR}") |
| |
| readonly CLEAN OUTDIR DESTDIR JOBS |
| |
| build "${OUTDIR}" "${DESTDIR}" "${CLEAN}" "${JOBS}" |