import os import subprocess import lib.cpp as cpp from lib import arch from lib.make import * version("22.1.7") source_url( "https://github.com/llvm/llvm-project/releases/download/llvmorg-22.1.7/llvm-project-22.1.7.src.tar.xz" ) def llvm_host_triple(): return arch.get_target().replace("-semios-linux", "-semios-linux-musl") def build(): subprocess.run( [ "cmake", "-G", "Ninja", "-S", "llvm", "-B", "build", "-DCMAKE_BUILD_TYPE=Release", f"-DLLVM_DEFAULT_TARGET_TRIPLE={llvm_host_triple()}", f"-DLLVM_HOST_TRIPLE={llvm_host_triple()}", "-DLLVM_ENABLE_PROJECTS=clang;lldb;lld;bolt", "-DLLVM_ENABLE_RUNTIMES=libcxx;libcxxabi;libunwind;compiler-rt", "-DLLVM_ENABLE_EH=ON", "-DLLVM_ENABLE_RTTI=ON", "-DCMAKE_INSTALL_PREFIX=/", "-DLLVM_ENABLE_ASSERTIONS=OFF", "-DLLVM_BUILD_LLVM_DYLIB=ON", "-DLLVM_ENABLE_LIBCXX=ON", "-DLLVM_ENABLE_LIBEDIT=ON", "-DLLVM_LINK_LLVM_DYLIB=ON", "-DLIBCXX_HAS_MUSL_LIBC=ON", "-DCOMPILER_RT_BUILD_GWP_ASAN=OFF", ], check=True, ) subprocess.run(["cmake", "--build", "build"], check=True) os.environ["DESTDIR"] = os.getcwd() + "/cpp_install" subprocess.run(["cmake", "--install", "build"], check=True) os.chdir("cpp_install") on_build(build) def pack_runtime_lib(composer, files): composer.makedir("lib") for file in files: composer.addfile(f"lib/{llvm_host_triple()}/{file}", f"lib/{file}") def pack_runtime_dev(composer, files: list[str]): for file in files: if file.startswith("lib/"): composer.makedirs("lib") composer.addfile(file.replace("lib/", f"lib/{llvm_host_triple()}/"), file) elif file.startswith("include/"): realpath = file.replace("include/", "usr/include/") composer.makedirs(os.path.dirname(file)) if os.path.isfile(realpath): composer.addfile(realpath, file) elif os.path.isdir(realpath): composer.add_dir(realpath, file) package("libunwind") on_pack( lambda composer: pack_runtime_lib( composer, ["libunwind.so.1.0", "libunwind.so.1", "libunwind.so"] ) ) package("libunwind-dev") on_pack( lambda composer: pack_runtime_dev( composer, [ "lib/libunwind.a", "include/mach-o/compact_unwind_encoding.h", "include/__libunwind_config.h", "include/libunwind.h", "include/libunwind.modulemap", "include/unwind.h", "include/unwind_arm_ehabi.h", "include/unwind_itanium.h", ], ) ) package("libcxxabi") on_pack( lambda composer: pack_runtime_lib( composer, ["libc++abi.so", "libc++abi.so.1", "libc++abi.so.1.0"] ) ) package("libcxxabi-dev") on_pack(lambda composer: pack_runtime_dev(composer, ["lib/libc++abi.a"])) package("libcxx") on_pack( lambda composer: pack_runtime_lib( composer, ["libc++.so", "libc++.so.1", "libc++.so.1.0"] ) ) package("libcxx-dev") on_pack( lambda composer: pack_runtime_dev( composer, [ "lib/libc++.a", "lib/libc++experimental.a", "lib/libc++.modules.json", f"include/{llvm_host_triple()}/c++/v1", "include/c++/v1", ], ) ) def pack_libllvm(composer): LIBRARIES = [ "libLLVM.so.22.1", "libLLVM.so", "libLLVM-22.so", "libLTO.so", "libLTO.so.22.1", "libRemarks.so", "libRemarks.so.22.1", ] composer.makedir("lib") for lib in LIBRARIES: composer.addfile(f"lib/{lib}", f"lib/{lib}") package("libllvm") on_pack(pack_libllvm) def pack_llvm(composer): BINARIES = [ "bugpoint", "dsymutil", "llc", "lli", "llvm-addr2line", "llvm-ar", "llvm-as", "llvm-bcanalyzer", "llvm-bitcode-strip", "llvm-bolt", "llvm-bolt-binary-analysis", "llvm-bolt-heatmap", "llvm-boltdiff", "llvm-c-test", "llvm-cas", "llvm-cat", "llvm-cfi-verify", "llvm-cgdata", "llvm-config", "llvm-cov", "llvm-ctxprof-util", "llvm-cvtres", "llvm-cxxdump", "llvm-cxxfilt", "llvm-cxxmap", "llvm-debuginfo-analyzer", "llvm-debuginfod", "llvm-debuginfod-find", "llvm-diff", "llvm-dis", "llvm-dlltool", "llvm-dwarfdump", "llvm-dwarfutil", "llvm-dwp", "llvm-exegesis", "llvm-extract", "llvm-gsymutil", "llvm-ifs", "llvm-install-name-tool", "llvm-ir2vec", "llvm-jitlink", "llvm-lib", "llvm-libtool-darwin", "llvm-link", "llvm-lipo", "llvm-lto", "llvm-lto2", "llvm-mc", "llvm-mca", "llvm-ml", "llvm-ml64", "llvm-modextract", "llvm-nm", "llvm-objcopy", "llvm-objdump", "llvm-offload-binary", "llvm-offload-wrapper", "llvm-opt-report", "llvm-otool", "llvm-pdbutil", "llvm-profdata", "llvm-profgen", "llvm-ranlib", "llvm-rc", "llvm-readelf", "llvm-readobj", "llvm-readtapi", "llvm-reduce", "llvm-remarkutil", "llvm-rtdyld", "llvm-sim", "llvm-size", "llvm-split", "llvm-stress", "llvm-strings", "llvm-strip", "llvm-symbolizer", "llvm-tblgen", "llvm-tli-checker", "llvm-undname", "llvm-windres", "llvm-xray", "merge-fdata", "opt", "perf2bolt", "reduce-chunk-list", "sancov", "sanstats", "verify-uselistorder", ] composer.makedir("bin") for bin in BINARIES: composer.addfile(f"usr/bin/{bin}", f"bin/{bin}") package("llvm") on_pack(pack_llvm) def pack_lld(composer): BINARIES = ["lld", "lld-link", "ld.lld", "ld64.lld", "wasm-ld"] composer.makedir("bin") for bin in BINARIES: composer.addfile(f"usr/bin/{bin}", f"bin/{bin}") package("lld") on_pack(pack_lld) def pack_liblldb(composer): LIBRARIES = [ "liblldb.so", "liblldb.so.22.1", "liblldb.so.22.1.7", "liblldbIntelFeatures.so", "liblldbIntelFeatures.so.22.1", ] composer.makedir("lib") for lib in LIBRARIES: composer.addfile(f"lib/{lib}", f"lib/{lib}") package("liblldb") on_pack(pack_liblldb) def pack_lldb(composer): BINARIES = [ "lldb", "lldb-argdumper", "lldb-dap", "lldb-instr", "lldb-mcp", "lldb-server", "yaml2macho-core", ] composer.makedir("bin") for bin in BINARIES: composer.addfile(f"bin/{bin}", f"bin/{bin}") package("lldb") on_pack(pack_lldb) def pack_libclang(composer): LIBRARIES = [ "libclang.so", "libclang-cpp.so", "libclang-cpp.so.22.1", "libclang.so.22.1", "libclang.so.22.1.7", ] composer.makedir("lib") for lib in LIBRARIES: composer.addfile(f"lib/{lib}", f"lib/{lib}") package("libclang") on_pack(pack_libclang) def pack_clang(composer): BINARIES = [ "clang", "clang++", "clang-22", "clang-check", "clang-cl", "clang-cpp", "clang-extdef-mapping", "clang-format", "clang-installapi", "clang-linker-wrapper", "clang-nvlink-wrapper", "clang-offload-bundler", "clang-offload-packager", "clang-refactor", "clang-repl", "clang-scan-deps", "clang-sycl-linker", "clang-tblgen", "diagtool", "git-clang-format", "hmaptool", "intercept-build", "amdgpu-arch", "c-index-test", "analyze-build", "nvptx-arch", "offload-arch", "scan-build", "scan-build-py", "scan-view", ] LIBEXEC = [ "analyze-c++", "analyze-cc", "c++-analyzer", "ccc-analyzer", "intercept-c++", "intercept-cc", ] composer.makedir("bin") for bin in BINARIES: composer.addfile(f"usr/bin/{bin}", f"bin/{bin}") composer.makedir("libexec") for libexec in LIBEXEC: composer.addfile(f"usr/libexec/{libexec}", f"libexec/{libexec}") package("clang") on_pack(pack_clang)