diff --git a/packages/python-llvmlite/build.sh b/packages/python-llvmlite/build.sh new file mode 100644 index 00000000000000..e509b017ad5ed4 --- /dev/null +++ b/packages/python-llvmlite/build.sh @@ -0,0 +1,174 @@ +TERMUX_PKG_HOMEPAGE=https://llvmlite.pydata.org/ +TERMUX_PKG_DESCRIPTION="A lightweight LLVM python binding for writing JIT compilers" +# LICENSES: BSD 2-Clause, Apache-2.0 with LLVM Exceptions +TERMUX_PKG_LICENSE="BSD 2-Clause, Apache-2.0" +TERMUX_PKG_LICENSE_FILE="LICENSE, LICENSE.thirdparty" +TERMUX_PKG_MAINTAINER="@termux" +TERMUX_PKG_VERSION=( + "0.44.0" + "15.0.7" +) +TERMUX_PKG_SRCURL=( + "https://github.com/numba/llvmlite/archive/refs/tags/v${TERMUX_PKG_VERSION[0]}.tar.gz" + "https://github.com/llvm/llvm-project/releases/download/llvmorg-${TERMUX_PKG_VERSION[1]}/llvm-project-${TERMUX_PKG_VERSION[1]}.src.tar.xz" +) +TERMUX_PKG_SHA256=( + 71ec10b77a813e9ceec5f0bdf072a89c838135e6ba182cc1d3a391a59aef37b8 + 8b5fcb24b4128cf04df1b0b9410ce8b1a729cb3c544e6da885d234280dedeac6 +) +TERMUX_PKG_DEPENDS="libc++, libffi, python, python-pip" +TERMUX_PKG_PYTHON_COMMON_DEPS="wheel" +TERMUX_PKG_BUILD_IN_SRC=true +TERMUX_PKG_AUTO_UPDATE=true +TERMUX_PKG_HOSTBUILD=true + +# See http://llvm.org/docs/CMake.html: +TERMUX_PKG_EXTRA_CONFIGURE_ARGS=" +-DANDROID_PLATFORM_LEVEL=$TERMUX_PKG_API_LEVEL +-DPYTHON_EXECUTABLE=$(command -v python3) +-DLLVM_ENABLE_PIC=ON +-DLLVM_INCLUDE_TESTS=OFF +-DDEFAULT_SYSROOT=$(dirname $TERMUX_PREFIX) +-DLLVM_TABLEGEN=$TERMUX_PKG_HOSTBUILD_DIR/bin/llvm-tblgen +-DLIBOMP_ENABLE_SHARED=FALSE +-DLLVM_ENABLE_SPHINX=ON +-DSPHINX_OUTPUT_MAN=ON +-DSPHINX_WARNINGS_AS_ERRORS=OFF +-DLLVM_TARGETS_TO_BUILD=all +-DPERL_EXECUTABLE=$(command -v perl) +-DLLVM_ENABLE_ZSTD=OFF +-DLLVM_ENABLE_LIBEDIT=OFF +-DLLVM_ENABLE_LIBXML2=OFF +-DLLVM_ENABLE_RTTI=OFF +-DLLVM_ENABLE_TERMINFO=OFF +-DLLVM_INCLUDE_BENCHMARKS=OFF +-DLLVM_INCLUDE_DOCS=OFF +-DLLVM_INCLUDE_EXAMPLES=OFF +-DLLVM_INCLUDE_GO_TESTS=OFF +-DLLVM_INCLUDE_UTILS=ON +-DLLVM_INSTALL_UTILS=ON +-DLLVM_BUILD_LLVM_DYLIB=OFF +-DLLVM_LINK_LLVM_DYLIB=OFF +-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly +-DLLVM_ENABLE_FFI=ON +-DLLVM_ENABLE_Z3_SOLVER=OFF +-DLLVM_OPTIMIZED_TABLEGEN=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_step_post_get_source() { + mv llvm-project-"${TERMUX_PKG_VERSION[1]}".src llvm-project +} + +termux_step_host_build() { + termux_setup_cmake + termux_setup_ninja + + cmake -G Ninja "-DCMAKE_BUILD_TYPE=Release" \ + "-DLLVM_ENABLE_PROJECTS=clang" \ + $TERMUX_PKG_SRCDIR/llvm-project/llvm + ninja -j $TERMUX_PKG_MAKE_PROCESSES llvm-tblgen clang-tblgen +} + +__llvmlite_build_llvm() { + export _LLVMLITE_LLVM_INSTALL_DIR="$TERMUX_PKG_BUILDDIR"/llvm-install + if [ -f "$_LLVMLITE_LLVM_INSTALL_DIR"/.llvmlite-llvm-built ]; then + return + fi + + termux_setup_cmake + termux_setup_ninja + + # 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 + TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_TARGET_ARCH=$LLVM_TARGET_ARCH" + TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_HOST_TRIPLE=$LLVM_DEFAULT_TARGET_TRIPLE" + TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DCMAKE_INSTALL_PREFIX=$_LLVMLITE_LLVM_INSTALL_DIR" + + # Backup dirs and envs + local __old_ldflags="$LDFLAGS" + local __old_srcdir="$TERMUX_PKG_SRCDIR" + local __old_builddir="$TERMUX_PKG_BUILDDIR" + LDFLAGS="-Wl,--undefined-version $LDFLAGS" + TERMUX_PKG_SRCDIR="$TERMUX_PKG_SRCDIR"/llvm-project/llvm + TERMUX_PKG_BUILDDIR="$TERMUX_PKG_BUILDDIR"/llvm-build + + # Configure + mkdir -p "$TERMUX_PKG_BUILDDIR" + cd "$TERMUX_PKG_BUILDDIR" + termux_step_configure_cmake + + # Cross-compile & install LLVM + cd "$TERMUX_PKG_BUILDDIR" + ninja -j $TERMUX_PKG_MAKE_PROCESSES install + + # Recover dirs and envs + LDFLAGS="$__old_ldflags" + TERMUX_PKG_SRCDIR="$__old_srcdir" + TERMUX_PKG_BUILDDIR="$__old_builddir" + + # Mark as built + mkdir -p "$_LLVMLITE_LLVM_INSTALL_DIR" + touch -f "$_LLVMLITE_LLVM_INSTALL_DIR"/.llvmlite-llvm-built +} + +__llvmlite_build_lib() { + termux_setup_cmake + termux_setup_ninja + + TERMUX_PKG_EXTRA_CONFIGURE_ARGS="-DLLVM_DIR=$_LLVMLITE_LLVM_INSTALL_DIR/lib/cmake/llvm" + + # Backup dirs and envs + local __old_srcdir="$TERMUX_PKG_SRCDIR" + local __old_builddir="$TERMUX_PKG_BUILDDIR" + TERMUX_PKG_SRCDIR="$TERMUX_PKG_SRCDIR"/ffi + TERMUX_PKG_BUILDDIR="$TERMUX_PKG_SRCDIR"/build + + # Configure + mkdir -p "$TERMUX_PKG_BUILDDIR" + cd "$TERMUX_PKG_BUILDDIR" + termux_step_configure_cmake + + # Cross-compile llvmlite + cd "$TERMUX_PKG_BUILDDIR" + ninja -j $TERMUX_PKG_MAKE_PROCESSES + + # Recover dirs and envs + TERMUX_PKG_SRCDIR="$__old_srcdir" + TERMUX_PKG_BUILDDIR="$__old_builddir" +} + +termux_step_configure() { + : +} + +termux_step_make() { + __llvmlite_build_llvm + + __llvmlite_build_lib + + # Copy libs + cp -f "$TERMUX_PKG_SRCDIR"/ffi/build/libllvmlite.so "$TERMUX_PKG_SRCDIR"/llvmlite/binding/ +} + +termux_step_make_install() { + LDFLAGS+=" -Wl,--no-as-needed -lpython${TERMUX_PYTHON_VERSION}" + + export LLVMLITE_SKIP_BUILD_LIBRARY=1 + pip install . --prefix="$TERMUX_PREFIX" -vv --no-build-isolation --no-deps +} diff --git a/packages/python-llvmlite/ffi-build.py.patch b/packages/python-llvmlite/ffi-build.py.patch new file mode 100644 index 00000000000000..75a68e92991495 --- /dev/null +++ b/packages/python-llvmlite/ffi-build.py.patch @@ -0,0 +1,11 @@ +--- a/ffi/build.py ++++ b/ffi/build.py +@@ -239,6 +239,8 @@ + + + def main(): ++ if os.environ.get("LLVMLITE_SKIP_BUILD_LIBRARY", "0") == "1": ++ return + if sys.platform == 'win32': + main_windows() + elif sys.platform.startswith(('linux', 'gnu')): diff --git a/packages/python-llvmlite/llvm-include-llvm-ADT-SmallVector.h.patch b/packages/python-llvmlite/llvm-include-llvm-ADT-SmallVector.h.patch new file mode 100644 index 00000000000000..2cf73899a2d8e2 --- /dev/null +++ b/packages/python-llvmlite/llvm-include-llvm-ADT-SmallVector.h.patch @@ -0,0 +1,13 @@ +--- a/llvm-project/llvm/include/llvm/ADT/SmallVector.h ++++ b/llvm-project/llvm/include/llvm/ADT/SmallVector.h +@@ -735,6 +735,10 @@ + return(N); + } + ++#ifdef CS ++#undef CS ++#endif ++ + iterator erase(const_iterator CS, const_iterator CE) { + // Just cast away constness because this is a non-const member function. + iterator S = const_cast(CS); diff --git a/packages/python-llvmlite/llvm-tools-llvm-rtdyld-llvm-rtdyld.cpp.patch b/packages/python-llvmlite/llvm-tools-llvm-rtdyld-llvm-rtdyld.cpp.patch new file mode 100644 index 00000000000000..9a24e508023158 --- /dev/null +++ b/packages/python-llvmlite/llvm-tools-llvm-rtdyld-llvm-rtdyld.cpp.patch @@ -0,0 +1,29 @@ +--- a/llvm-project/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp 2022-03-14 09:44:55.000000000 +0000 ++++ b/llvm-project/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp 2022-04-06 11:14:07.627066038 +0000 +@@ -286,7 +286,7 @@ + uintptr_t SlabSize = 0; + uintptr_t CurrentSlabOffset = 0; + SectionIDMap *SecIDMap = nullptr; +-#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) ++#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) && !defined(__ANDROID__) + unsigned UsedTLSStorage = 0; + #endif + }; +@@ -350,7 +350,7 @@ + + // In case the execution needs TLS storage, we define a very small TLS memory + // area here that will be used in allocateTLSSection(). +-#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) ++#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) && !defined(__ANDROID__) + extern "C" { + alignas(16) __attribute__((visibility("hidden"), tls_model("initial-exec"), + used)) thread_local char LLVMRTDyldTLSSpace[16]; +@@ -361,7 +361,7 @@ + TrivialMemoryManager::allocateTLSSection(uintptr_t Size, unsigned Alignment, + unsigned SectionID, + StringRef SectionName) { +-#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) ++#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) && !defined(__ANDROID__) + if (Size + UsedTLSStorage > sizeof(LLVMRTDyldTLSSpace)) { + return {}; + } diff --git a/packages/python-llvmlite/llvm-tools-llvm-shlib-CMakeLists.txt.patch b/packages/python-llvmlite/llvm-tools-llvm-shlib-CMakeLists.txt.patch new file mode 100644 index 00000000000000..f4445c94ea5b70 --- /dev/null +++ b/packages/python-llvmlite/llvm-tools-llvm-shlib-CMakeLists.txt.patch @@ -0,0 +1,10 @@ +--- a/llvm-project/llvm/tools/llvm-shlib/CMakeLists.txt 2019-03-20 21:24:00.144316380 +0000 ++++ b/llvm-project/llvm/tools/llvm-shlib/CMakeLists.txt 2019-03-20 21:25:26.117941452 +0000 +@@ -48,6 +48,7 @@ + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly") ++ OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")) # FIXME: It should be "GNU ld for elf" + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/simple_version_script.map.in diff --git a/packages/python-llvmlite/openmp.patch b/packages/python-llvmlite/openmp.patch new file mode 100644 index 00000000000000..5bf7873f991205 --- /dev/null +++ b/packages/python-llvmlite/openmp.patch @@ -0,0 +1,131 @@ +--- a/llvm-project/openmp/runtime/cmake/config-ix.cmake ++++ b/llvm-project/openmp/runtime/cmake/config-ix.cmake +@@ -60,7 +60,6 @@ + check_cxx_compiler_flag(-msse2 LIBOMP_HAVE_MSSE2_FLAG) + check_cxx_compiler_flag(-ftls-model=initial-exec LIBOMP_HAVE_FTLS_MODEL_FLAG) + libomp_check_architecture_flag(-mmic LIBOMP_HAVE_MMIC_FLAG) +-libomp_check_architecture_flag(-m32 LIBOMP_HAVE_M32_FLAG) + if(WIN32) + if(MSVC) + # Check Windows MSVC style flags. +--- a/llvm-project/openmp/runtime/src/CMakeLists.txt ++++ b/llvm-project/openmp/runtime/src/CMakeLists.txt +@@ -49,6 +49,9 @@ + if(${LIBOMP_USE_HWLOC}) + include_directories(${LIBOMP_HWLOC_INSTALL_DIR}/include) + endif() ++ ++include_directories(${LIBOMP_SRC_DIR}/android) ++ + + # Getting correct source files to build library + set(LIBOMP_CXXFILES) +@@ -92,6 +95,9 @@ + libomp_append(LIBOMP_CXXFILES kmp_gsupport.cpp) + libomp_append(LIBOMP_ASMFILES z_Linux_asm.S) # Unix assembly file + endif() ++ ++ libomp_append(LIBOMP_CXXFILES android/nltypes_stubs.cpp) ++ + libomp_append(LIBOMP_CXXFILES thirdparty/ittnotify/ittnotify_static.cpp LIBOMP_USE_ITT_NOTIFY) + libomp_append(LIBOMP_CXXFILES kmp_debugger.cpp LIBOMP_USE_DEBUGGER) + libomp_append(LIBOMP_CXXFILES kmp_stats.cpp LIBOMP_STATS) +--- a/llvm-project/openmp/runtime/src/android/nl_types.h ++++ b/llvm-project/openmp/runtime/src/android/nl_types.h +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (C) 2013 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++#ifndef ANDROID_NLTYPES_H ++#define ANDROID_NLTYPES_H ++ ++#include_next ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++nl_catd catopen(const char*, int); ++char* catgets(nl_catd, int, int, const char*); ++int catclose(nl_catd); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++#endif /* ANDROID_NLTYPES_H */ +--- a/llvm-project/openmp/runtime/src/android/nltypes_stubs.cpp ++++ b/llvm-project/openmp/runtime/src/android/nltypes_stubs.cpp +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (C) 2016 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#include ++ ++#include ++ ++ ++nl_catd catopen(const char*, int) { ++ return reinterpret_cast(-1); ++} ++ ++ ++char* catgets(nl_catd, int, int, const char* message) { ++ return const_cast(message); ++} ++ ++ ++int catclose(nl_catd) { ++ // Since we didn't hand out a valid nl_catd, you can't be returning one to us. ++ errno = EBADF; ++ return -1; ++}