ecd214881a
As replacement for TERMUX_PKG_QUICK_REBUILD. Running ./build-package.sh -c <package> starts a build for <package>, but does not extract and patch the source from scratch. Instead it sets up the build variables and starts from termux_step_make. When working on a big package that can take hours to build it is convenient to be able to build until there is an error, then apply some new patch (manually) to the source, and then continue from where the build failed.
121 lines
4.5 KiB
Bash
121 lines
4.5 KiB
Bash
TERMUX_PKG_HOMEPAGE=https://clang.llvm.org/
|
|
TERMUX_PKG_DESCRIPTION="Modular compiler and toolchain technologies library"
|
|
TERMUX_PKG_LICENSE="NCSA"
|
|
TERMUX_PKG_MAINTAINER="@buttaface"
|
|
TERMUX_PKG_VERSION=12.0.1
|
|
TERMUX_PKG_SHA256=129cb25cd13677aad951ce5c2deb0fe4afc1e9d98950f53b51bdcfb5a73afa0e
|
|
TERMUX_PKG_SRCURL=https://github.com/llvm/llvm-project/releases/download/llvmorg-$TERMUX_PKG_VERSION/llvm-project-$TERMUX_PKG_VERSION.src.tar.xz
|
|
TERMUX_PKG_HOSTBUILD=true
|
|
TERMUX_PKG_RM_AFTER_INSTALL="
|
|
bin/ld64.lld.darwinnew
|
|
lib/libgomp.a
|
|
lib/libiomp5.a
|
|
"
|
|
TERMUX_PKG_DEPENDS="binutils, libc++, ncurses, ndk-sysroot, libffi, zlib, libxml2"
|
|
# Replace gcc since gcc is deprecated by google on android and is not maintained upstream.
|
|
# Conflict with clang versions earlier than 3.9.1-3 since they bundled llvm.
|
|
TERMUX_PKG_CONFLICTS="gcc, clang (<< 3.9.1-3)"
|
|
TERMUX_PKG_BREAKS="libclang, libclang-dev, libllvm-dev"
|
|
TERMUX_PKG_REPLACES="gcc, libclang, libclang-dev, libllvm-dev"
|
|
# See http://llvm.org/docs/CMake.html:
|
|
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="
|
|
-DPYTHON_EXECUTABLE=$(which python3)
|
|
-DLLVM_ENABLE_PIC=ON
|
|
-DLLVM_ENABLE_PROJECTS=clang;clang-tools-extra;compiler-rt;lld;lldb;openmp;polly
|
|
-DLLVM_ENABLE_LIBEDIT=OFF
|
|
-DLLVM_INCLUDE_TESTS=OFF
|
|
-DCLANG_DEFAULT_CXX_STDLIB=libc++
|
|
-DCLANG_INCLUDE_TESTS=OFF
|
|
-DCLANG_TOOL_C_INDEX_TEST_BUILD=OFF
|
|
-DDEFAULT_SYSROOT=$(dirname $TERMUX_PREFIX)
|
|
-DLLVM_LINK_LLVM_DYLIB=ON
|
|
-DLLDB_TABLEGEN=$TERMUX_PKG_HOSTBUILD_DIR/bin/lldb-tblgen
|
|
-DLLVM_TABLEGEN=$TERMUX_PKG_HOSTBUILD_DIR/bin/llvm-tblgen
|
|
-DCLANG_TABLEGEN=$TERMUX_PKG_HOSTBUILD_DIR/bin/clang-tblgen
|
|
-DLIBOMP_ENABLE_SHARED=FALSE
|
|
-DOPENMP_ENABLE_LIBOMPTARGET=OFF
|
|
-DLLVM_BINUTILS_INCDIR=$TERMUX_PREFIX/include
|
|
-DLLVM_ENABLE_SPHINX=ON
|
|
-DSPHINX_OUTPUT_MAN=ON
|
|
-DSPHINX_WARNINGS_AS_ERRORS=OFF
|
|
-DLLVM_TARGETS_TO_BUILD=all
|
|
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=AVR;RISCV
|
|
-DPERL_EXECUTABLE=$(which perl)
|
|
-DLLVM_ENABLE_FFI=ON
|
|
"
|
|
|
|
if [ $TERMUX_ARCH_BITS = 32 ]; then
|
|
# Do not set _FILE_OFFSET_BITS=64
|
|
TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_FORCE_SMALLFILE_FOR_ANDROID=on"
|
|
fi
|
|
|
|
TERMUX_PKG_FORCE_CMAKE=true
|
|
TERMUX_PKG_HAS_DEBUG=false
|
|
# Debug build succeeds but make install with:
|
|
# cp: cannot stat '../src/projects/openmp/runtime/exports/common.min.50.ompt.optional/include/omp.h': No such file or directory
|
|
# common.min.50.ompt.optional should be common.deb.50.ompt.optional when doing debug build
|
|
|
|
termux_step_host_build() {
|
|
termux_setup_cmake
|
|
termux_setup_ninja
|
|
|
|
cmake -G Ninja -DLLVM_ENABLE_PROJECTS='clang;lldb' $TERMUX_PKG_SRCDIR/llvm
|
|
ninja -j $TERMUX_MAKE_PROCESSES clang-tblgen lldb-tblgen llvm-tblgen
|
|
}
|
|
|
|
termux_step_pre_configure() {
|
|
mkdir openmp/runtime/src/android
|
|
cp $TERMUX_PKG_BUILDER_DIR/nl_types.h openmp/runtime/src/android
|
|
cp $TERMUX_PKG_BUILDER_DIR/nltypes_stubs.cpp openmp/runtime/src/android
|
|
|
|
# Add unknown vendor, otherwise it screws with the default LLVM triple
|
|
# detection.
|
|
export LLVM_DEFAULT_TARGET_TRIPLE=${CCTERMUX_HOST_PLATFORM/-/-unknown-}
|
|
export LLVM_TARGET_ARCH
|
|
if [ $TERMUX_ARCH = "arm" ]; then
|
|
LLVM_TARGET_ARCH=ARM
|
|
elif [ $TERMUX_ARCH = "aarch64" ]; then
|
|
LLVM_TARGET_ARCH=AArch64
|
|
elif [ $TERMUX_ARCH = "i686" ] || [ $TERMUX_ARCH = "x86_64" ]; then
|
|
LLVM_TARGET_ARCH=X86
|
|
else
|
|
termux_error_exit "Invalid arch: $TERMUX_ARCH"
|
|
fi
|
|
# see CMakeLists.txt and tools/clang/CMakeLists.txt
|
|
TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_TARGET_ARCH=$LLVM_TARGET_ARCH"
|
|
TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_HOST_TRIPLE=$LLVM_DEFAULT_TARGET_TRIPLE"
|
|
export TERMUX_SRCDIR_SAVE=$TERMUX_PKG_SRCDIR
|
|
TERMUX_PKG_SRCDIR=$TERMUX_PKG_SRCDIR/llvm
|
|
}
|
|
|
|
termux_step_post_configure() {
|
|
TERMUX_PKG_SRCDIR=$TERMUX_SRCDIR_SAVE
|
|
}
|
|
|
|
termux_step_post_make_install() {
|
|
if [ "$TERMUX_CMAKE_BUILD" = Ninja ]; then
|
|
ninja docs-llvm-man docs-clang-man
|
|
else
|
|
make docs-llvm-man docs-clang-man
|
|
fi
|
|
|
|
cp docs/man/* $TERMUX_PREFIX/share/man/man1
|
|
cp tools/clang/docs/man/clang.1 $TERMUX_PREFIX/share/man/man1
|
|
cd $TERMUX_PREFIX/bin
|
|
|
|
for tool in clang clang++ cc c++ cpp gcc g++ ${TERMUX_HOST_PLATFORM}-{clang,clang++,gcc,g++,cpp}; do
|
|
ln -f -s clang-${TERMUX_PKG_VERSION:0:2} $tool
|
|
done
|
|
}
|
|
|
|
termux_step_post_massage() {
|
|
# Not added to the package but kept around on the host for other packages like rust,
|
|
# which relies on LLVM, to use for configuration.
|
|
sed $TERMUX_PKG_BUILDER_DIR/llvm-config.in \
|
|
-e "s|@TERMUX_PKG_VERSION@|$TERMUX_PKG_VERSION|g" \
|
|
-e "s|@TERMUX_PKG_SRCDIR@|$TERMUX_PKG_SRCDIR|g" \
|
|
-e "s|@LLVM_DEFAULT_TARGET_TRIPLE@|$LLVM_DEFAULT_TARGET_TRIPLE|g" \
|
|
-e "s|@TERMUX_PREFIX@|$TERMUX_PREFIX|g" > $TERMUX_PREFIX/bin/llvm-config
|
|
chmod 755 $TERMUX_PREFIX/bin/llvm-config
|
|
}
|