• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2# Copyright (c) 2023 Huawei Device Co., Ltd.
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15set -euo pipefail
16
17# Required variables
18BUILD_DIR=${BUILD_DIR:-""}
19LLVM_SOURCES=${LLVM_SOURCES:-""}
20# Optional variables
21INSTALL_DIR=${INSTALL_DIR:-""}         # empty -- do not install
22VERSION=${VERSION:-"main"}             # Specifies build and install directory names:
23PACKAGE_VERSION=${PACKAGE_VERSION:-${VERSION}}
24BUILD_SUFFIX=${BUILD_SUFFIX:-""}       # llvm-<VERSION>-{debug,release}-{aarch64,x86}<BUILD_SUFFIX>
25OPTIMIZE_DEBUG=${OPTIMIZE_DEBUG:-true} # Compile debug versions with -O2
26DO_STRIPPING=${DO_STRIPPING:-true}     # checked only if install
27DO_TARS=${DO_TARS:-true}               # checked only if install
28# Select a target to build
29BUILD_X86_DEBUG=${BUILD_X86_DEBUG:-false}
30BUILD_X86_RELEASE=${BUILD_X86_RELEASE:-false}
31BUILD_AARCH64_DEBUG=${BUILD_AARCH64_DEBUG:-false}
32BUILD_AARCH64_RELEASE=${BUILD_AARCH64_RELEASE:-false}
33LLVM_COMPONENTS="cmake-exports;llvm-headers;LLVM"
34LLVM_COMPONENTS_PLUS_LINK="${LLVM_COMPONENTS};llvm-link"
35
36# Build tools
37CC=${CC:-"/usr/bin/clang-14"}
38CXX=${CXX:-"/usr/bin/clang++-14"}
39STRIP=${STRIP:-"/usr/bin/llvm-strip-14"}
40LLVM_TABLEGEN=${LLVM_TABLEGEN:-""}
41# Etc.
42NPROC=$(nproc)
43
44if [[ -z "${BUILD_DIR}" ]]; then
45    echo "Please, specify build directory with BUILD_DIR variable"
46    exit 1
47fi
48
49if [[ -z "${LLVM_SOURCES}" ]]; then
50    echo "Please, specify llvm sources directory with LLVM_SOURCES variable"
51    exit 1
52fi
53
54if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" || "x${BUILD_AARCH64_RELEASE}" == "xtrue" ]]; then
55    if [[ -n "${LLVM_TABLEGEN}" && ! -f "${LLVM_TABLEGEN}" ]]; then
56        echo "Provided LLVM_TABLEGEN '${LLVM_TABLEGEN}' does not exist"
57        exit 1
58    fi
59
60    if [[ -z "${LLVM_TABLEGEN}" ]]; then
61        qemu=$(which update-binfmts &> /dev/null && \
62               (update-binfmts --display || true) | grep -q "qemu-aarch64" && \
63               echo "true" || echo "false")
64
65        if [[ "x${qemu}" == "xfalse" && "x${BUILD_X86_DEBUG}" == "xfalse" && \
66              "x${BUILD_X86_RELEASE}" == "xfalse" ]]; then
67            echo "Cannot launch AArch64 builds without host llvm-tblgen."
68            echo "Please do something from listed below:"
69            echo "1) set LLVM_TABLEGEN variable to installed llvm-tblgen"
70            echo "2) install qemu-binfmt to transparently run AArch64 binaries"
71            echo "3) request one of X86 build using BUILD_X86_DEBUG or BUILD_X86_RELEASE."
72            echo "   llvm-tblgen will be used from build directory automatically."
73            exit 1
74        fi
75    fi
76fi
77
78DEBUG_OPT_FLAG=""
79if [[ "x${OPTIMIZE_DEBUG}" == "xtrue" ]]; then
80    DEBUG_OPT_FLAG="-O2"
81fi
82
83function install() {
84    local install_dir="$1"
85    local strip="$2"
86    local archive="$3"
87    if [[ "x${strip}" == "xtrue" ]]; then
88        ninja install-distribution-stripped
89    else
90        ninja install-distribution
91    fi
92    if [[ "x${archive}" == "xtrue" ]]; then
93        tar cJf "${install_dir}.tar.xz" -C "${install_dir}" .
94        du -h "${install_dir}.tar.xz"
95    fi
96}
97
98AUTO_LLVM_TABLEGEN=""
99if [[ "x${BUILD_X86_DEBUG}" == "xtrue" ]]; then
100    TARGET="x86_64${BUILD_SUFFIX}"
101    INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}"
102    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
103    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
104    mkdir -p "${BUILD_PREFIX}"
105    cd "${BUILD_PREFIX}"
106    cmake -G Ninja \
107        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
108        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
109        -DCMAKE_BUILD_TYPE=Debug \
110        \
111        -DCMAKE_C_FLAGS="${DEBUG_OPT_FLAG}" -DCMAKE_CXX_FLAGS="${DEBUG_OPT_FLAG}" \
112        \
113        -DCMAKE_C_COMPILER="${CC}" \
114        -DCMAKE_CXX_COMPILER="${CXX}" \
115        -DCMAKE_STRIP="${STRIP}" \
116        \
117        -DLLVM_ENABLE_FFI=OFF \
118        -DLLVM_ENABLE_TERMINFO=OFF \
119        \
120        -DLLVM_INCLUDE_BENCHMARKS=OFF \
121        -DLLVM_INCLUDE_EXAMPLES=OFF \
122        -DLLVM_INCLUDE_TESTS=OFF \
123        \
124        -DLLVM_BUILD_TOOLS=ON \
125        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
126        -DLLVM_BUILD_LLVM_DYLIB=ON \
127        -DLLVM_ENABLE_ZLIB=OFF \
128        -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
129        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
130        -DLLVM_PARALLEL_LINK_JOBS=1 \
131        "${LLVM_SOURCES}"
132
133    ninja distribution
134    if [[ -n "${INSTALL_DIR}" ]]; then
135        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
136    fi
137
138    AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen"
139    if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then
140        echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..."
141    fi
142fi
143
144if [[ "x${BUILD_X86_RELEASE}" == "xtrue" ]]; then
145    TARGET="x86_64${BUILD_SUFFIX}"
146    INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}"
147    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
148    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
149    mkdir -p "${BUILD_PREFIX}"
150    cd "${BUILD_PREFIX}"
151    cmake -G Ninja \
152        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
153        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
154        -DCMAKE_BUILD_TYPE=Release \
155        \
156        -DCMAKE_C_COMPILER="${CC}" \
157        -DCMAKE_CXX_COMPILER="${CXX}" \
158        -DCMAKE_STRIP="${STRIP}" \
159        \
160        -DLLVM_ENABLE_FFI=OFF \
161        -DLLVM_ENABLE_TERMINFO=OFF \
162        \
163        -DLLVM_INCLUDE_BENCHMARKS=OFF \
164        -DLLVM_INCLUDE_EXAMPLES=OFF \
165        -DLLVM_INCLUDE_TESTS=OFF \
166        \
167        -DLLVM_BUILD_TOOLS=ON \
168        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
169        -DLLVM_BUILD_LLVM_DYLIB=ON \
170        -DLLVM_ENABLE_ZLIB=OFF \
171        -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
172        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
173        -DLLVM_PARALLEL_LINK_JOBS=1 \
174        "${LLVM_SOURCES}"
175
176    ninja distribution
177    if [[ -n "${INSTALL_DIR}" ]]; then
178        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
179    fi
180
181    AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen"
182    if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then
183        echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..."
184    fi
185fi
186
187LLVM_TABLEGEN=${LLVM_TABLEGEN:-${AUTO_LLVM_TABLEGEN}}
188LLVM_TABLEGEN=${LLVM_TABLEGEN:+-DLLVM_TABLEGEN=${LLVM_TABLEGEN}}
189
190if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" ]]; then
191    TARGET="aarch64${BUILD_SUFFIX}"
192    INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}"
193    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
194    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
195    mkdir -p "${BUILD_PREFIX}"
196    cd "${BUILD_PREFIX}"
197    cmake -G Ninja \
198        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
199        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
200        -DCMAKE_BUILD_TYPE=Debug \
201        \
202        -DCMAKE_CROSSCOMPILING=True \
203        -DLLVM_TARGET_ARCH=AArch64 \
204        -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \
205        -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/ ${DEBUG_OPT_FLAG}" \
206        -DCMAKE_CXX_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/c++/8/aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/ ${DEBUG_OPT_FLAG}" \
207        \
208        -DCMAKE_C_COMPILER="${CC}" \
209        -DCMAKE_CXX_COMPILER="${CXX}" \
210        -DCMAKE_STRIP="${STRIP}" \
211        \
212        -DLLVM_ENABLE_FFI=OFF \
213        -DLLVM_ENABLE_TERMINFO=OFF \
214        \
215        -DLLVM_INCLUDE_BENCHMARKS=OFF \
216        -DLLVM_INCLUDE_EXAMPLES=OFF \
217        -DLLVM_INCLUDE_TESTS=OFF \
218        \
219        -DLLVM_BUILD_TOOLS=ON \
220        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
221        -DLLVM_BUILD_LLVM_DYLIB=ON \
222        -DLLVM_ENABLE_ZLIB=OFF \
223        -DLLVM_TARGETS_TO_BUILD=AArch64 \
224        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
225        -DLLVM_PARALLEL_LINK_JOBS=1 \
226        "${LLVM_TABLEGEN}" \
227        "${LLVM_SOURCES}"
228
229    ninja distribution
230    if [[ -n "${INSTALL_DIR}" ]]; then
231        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
232    fi
233fi
234
235if [[ "x${BUILD_AARCH64_RELEASE}" == "xtrue" ]]; then
236    TARGET="aarch64${BUILD_SUFFIX}"
237    INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}"
238    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
239    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
240    mkdir -p "${BUILD_PREFIX}"
241    cd "${BUILD_PREFIX}"
242    cmake -G Ninja \
243        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
244        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
245        -DCMAKE_BUILD_TYPE=Release \
246        \
247        -DCMAKE_CROSSCOMPILING=True \
248        -DLLVM_TARGET_ARCH=AArch64 \
249        -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \
250        -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \
251        -DCMAKE_CXX_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/c++/8/aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \
252        \
253        -DCMAKE_C_COMPILER="${CC}" \
254        -DCMAKE_CXX_COMPILER="${CXX}" \
255        -DCMAKE_STRIP="${STRIP}" \
256        \
257        -DLLVM_ENABLE_FFI=OFF \
258        -DLLVM_ENABLE_TERMINFO=OFF \
259        \
260        -DLLVM_INCLUDE_BENCHMARKS=OFF \
261        -DLLVM_INCLUDE_EXAMPLES=OFF \
262        -DLLVM_INCLUDE_TESTS=OFF \
263        \
264        -DLLVM_BUILD_TOOLS=ON \
265        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
266        -DLLVM_BUILD_LLVM_DYLIB=ON \
267        -DLLVM_ENABLE_ZLIB=OFF \
268        -DLLVM_TARGETS_TO_BUILD=AArch64 \
269        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
270        -DLLVM_PARALLEL_LINK_JOBS=1 \
271        "${LLVM_TABLEGEN}" \
272        "${LLVM_SOURCES}"
273
274    ninja distribution
275    if [[ -n "${INSTALL_DIR}" ]]; then
276        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
277    fi
278fi
279