Files
termux-packages/packages/tinygo/build.sh
2023-04-08 01:26:52 +00:00

146 lines
4.5 KiB
Bash

TERMUX_PKG_HOMEPAGE=https://tinygo.org
TERMUX_PKG_DESCRIPTION="Go compiler for microcontrollers, WASM, CLI tools"
TERMUX_PKG_LICENSE="custom"
TERMUX_PKG_LICENSE_FILE="LICENSE"
TERMUX_PKG_MAINTAINER="@termux"
TERMUX_PKG_VERSION="0.27.0"
TERMUX_PKG_REVISION=1
TERMUX_PKG_SRCURL=git+https://github.com/tinygo-org/tinygo
TERMUX_PKG_GIT_BRANCH="v${TERMUX_PKG_VERSION}"
TERMUX_PKG_DEPENDS="libc++"
TERMUX_PKG_RECOMMENDS="binaryen, tinygo-common"
TERMUX_PKG_NO_STATICSPLIT=true
TERMUX_PKG_BUILD_IN_SRC=true
TERMUX_PKG_HOSTBUILD=true
TERMUX_PKG_AUTO_UPDATE=true
_LLVM_OPTION="
-DGENERATOR_IS_MULTI_CONFIG=ON
-DLLVM_TABLEGEN=${TERMUX_PKG_HOSTBUILD_DIR}/bin/llvm-tblgen
-DCLANG_TABLEGEN=${TERMUX_PKG_HOSTBUILD_DIR}/bin/clang-tblgen
"
_LLVM_EXTRA_BUILD_TARGETS="
lib/libLLVMFuzzerCLI.a
lib/libLLVMFuzzMutate.a
lib/libLLVMFileCheck.a
lib/libLLVMInterfaceStub.a
lib/libLLVMMIRParser.a
lib/libLLVMDWARFLinker.a
lib/libLLVMFrontendOpenACC.a
lib/libLLVMObjCopy.a
lib/libLLVMObjectYAML.a
lib/libLLVMDebugInfoGSYM.a
lib/libLLVMDWP.a
lib/libLLVMJITLink.a
lib/libLLVMOrcJIT.a
lib/libLLVMLineEditor.a
lib/libLLVMXRay.a
"
termux_step_post_get_source() {
# https://github.com/espressif/llvm-project
make llvm-source GO=:
}
termux_step_host_build() {
termux_setup_golang
termux_setup_cmake
termux_setup_ninja
pushd "${TERMUX_PKG_SRCDIR}"
make "${TERMUX_PKG_HOSTBUILD_DIR}" \
LLVM_BUILDDIR="${TERMUX_PKG_HOSTBUILD_DIR}"
# build whatever llvm-config think is missing
ninja -C "${TERMUX_PKG_HOSTBUILD_DIR}" \
-j"${TERMUX_MAKE_PROCESSES}" \
${_LLVM_EXTRA_BUILD_TARGETS}
echo "========== llvm-config =========="
file "${TERMUX_PKG_HOSTBUILD_DIR}/bin/llvm-config"
"${TERMUX_PKG_HOSTBUILD_DIR}/bin/llvm-config" --cppflags
"${TERMUX_PKG_HOSTBUILD_DIR}/bin/llvm-config" --ldflags --libs --system-libs
echo "========== llvm-config =========="
make build/release \
LLVM_BUILDDIR="${TERMUX_PKG_HOSTBUILD_DIR}" \
CLANG="${TERMUX_PKG_HOSTBUILD_DIR}/bin/clang" \
LLVM_AR="${TERMUX_PKG_HOSTBUILD_DIR}/bin/llvm-ar" \
LLVM_NM="${TERMUX_PKG_HOSTBUILD_DIR}/bin/llvm-nm" \
USE_SYSTEM_BINARYEN=1
popd
local PATCHELF_BUILD_SH="${TERMUX_SCRIPTDIR}/packages/patchelf/build.sh"
local PATCHELF_SRCURL=$(. "${PATCHELF_BUILD_SH}"; echo $TERMUX_PKG_SRCURL)
local PATCHELF_SHA256=$(. "${PATCHELF_BUILD_SH}"; echo $TERMUX_PKG_SHA256)
local PATCHELF_TARFILE="${TERMUX_PKG_CACHEDIR}/$(basename "${PATCHELF_SRCURL}")"
termux_download "${PATCHELF_SRCURL}" "${PATCHELF_TARFILE}" "${PATCHELF_SHA256}"
local PATCHELF_SRCDIR="${TERMUX_PKG_HOSTBUILD_DIR}/_patchelf"
mkdir -p "${PATCHELF_SRCDIR}"
tar xf "${PATCHELF_TARFILE}" -C "${PATCHELF_SRCDIR}" --strip-components=1
pushd "${PATCHELF_SRCDIR}"
./bootstrap.sh
./configure
make -j "${TERMUX_MAKE_PROCESSES}"
popd
}
termux_step_make() {
termux_setup_golang
termux_setup_cmake
termux_setup_ninja
# from packages/libllvm/build.sh
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
_LLVM_OPTION+=" -DLLVM_TARGET_ARCH=${_LLVM_TARGET_ARCH}"
_LLVM_OPTION+=" -DLLVM_HOST_TRIPLE=${_LLVM_DEFAULT_TARGET_TRIPLE}"
make llvm-build LLVM_OPTION="$(echo ${_LLVM_OPTION})"
ninja -C llvm-build \
-j"${TERMUX_MAKE_PROCESSES}" \
${_LLVM_EXTRA_BUILD_TARGETS}
# replace Android llvm-config with wrapper around host build
cat <<- EOF > llvm-build/bin/llvm-config
#!/bin/bash
${TERMUX_PKG_HOSTBUILD_DIR}/bin/llvm-config "\$@" | \
sed \
-e "s|${TERMUX_PKG_HOSTBUILD_DIR}|${TERMUX_PKG_SRCDIR}/llvm-build|g" \
-e "s|-lrt|-lc|g"
EOF
make tinygo
mkdir -p build/release/tinygo/bin
cp -fv build/tinygo build/release/tinygo/bin
# skip make gen-device, done in host build
# skip make wasi-libc, NDK doesnt support wasm32-unknown-wasi
# skip make binaryen
# TODO investigate later, fix excessive runpath entries
readelf -dW build/release/tinygo/bin/tinygo | grep RUNPATH
"${TERMUX_PKG_HOSTBUILD_DIR}/_patchelf/src/patchelf" \
--set-rpath "${TERMUX_PREFIX}/lib" \
build/release/tinygo/bin/tinygo
readelf -dW build/release/tinygo/bin/tinygo | grep RUNPATH
}
termux_step_make_install() {
mkdir -p "${TERMUX_PREFIX}/lib/tinygo"
cp -fr "${TERMUX_PKG_SRCDIR}/build/release/tinygo" "${TERMUX_PREFIX}/lib"
ln -sv "../lib/tinygo/bin/tinygo" "${TERMUX_PREFIX}/bin/tinygo"
}