Files
2026-08-13 09:31:12 +08:00

362 lines
14 KiB
Bash

#!/bin/bash
if ! type "include" >/dev/null 2>&1; then
include() {
. "$(cd "$(dirname "$1")" && pwd)/${2}"
}
fi
include "${BASH_SOURCE[0]}" ./pragma_once.bash
if ! pragma_once ${BASH_SOURCE[0]}; then return 0; fi
include "${BASH_SOURCE[0]}" ./attach/export.bash
include "${BASH_SOURCE[0]}" ./patch/export.bash
include "${BASH_SOURCE[0]}" ./libc/export.bash
include "${BASH_SOURCE[0]}" ./base/export.bash
LLVM_SRC_DIR=""
LLVM_BUILD_DIR="${_root_}/0_cmake_build_dir/lld"
LLVM_INSTALL_DIR="${_root_}/0_cmake_install_dir/lld"
LLVM_CMAKE="${_ae_root_}/opt/cmake/bin/cmake"
LLVM_NINJA="/usr/bin/ninja"
LLVM_GENERATOR="Ninja"
LLVM_LLVM_VERSION="llvmorg-22.1.8"
LLVM_BUILD_TYPE="Release"
LLVM_ENABLE_PROJECTS="lld"
LLVM_TARGETS_TO_BUILD="X86"
LLVM_EXPERIMENTAL_TARGETS_TO_BUILD=""
LLVM_DEFAULT_TARGET_TRIPLE=""
LLVM_TARGET_ARCH=""
LLVM_NATIVE_TOOL_DIR=""
LLVM_TABLEGEN=""
LLVM_TC_FILE=""
LLVM_TC_SYSROOT=""
LLVM_TC_STAGING_PREFIX=""
LLVM_TC_C_COMPILER=""
LLVM_TC_CXX_COMPILER=""
LLVM_TC_C_COMPILER_TARGET=""
LLVM_TC_CXX_COMPILER_TARGET=""
LLVM_TC_SYSTEM_NAME=""
LLVM_TC_SYSTEM_PROCESSOR=""
LLVM_TC_FIND_ROOT_PATH=""
LLVM_TC_FIND_ROOT_PATH_MODE_PROGRAM=""
LLVM_TC_FIND_ROOT_PATH_MODE_LIBRARY=""
LLVM_TC_FIND_ROOT_PATH_MODE_INCLUDE=""
LLVM_TC_FIND_ROOT_PATH_MODE_PACKAGE=""
LLVM_TC_LINKER_TYPE=""
LLVM_TC_C_USING_LINKER_LLD=""
LLVM_TC_CXX_USING_LINKER_LLD=""
LLVM_TC_C_STANDARD_LINK_DIRECTORIES=""
LLVM_TC_CXX_STANDARD_LINK_DIRECTORIES=""
LLVM_TC_CXX_STANDARD_INCLUDE_DIRECTORIES=""
LLVM_TC_PTHREAD_LIB=""
LLVM_TC_AR=""
LLVM_TC_RANLIB=""
LLVM_TC_LINKER=""
LLVM_TC_RC_COMPILER=""
LLVM_TC_MT=""
clear_llvm_toolchain_config() {
LLVM_TC_FILE=""
LLVM_TC_SYSROOT=""
LLVM_TC_STAGING_PREFIX=""
LLVM_TC_C_COMPILER=""
LLVM_TC_CXX_COMPILER=""
LLVM_TC_C_COMPILER_TARGET=""
LLVM_TC_CXX_COMPILER_TARGET=""
LLVM_TC_SYSTEM_NAME=""
LLVM_TC_SYSTEM_PROCESSOR=""
LLVM_TC_FIND_ROOT_PATH=""
LLVM_TC_FIND_ROOT_PATH_MODE_PROGRAM=""
LLVM_TC_FIND_ROOT_PATH_MODE_LIBRARY=""
LLVM_TC_FIND_ROOT_PATH_MODE_INCLUDE=""
LLVM_TC_FIND_ROOT_PATH_MODE_PACKAGE=""
LLVM_TC_LINKER_TYPE=""
LLVM_TC_C_USING_LINKER_LLD=""
LLVM_TC_CXX_USING_LINKER_LLD=""
LLVM_TC_C_STANDARD_LINK_DIRECTORIES=""
LLVM_TC_CXX_STANDARD_LINK_DIRECTORIES=""
LLVM_TC_CXX_STANDARD_INCLUDE_DIRECTORIES=""
LLVM_TC_PTHREAD_LIB=""
LLVM_TC_AR=""
LLVM_TC_RANLIB=""
LLVM_TC_LINKER=""
LLVM_TC_RC_COMPILER=""
LLVM_TC_MT=""
}
clear_llvm_build_config() {
LLVM_DEFAULT_TARGET_TRIPLE=""
LLVM_TARGET_ARCH=""
LLVM_NATIVE_TOOL_DIR=""
LLVM_TABLEGEN=""
}
clear_llvm_platform_config() {
clear_llvm_toolchain_config
clear_llvm_build_config
}
cmake_escape_value() {
local s="$1"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
printf '%s' "$s"
}
toolchain_set() {
local file="$1"
local name="$2"
local value="$3"
if [[ -n "${value}" ]]; then
printf 'set(%s "%s")\n' "${name}" "$(cmake_escape_value "${value}")" >>"${file}"
fi
}
toolchain_set_raw() {
local file="$1"
local name="$2"
local value="$3"
if [[ -n "${value}" ]]; then
printf 'set(%s %s)\n' "${name}" "${value}" >>"${file}"
fi
}
toolchain_cache_string() {
local file="$1"
local name="$2"
local value="$3"
if [[ -n "${value}" ]]; then
printf 'set(%s "%s" CACHE STRING "" FORCE)\n' "${name}" "$(cmake_escape_value "${value}")" >>"${file}"
fi
}
toolchain_cache_raw() {
local file="$1"
local name="$2"
local value="$3"
if [[ -n "${value}" ]]; then
printf 'set(%s %s CACHE INTERNAL "" FORCE)\n' "${name}" "${value}" >>"${file}"
fi
}
toolchain_pthread_config() {
local file="$1"
local value="$2"
if [[ -n "${value}" ]]; then
toolchain_cache_string "${file}" CMAKE_C_STANDARD_LIBRARIES "${value}"
toolchain_cache_string "${file}" CMAKE_CXX_STANDARD_LIBRARIES "${value}"
toolchain_cache_string "${file}" CMAKE_THREAD_LIBS_INIT "${value}"
toolchain_cache_string "${file}" LLVM_PTHREAD_LIB "${value}"
toolchain_cache_raw "${file}" CMAKE_HAVE_LIBC_PTHREAD "0"
toolchain_cache_raw "${file}" CMAKE_USE_PTHREADS_INIT "1"
toolchain_cache_raw "${file}" CMAKE_USE_WIN32_THREADS_INIT "0"
toolchain_cache_raw "${file}" CMAKE_HAVE_THREADS_LIBRARY "1"
toolchain_set_raw "${file}" THREADS_PREFER_PTHREAD_FLAG "ON"
fi
}
llvm_has_toolchain_config() {
[[ -n "${LLVM_TC_SYSROOT}${LLVM_TC_STAGING_PREFIX}${LLVM_TC_C_COMPILER}${LLVM_TC_CXX_COMPILER}${LLVM_TC_C_COMPILER_TARGET}${LLVM_TC_CXX_COMPILER_TARGET}${LLVM_TC_SYSTEM_NAME}${LLVM_TC_SYSTEM_PROCESSOR}${LLVM_TC_FIND_ROOT_PATH}${LLVM_TC_FIND_ROOT_PATH_MODE_PROGRAM}${LLVM_TC_FIND_ROOT_PATH_MODE_LIBRARY}${LLVM_TC_FIND_ROOT_PATH_MODE_INCLUDE}${LLVM_TC_FIND_ROOT_PATH_MODE_PACKAGE}${LLVM_TC_LINKER_TYPE}${LLVM_TC_C_USING_LINKER_LLD}${LLVM_TC_CXX_USING_LINKER_LLD}${LLVM_TC_C_STANDARD_LINK_DIRECTORIES}${LLVM_TC_CXX_STANDARD_LINK_DIRECTORIES}${LLVM_TC_CXX_STANDARD_INCLUDE_DIRECTORIES}${LLVM_TC_PTHREAD_LIB}${LLVM_TC_AR}${LLVM_TC_RANLIB}${LLVM_TC_LINKER}${LLVM_TC_RC_COMPILER}${LLVM_TC_MT}" ]]
}
llvm_generate_toolchain_file() {
local file="$1"
mkdir -p "$(dirname "${file}")"
: >"${file}"
printf 'set(LLVM_TC_GENERATED_ID "windows-lld-linux-x86-winpthread")\n' >>"${file}"
toolchain_set "${file}" CMAKE_SYSTEM_NAME "${LLVM_TC_SYSTEM_NAME}"
toolchain_set "${file}" CMAKE_SYSTEM_PROCESSOR "${LLVM_TC_SYSTEM_PROCESSOR}"
toolchain_set "${file}" CMAKE_C_COMPILER "${LLVM_TC_C_COMPILER}"
toolchain_set "${file}" CMAKE_CXX_COMPILER "${LLVM_TC_CXX_COMPILER}"
toolchain_set "${file}" CMAKE_C_COMPILER_TARGET "${LLVM_TC_C_COMPILER_TARGET}"
toolchain_set "${file}" CMAKE_CXX_COMPILER_TARGET "${LLVM_TC_CXX_COMPILER_TARGET}"
toolchain_set "${file}" CMAKE_SYSROOT "${LLVM_TC_SYSROOT}"
echo "${file} 33333333333333333 ==================================== ${LLVM_TC_SYSROOT}"
toolchain_set "${file}" CMAKE_STAGING_PREFIX "${LLVM_TC_STAGING_PREFIX}"
toolchain_set "${file}" CMAKE_FIND_ROOT_PATH "${LLVM_TC_FIND_ROOT_PATH}"
toolchain_set "${file}" CMAKE_FIND_ROOT_PATH_MODE_PROGRAM "${LLVM_TC_FIND_ROOT_PATH_MODE_PROGRAM}"
toolchain_set "${file}" CMAKE_FIND_ROOT_PATH_MODE_LIBRARY "${LLVM_TC_FIND_ROOT_PATH_MODE_LIBRARY}"
toolchain_set "${file}" CMAKE_FIND_ROOT_PATH_MODE_INCLUDE "${LLVM_TC_FIND_ROOT_PATH_MODE_INCLUDE}"
toolchain_set "${file}" CMAKE_FIND_ROOT_PATH_MODE_PACKAGE "${LLVM_TC_FIND_ROOT_PATH_MODE_PACKAGE}"
toolchain_cache_string "${file}" CMAKE_LINKER_TYPE "${LLVM_TC_LINKER_TYPE}"
toolchain_set "${file}" CMAKE_C_USING_LINKER_LLD "${LLVM_TC_C_USING_LINKER_LLD}"
toolchain_set "${file}" CMAKE_CXX_USING_LINKER_LLD "${LLVM_TC_CXX_USING_LINKER_LLD}"
toolchain_set "${file}" CMAKE_C_STANDARD_LINK_DIRECTORIES "${LLVM_TC_C_STANDARD_LINK_DIRECTORIES}"
toolchain_set "${file}" CMAKE_CXX_STANDARD_LINK_DIRECTORIES "${LLVM_TC_CXX_STANDARD_LINK_DIRECTORIES}"
toolchain_set "${file}" CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES "${LLVM_TC_CXX_STANDARD_INCLUDE_DIRECTORIES}"
toolchain_pthread_config "${file}" "${LLVM_TC_PTHREAD_LIB}"
toolchain_set "${file}" CMAKE_AR "${LLVM_TC_AR}"
toolchain_set "${file}" CMAKE_RANLIB "${LLVM_TC_RANLIB}"
toolchain_set "${file}" CMAKE_LINKER "${LLVM_TC_LINKER}"
toolchain_set "${file}" CMAKE_RC_COMPILER "${LLVM_TC_RC_COMPILER}"
toolchain_set "${file}" CMAKE_MT "${LLVM_TC_MT}"
}
llvm_prepare_toolchain_file() {
if [[ -z "${LLVM_TC_FILE}" ]] && llvm_has_toolchain_config; then
LLVM_TC_FILE="${LLVM_BUILD_DIR}/toolchain.cmake"
llvm_generate_toolchain_file "${LLVM_TC_FILE}"
echo "========== generated toolchain ==========" >&2
cat "${LLVM_TC_FILE}" >&2
echo "=========================================" >&2
fi
}
llvm_build_base() {
local src_dir=""
local jobs=""
local cmd=""
local build_cmd=""
local install_cmd=""
ensure_repo_version src_dir "llvm" "${LLVM_LLVM_VERSION}"
LLVM_SRC_DIR="${src_dir}/llvm"
mkdir -p "${LLVM_BUILD_DIR}"
mkdir -p "${LLVM_INSTALL_DIR}"
llvm_prepare_toolchain_file
jobs="$(nproc)"
cmd="\"${LLVM_CMAKE}\""
cmd="${cmd} -S \"${LLVM_SRC_DIR}\""
cmd="${cmd} -B \"${LLVM_BUILD_DIR}\""
cmd="${cmd} \"-DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL_DIR}\""
cmd="${cmd} \"-DCMAKE_BUILD_TYPE=${LLVM_BUILD_TYPE}\""
cmd="${cmd} -DLLVM_INCLUDE_TESTS=OFF"
cmd="${cmd} -DLLVM_INCLUDE_BENCHMARKS=OFF"
cmd="${cmd} -DLLVM_INCLUDE_EXAMPLES=OFF"
cmd="${cmd} -DLLVM_INCLUDE_DOCS=OFF"
if [[ -n "${LLVM_ENABLE_PROJECTS}" ]]; then
cmd="${cmd} \"-DLLVM_ENABLE_PROJECTS=${LLVM_ENABLE_PROJECTS}\""
fi
if [[ -n "${LLVM_TARGETS_TO_BUILD}" ]]; then
cmd="${cmd} \"-DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS_TO_BUILD}\""
fi
if [[ -n "${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}" ]]; then
cmd="${cmd} \"-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}\""
fi
if [[ -n "${LLVM_DEFAULT_TARGET_TRIPLE}" ]]; then
cmd="${cmd} \"-DLLVM_DEFAULT_TARGET_TRIPLE=${LLVM_DEFAULT_TARGET_TRIPLE}\""
fi
if [[ -n "${LLVM_TARGET_ARCH}" ]]; then
cmd="${cmd} \"-DLLVM_TARGET_ARCH=${LLVM_TARGET_ARCH}\""
fi
if [[ -n "${LLVM_NATIVE_TOOL_DIR}" ]]; then
cmd="${cmd} \"-DLLVM_NATIVE_TOOL_DIR=${LLVM_NATIVE_TOOL_DIR}\""
fi
if [[ -n "${LLVM_TABLEGEN}" ]]; then
cmd="${cmd} \"-DLLVM_TABLEGEN=${LLVM_TABLEGEN}\""
fi
if [[ -n "${LLVM_GENERATOR}" ]]; then
cmd="${cmd} -G \"${LLVM_GENERATOR}\""
fi
if [[ "${LLVM_GENERATOR}" == "Ninja" && -n "${LLVM_NINJA}" ]]; then
cmd="${cmd} \"-DCMAKE_MAKE_PROGRAM=${LLVM_NINJA}\""
fi
if [[ -n "${LLVM_TC_PTHREAD_LIB}" ]]; then
cmd="${cmd} \"-DCMAKE_C_STANDARD_LIBRARIES=${LLVM_TC_PTHREAD_LIB}\""
cmd="${cmd} \"-DCMAKE_CXX_STANDARD_LIBRARIES=${LLVM_TC_PTHREAD_LIB}\""
cmd="${cmd} \"-DCMAKE_THREAD_LIBS_INIT=${LLVM_TC_PTHREAD_LIB}\""
cmd="${cmd} \"-DLLVM_PTHREAD_LIB=${LLVM_TC_PTHREAD_LIB}\""
cmd="${cmd} -DCMAKE_HAVE_LIBC_PTHREAD=0"
cmd="${cmd} -DCMAKE_USE_PTHREADS_INIT=1"
cmd="${cmd} -DCMAKE_USE_WIN32_THREADS_INIT=0"
cmd="${cmd} -DCMAKE_HAVE_THREADS_LIBRARY=1"
cmd="${cmd} -DTHREADS_PREFER_PTHREAD_FLAG=ON"
fi
if [[ -n "${LLVM_TC_FILE}" ]]; then
cmd="${cmd} \"-DCMAKE_TOOLCHAIN_FILE=${LLVM_TC_FILE}\""
fi
exec_record_fast_fail "${cmd}"
build_cmd="\"${LLVM_CMAKE}\" --build \"${LLVM_BUILD_DIR}\" --parallel \"${jobs}\""
exec_record_fast_fail "${build_cmd}"
install_cmd="\"${LLVM_CMAKE}\" --install \"${LLVM_BUILD_DIR}\""
exec_record_fast_fail "${install_cmd}"
}
build_ubuntu2004_gcc93_native_clang() {
local suffix="_ubuntu2004_gcc93_native_clang"
clear_llvm_platform_config
LLVM_BUILD_DIR="${_ae_root_}/0_cmake_build_dir/llvm${suffix}"
LLVM_INSTALL_DIR="${_ae_root_}/0_cmake_install_dir/llvm${suffix}"
LLVM_BUILD_TYPE="Release"
LLVM_TC_C_COMPILER="/usr/bin/gcc"
LLVM_TC_CXX_COMPILER="/usr/bin/g++"
LLVM_ENABLE_PROJECTS="clang;lld"
LLVM_TARGETS_TO_BUILD="X86"
llvm_build_base
return 0
}
build_windows_lld_linux_x86_by_stage1_clang() {
local stage1_install_dir="$1"
local suffix="_windows_lld_linux_x86"
local extract_root="${_ae_root_}/0_sysroot/msys2"
local sysroot="${_ae_root_}/0_sysroot/msys2/mingw64"
local pkg_root="${_wget_cache_dir_}/msys2/mingw64"
local pkg_repo="mingw64"
local mingw_target="x86_64-w64-windows-gnu"
local linux_target="x86_64-linux-gnu"
local pkg_name=""
local pkg_path=""
local gcc_dir=""
local link_dirs=""
local cxx_config_h=""
local cxx_target_dir=""
local cxx_dir=""
local cxx_include_dirs=""
local packages=(
"mingw-w64-x86_64-headers-14.0.0.r147.g31bd54ab7-1-any.pkg.tar.zst"
"mingw-w64-x86_64-crt-14.0.0.r147.g31bd54ab7-1-any.pkg.tar.zst"
"mingw-w64-x86_64-libwinpthread-14.0.0.r147.g31bd54ab7-1-any.pkg.tar.zst"
"mingw-w64-x86_64-winpthreads-14.0.0.r147.g31bd54ab7-1-any.pkg.tar.zst"
"mingw-w64-x86_64-tzdata-2026b-1-any.pkg.tar.zst"
"mingw-w64-x86_64-gcc-libs-16.1.0-5-any.pkg.tar.zst"
"mingw-w64-x86_64-gcc-16.1.0-5-any.pkg.tar.zst"
"mingw-w64-x86_64-zlib-1.3.2-2-any.pkg.tar.zst"
)
rm -rf "${sysroot}"
mkdir -p "${extract_root}"
for pkg_name in "${packages[@]}"; do
pkg_path=""
download_msys2_pkg pkg_path "${pkg_repo}" "${pkg_name}" "${pkg_root}"
tar --zstd -xf "${pkg_path}" -C "${extract_root}" --exclude='.BUILDINFO' --exclude='.PKGINFO' --exclude='.MTREE' --exclude='.INSTALL'
done
gcc_dir="$(find "${sysroot}/lib/gcc/x86_64-w64-mingw32" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort -V | tail -n 1)"
if [[ -z "${gcc_dir}" ]]; then
log_error "msys2 gcc dir not found: ${sysroot}/lib/gcc/x86_64-w64-mingw32"
return 1
fi
cxx_config_h="$(find "${sysroot}/include/c++" -path "*/x86_64-w64-mingw32/bits/c++config.h" 2>/dev/null | sort -V | tail -n 1)"
if [[ -z "${cxx_config_h}" ]]; then
log_error "msys2 c++config.h not found: ${sysroot}/include/c++"
return 1
fi
cxx_target_dir="$(dirname "$(dirname "${cxx_config_h}")")"
cxx_dir="$(dirname "${cxx_target_dir}")"
link_dirs="${gcc_dir};${sysroot}/lib;${sysroot}/x86_64-w64-mingw32/lib"
cxx_include_dirs="${cxx_dir};${cxx_target_dir};${cxx_dir}/backward"
clear_llvm_platform_config
LLVM_BUILD_DIR="${_ae_root_}/0_cmake_build_dir/llvm${suffix}"
LLVM_INSTALL_DIR="${_ae_root_}/0_cmake_install_dir/llvm${suffix}"
LLVM_BUILD_TYPE="Release"
LLVM_TC_SYSTEM_NAME="Windows"
LLVM_TC_SYSTEM_PROCESSOR="x86_64"
LLVM_TC_C_COMPILER="${stage1_install_dir}/bin/clang"
LLVM_TC_CXX_COMPILER="${stage1_install_dir}/bin/clang++"
LLVM_TC_C_COMPILER_TARGET="${mingw_target}"
LLVM_TC_CXX_COMPILER_TARGET="${mingw_target}"
echo "22222222222222 ==================================== ${sysroot}"
LLVM_TC_SYSROOT="${sysroot}"
LLVM_TC_FIND_ROOT_PATH="${sysroot}"
LLVM_TC_FIND_ROOT_PATH_MODE_PROGRAM="NEVER"
LLVM_TC_FIND_ROOT_PATH_MODE_LIBRARY="ONLY"
LLVM_TC_FIND_ROOT_PATH_MODE_INCLUDE="ONLY"
LLVM_TC_FIND_ROOT_PATH_MODE_PACKAGE="ONLY"
LLVM_TC_LINKER_TYPE="LLD"
LLVM_TC_C_USING_LINKER_LLD="-fuse-ld=lld"
LLVM_TC_CXX_USING_LINKER_LLD="-fuse-ld=lld"
LLVM_TC_C_STANDARD_LINK_DIRECTORIES="${link_dirs}"
LLVM_TC_CXX_STANDARD_LINK_DIRECTORIES="${link_dirs}"
LLVM_TC_CXX_STANDARD_INCLUDE_DIRECTORIES="${cxx_include_dirs}"
LLVM_TC_PTHREAD_LIB="-lwinpthread"
LLVM_TC_AR="${stage1_install_dir}/bin/llvm-ar"
LLVM_TC_RANLIB="${stage1_install_dir}/bin/llvm-ranlib"
LLVM_TC_LINKER="${stage1_install_dir}/bin/ld.lld"
LLVM_TC_RC_COMPILER="/usr/bin/x86_64-w64-mingw32-windres"
LLVM_ENABLE_PROJECTS="lld"
LLVM_TARGETS_TO_BUILD="X86"
LLVM_DEFAULT_TARGET_TRIPLE="${linux_target}"
LLVM_NATIVE_TOOL_DIR="${stage1_install_dir}/bin"
LLVM_TABLEGEN="${stage1_install_dir}/bin/llvm-tblgen"
llvm_build_base
return 0
}
build_ubuntu2004_gcc93_clang_then_windows_lld_linux_x86() {
local stage1_suffix="_ubuntu2004_gcc93_native_clang"
local stage1_install_dir="${_ae_root_}/0_cmake_install_dir/llvm${stage1_suffix}"
build_windows_lld_linux_x86_by_stage1_clang "${stage1_install_dir}"
return 0
}