• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2# Copyright (c) 2023-2024 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}
33BUILD_OHOS_RELEASE=${BUILD_OHOS_RELEASE:-false}
34BUILD_OHOS_RELEASE_GN=${BUILD_OHOS_RELEASE_GN:-false}
35LLVM_COMPONENTS="cmake-exports;llvm-headers;LLVM"
36LLVM_COMPONENTS_PLUS_LINK="${LLVM_COMPONENTS};llvm-link"
37
38# OHOS SDK and compiler
39OHOS_SDK=${OHOS_SDK:-""}
40OHOS_PREBUILTS=${OHOS_PREBUILTS:-""}
41
42# Build tools
43CC=${CC:-"/usr/bin/clang-14"}
44CXX=${CXX:-"/usr/bin/clang++-14"}
45STRIP=${STRIP:-"/usr/bin/llvm-strip-14"}
46LLVM_TABLEGEN=${LLVM_TABLEGEN:-""}
47# Etc.
48NPROC=$(nproc)
49
50if [[ -z "${BUILD_DIR}" ]]; then
51    echo "Please, specify build directory with BUILD_DIR variable"
52    exit 1
53fi
54
55if [[ -z "${LLVM_SOURCES}" ]]; then
56    echo "Please, specify llvm sources directory with LLVM_SOURCES variable"
57    exit 1
58fi
59
60if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" || "x${BUILD_AARCH64_RELEASE}" == "xtrue" || "x${BUILD_OHOS_RELEASE_GN}" == "xtrue"  || "x${BUILD_OHOS_RELEASE}" == "xtrue" ]]; then
61    if [[ -n "${LLVM_TABLEGEN}" && ! -f "${LLVM_TABLEGEN}" ]]; then
62        echo "Provided LLVM_TABLEGEN '${LLVM_TABLEGEN}' does not exist"
63        exit 1
64    fi
65
66    if [[ -z "${LLVM_TABLEGEN}" ]]; then
67        qemu=$(which update-binfmts &> /dev/null && \
68                (update-binfmts --display || true) | grep -q "qemu-aarch64" && \
69                echo "true" || echo "false")
70
71        if [[ "x${qemu}" == "xfalse" && "x${BUILD_X86_DEBUG}" == "xfalse" && \
72                "x${BUILD_X86_RELEASE}" == "xfalse" ]]; then
73            echo "Cannot launch AArch64 builds without host llvm-tblgen."
74            echo "Please do something from listed below:"
75            echo "1) set LLVM_TABLEGEN variable to installed llvm-tblgen"
76            echo "2) install qemu-binfmt to transparently run AArch64 binaries"
77            echo "3) request one of X86 build using BUILD_X86_DEBUG or BUILD_X86_RELEASE."
78            echo "   llvm-tblgen will be used from build directory automatically."
79            exit 1
80        fi
81    fi
82fi
83
84if [[ -z "${OHOS_SDK}" && "x${BUILD_OHOS_RELEASE}" == "xtrue" ]]; then
85    echo "OHOS_SDK variable must be provided for OHOS build"
86    exit 1
87fi
88
89if [[ -z "${OHOS_SDK}" && "x${BUILD_OHOS_RELEASE_GN}" == "xtrue" ]]; then
90    echo "OHOS_SDK variable must be provided for OHOS GN build"
91    exit 1
92fi
93
94if [[ -z "${OHOS_PREBUILTS}" && "x${BUILD_OHOS_RELEASE_GN}" == "xtrue" ]]; then
95    echo "OHOS_PREBUILTS variable must be provided for OHOS GN build"
96    exit 1
97fi
98
99DEBUG_OPT_FLAG=""
100if [[ "x${OPTIMIZE_DEBUG}" == "xtrue" ]]; then
101    DEBUG_OPT_FLAG="-O2"
102fi
103
104function install() {
105    local install_dir="$1"
106    local strip="$2"
107    local archive="$3"
108    if [[ "x${strip}" == "xtrue" ]]; then
109        ninja install-distribution-stripped
110    else
111        ninja install-distribution
112    fi
113    if [[ "x${archive}" == "xtrue" ]]; then
114        tar cJf "${install_dir}.tar.xz" -C "${install_dir}" .
115        du -h "${install_dir}.tar.xz"
116    fi
117}
118
119AUTO_LLVM_TABLEGEN=""
120if [[ "x${BUILD_X86_DEBUG}" == "xtrue" ]]; then
121    TARGET="x86_64${BUILD_SUFFIX}"
122    INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}"
123    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
124    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
125    mkdir -p "${BUILD_PREFIX}"
126    cd "${BUILD_PREFIX}"
127    cmake -G Ninja \
128        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
129        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
130        -DCMAKE_BUILD_TYPE=Debug \
131        \
132        -DCMAKE_C_FLAGS="${DEBUG_OPT_FLAG}" -DCMAKE_CXX_FLAGS="${DEBUG_OPT_FLAG}" \
133        \
134        -DCMAKE_C_COMPILER="${CC}" \
135        -DCMAKE_CXX_COMPILER="${CXX}" \
136        -DCMAKE_STRIP="${STRIP}" \
137        \
138        -DLLVM_ENABLE_FFI=OFF \
139        -DLLVM_ENABLE_TERMINFO=OFF \
140        \
141        -DLLVM_INCLUDE_BENCHMARKS=OFF \
142        -DLLVM_INCLUDE_EXAMPLES=OFF \
143        -DLLVM_INCLUDE_TESTS=OFF \
144        \
145        -DLLVM_BUILD_TOOLS=ON \
146        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
147        -DLLVM_BUILD_LLVM_DYLIB=ON \
148        -DLLVM_ENABLE_ZLIB=OFF \
149        -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
150        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
151        -DLLVM_PARALLEL_LINK_JOBS=1 \
152        "${LLVM_SOURCES}"
153
154    ninja distribution
155    if [[ -n "${INSTALL_DIR}" ]]; then
156        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
157    fi
158
159    AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen"
160    if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then
161        echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..."
162    fi
163fi
164
165if [[ "x${BUILD_X86_RELEASE}" == "xtrue" ]]; then
166    TARGET="x86_64${BUILD_SUFFIX}"
167    INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}"
168    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
169    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
170    mkdir -p "${BUILD_PREFIX}"
171    cd "${BUILD_PREFIX}"
172    cmake -G Ninja \
173        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
174        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
175        -DCMAKE_BUILD_TYPE=Release \
176        \
177        -DCMAKE_C_COMPILER="${CC}" \
178        -DCMAKE_CXX_COMPILER="${CXX}" \
179        -DCMAKE_STRIP="${STRIP}" \
180        \
181        -DLLVM_ENABLE_FFI=OFF \
182        -DLLVM_ENABLE_TERMINFO=OFF \
183        \
184        -DLLVM_INCLUDE_BENCHMARKS=OFF \
185        -DLLVM_INCLUDE_EXAMPLES=OFF \
186        -DLLVM_INCLUDE_TESTS=OFF \
187        \
188        -DLLVM_BUILD_TOOLS=ON \
189        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
190        -DLLVM_BUILD_LLVM_DYLIB=ON \
191        -DLLVM_ENABLE_ZLIB=OFF \
192        -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
193        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
194        -DLLVM_PARALLEL_LINK_JOBS=1 \
195        "${LLVM_SOURCES}"
196
197    ninja distribution
198    if [[ -n "${INSTALL_DIR}" ]]; then
199        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
200    fi
201
202    AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen"
203    if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then
204        echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..."
205    fi
206fi
207
208LLVM_TABLEGEN=${LLVM_TABLEGEN:-${AUTO_LLVM_TABLEGEN}}
209LLVM_TABLEGEN=${LLVM_TABLEGEN:+-DLLVM_TABLEGEN=${LLVM_TABLEGEN}}
210
211if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" ]]; then
212    TARGET="aarch64${BUILD_SUFFIX}"
213    INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}"
214    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
215    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
216    mkdir -p "${BUILD_PREFIX}"
217    cd "${BUILD_PREFIX}"
218    cmake -G Ninja \
219        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
220        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
221        -DCMAKE_BUILD_TYPE=Debug \
222        \
223        -DCMAKE_CROSSCOMPILING=ON \
224        -DLLVM_TARGET_ARCH=AArch64 \
225        -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \
226        -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/ ${DEBUG_OPT_FLAG}" \
227        -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}" \
228        \
229        -DCMAKE_C_COMPILER="${CC}" \
230        -DCMAKE_CXX_COMPILER="${CXX}" \
231        -DCMAKE_STRIP="${STRIP}" \
232        \
233        -DLLVM_ENABLE_FFI=OFF \
234        -DLLVM_ENABLE_TERMINFO=OFF \
235        \
236        -DLLVM_INCLUDE_BENCHMARKS=OFF \
237        -DLLVM_INCLUDE_EXAMPLES=OFF \
238        -DLLVM_INCLUDE_TESTS=OFF \
239        \
240        -DLLVM_BUILD_TOOLS=ON \
241        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
242        -DLLVM_BUILD_LLVM_DYLIB=ON \
243        -DLLVM_ENABLE_ZLIB=OFF \
244        -DLLVM_TARGETS_TO_BUILD=AArch64 \
245        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
246        -DLLVM_PARALLEL_LINK_JOBS=1 \
247        "${LLVM_TABLEGEN}" \
248        "${LLVM_SOURCES}"
249
250    ninja distribution
251    if [[ -n "${INSTALL_DIR}" ]]; then
252        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
253    fi
254fi
255
256if [[ "x${BUILD_AARCH64_RELEASE}" == "xtrue" ]]; then
257    TARGET="aarch64${BUILD_SUFFIX}"
258    INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}"
259    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
260    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
261    mkdir -p "${BUILD_PREFIX}"
262    cd "${BUILD_PREFIX}"
263    cmake -G Ninja \
264        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
265        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
266        -DCMAKE_BUILD_TYPE=Release \
267        \
268        -DCMAKE_CROSSCOMPILING=ON \
269        -DLLVM_TARGET_ARCH=AArch64 \
270        -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \
271        -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \
272        -DCMAKE_CXX_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/c++/8/aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \
273        \
274        -DCMAKE_C_COMPILER="${CC}" \
275        -DCMAKE_CXX_COMPILER="${CXX}" \
276        -DCMAKE_STRIP="${STRIP}" \
277        \
278        -DLLVM_ENABLE_FFI=OFF \
279        -DLLVM_ENABLE_TERMINFO=OFF \
280        \
281        -DLLVM_INCLUDE_BENCHMARKS=OFF \
282        -DLLVM_INCLUDE_EXAMPLES=OFF \
283        -DLLVM_INCLUDE_TESTS=OFF \
284        \
285        -DLLVM_BUILD_TOOLS=ON \
286        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \
287        -DLLVM_BUILD_LLVM_DYLIB=ON \
288        -DLLVM_ENABLE_ZLIB=OFF \
289        -DLLVM_TARGETS_TO_BUILD=AArch64 \
290        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
291        -DLLVM_PARALLEL_LINK_JOBS=1 \
292        "${LLVM_TABLEGEN}" \
293        "${LLVM_SOURCES}"
294
295    ninja distribution
296    if [[ -n "${INSTALL_DIR}" ]]; then
297        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
298    fi
299fi
300
301if [[ "x${BUILD_OHOS_RELEASE}" == "xtrue" ]]; then
302    TARGET="ohos${BUILD_SUFFIX}"
303    INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}"
304    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
305    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
306    mkdir -p "${BUILD_PREFIX}"
307    cd "${BUILD_PREFIX}"
308    "${OHOS_SDK}/build-tools/cmake/bin/cmake" -G Ninja \
309        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
310        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
311        -DCMAKE_BUILD_TYPE=Release \
312        -DCMAKE_TOOLCHAIN_FILE="${OHOS_SDK}/build/cmake/ohos.toolchain.cmake" \
313        \
314        -DOHOS_ALLOW_UNDEFINED_SYMBOLS=ON \
315        \
316        -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-ohos \
317        -DLLVM_TARGETS_TO_BUILD=AArch64 \
318        \
319        -DLLVM_ENABLE_FFI=OFF \
320        -DLLVM_ENABLE_TERMINFO=OFF \
321        \
322        -DLLVM_INCLUDE_BENCHMARKS=OFF \
323        -DLLVM_INCLUDE_EXAMPLES=OFF \
324        -DLLVM_INCLUDE_TESTS=OFF \
325        \
326        -DLLVM_BUILD_TOOLS=ON \
327        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS}" \
328        -DLLVM_BUILD_LLVM_DYLIB=ON \
329        -DLLVM_ENABLE_ZLIB=OFF \
330        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
331        -DLLVM_PARALLEL_LINK_JOBS=1 \
332        "${LLVM_SOURCES}"
333
334    ninja distribution
335    if [[ -n "${INSTALL_DIR}" ]]; then
336        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
337    fi
338fi
339
340if [[ "x${BUILD_OHOS_RELEASE_GN}" == "xtrue" ]]; then
341    TARGET="ohos-gn${BUILD_SUFFIX}"
342    INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}"
343    INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}"
344    BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}"
345    mkdir -p "${BUILD_PREFIX}"
346    cd "${BUILD_PREFIX}"
347    "${OHOS_SDK}/build-tools/cmake/bin/cmake" -G Ninja \
348        -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
349        -DPACKAGE_VERSION="${PACKAGE_VERSION}" \
350        -DCMAKE_BUILD_TYPE=Release \
351        \
352        -DCMAKE_CROSSCOMPILING=ON \
353        -DLLVM_TARGET_ARCH=AArch64 \
354        -DCMAKE_SYSROOT="${OHOS_SDK}/sysroot" \
355        -DLLVM_HOST_TRIPLE=aarch64-linux-ohos \
356        -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-ohos \
357        -DCMAKE_C_FLAGS="-fstack-protector-strong --target=aarch64-linux-ohos -ffunction-sections -fdata-sections -v -funwind-tables -no-canonical-prefixes -D__MUSL__" \
358        -DCMAKE_CXX_FLAGS="-fstack-protector-strong --target=aarch64-linux-ohos -ffunction-sections -fdata-sections -v -funwind-tables -no-canonical-prefixes -D__MUSL__ -stdlib=libc++" \
359        -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld -Wl,--gc-sections -Wl,--build-id=sha1 --rtlib=compiler-rt -stdlib=libc++ -Wl,-z,relro,-z,now -pie -lunwind -Wl,-rpath,'\$ORIGIN/../lib' -static-libstdc++" \
360        \
361        -DCMAKE_C_COMPILER="${OHOS_PREBUILTS}/clang/ohos/linux-x86_64/llvm/bin/clang" \
362        -DCMAKE_CXX_COMPILER="${OHOS_PREBUILTS}/clang/ohos/linux-x86_64/llvm/bin/clang++" \
363        -DCMAKE_STRIP="${STRIP}" \
364        \
365        -DLLVM_ENABLE_FFI=OFF \
366        -DLLVM_ENABLE_TERMINFO=OFF \
367        \
368        -DLLVM_INCLUDE_BENCHMARKS=OFF \
369        -DLLVM_INCLUDE_EXAMPLES=OFF \
370        -DLLVM_INCLUDE_TESTS=OFF \
371        \
372        -DLLVM_BUILD_TOOLS=ON \
373        -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS}" \
374        -DLLVM_BUILD_LLVM_DYLIB=ON \
375        -DLLVM_ENABLE_ZLIB=OFF \
376        -DLLVM_TARGETS_TO_BUILD=AArch64 \
377        -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \
378        -DLLVM_PARALLEL_LINK_JOBS=1 \
379        "${LLVM_TABLEGEN}" \
380        "${LLVM_SOURCES}"
381
382    ninja distribution
383    if [[ -n "${INSTALL_DIR}" ]]; then
384        install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}"
385    fi
386fi
387