diff --git a/.gitignore b/.gitignore index c95d4337..5a741d58 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /compile_commands.json /.cache/ /_codeql_detected_source_root +bazel/external/__pycache__/ diff --git a/bazel/dependencies.bzl b/bazel/dependencies.bzl index e41e7889..5bbf6e47 100644 --- a/bazel/dependencies.bzl +++ b/bazel/dependencies.bzl @@ -17,6 +17,7 @@ load("@bazel_lib//lib:repositories.bzl", "bazel_lib_dependencies", "bazel_lib_re load("@com_google_googletest//:googletest_deps.bzl", "googletest_deps") load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") load("@envoy_toolshed//sysroot:sysroot.bzl", "setup_sysroots") +load("@llvm-raw//utils/bazel:configure.bzl", "llvm_configure") load("@proxy_wasm_cpp_host//bazel/cargo/wasmsign/remote:crates.bzl", wasmsign_crate_repositories = "crate_repositories") load("@proxy_wasm_cpp_host//bazel/cargo/wasmtime/remote:crates.bzl", wasmtime_crate_repositories = "crate_repositories") load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") @@ -107,6 +108,12 @@ def proxy_wasm_cpp_host_dependencies(): protobuf_deps() + # LLVM with native Bazel build (for WAMR JIT). + # Configure LLVM using its native Bazel overlay from utils/bazel. + # Only build X86 and AArch64 targets to minimize build size. + # Note: LLVM external dependencies (llvm_zlib, llvm_zstd) are defined in repositories.bzl + llvm_configure(name = "llvm-project", targets = ["X86", "AArch64"]) + # Wasmtime dependencies. wasmtime_crate_repositories() diff --git a/bazel/external/wamr.BUILD b/bazel/external/wamr.BUILD index cee9dc2c..9f628364 100644 --- a/bazel/external/wamr.BUILD +++ b/bazel/external/wamr.BUILD @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") licenses(["notice"]) # Apache 2 @@ -24,7 +25,35 @@ filegroup( ) cmake( - name = "wamr_lib", + name = "wamr_lib_cmake", + cache_entries = select({ + "@proxy_wasm_cpp_host//bazel:engine_wamr_jit": { + "BAZEL_BUILD": "ON", + # Set LLVM_INCLUDE_DIR for the patch to use + "LLVM_INCLUDE_DIR": "$$EXT_BUILD_ROOT/external/llvm_toolchain_llvm/include", + }, + "//conditions:default": {}, + }), + # LLVM dependencies for JIT are provided via Bazel, not CMake + # The patch skips LLVM CMake detection when BAZEL_BUILD is set + # LLVM headers from hermetic toolchain (bzlmod-compatible via data attribute) + # LLVM libraries are linked via cc_library deps (see wamr_lib below) + data = select({ + "@proxy_wasm_cpp_host//bazel:engine_wamr_jit": [ + "@llvm_toolchain_llvm//:all_includes", + ], + "//conditions:default": [], + }), + env = select({ + "@proxy_wasm_cpp_host//bazel:engine_wamr_jit": { + # Reference LLVM headers in sandbox via EXT_BUILD_ROOT + # The data attribute ensures llvm_toolchain_llvm is mounted in sandbox + # This path works with both WORKSPACE and bzlmod + "CFLAGS": "-isystem $$EXT_BUILD_ROOT/external/llvm_toolchain_llvm/include", + "CXXFLAGS": "-isystem $$EXT_BUILD_ROOT/external/llvm_toolchain_llvm/include", + }, + "//conditions:default": {}, + }), generate_args = [ # disable WASI "-DWAMR_BUILD_LIBC_WASI=0", @@ -47,7 +76,8 @@ cmake( "-GNinja", ] + select({ "@proxy_wasm_cpp_host//bazel:engine_wamr_jit": [ - "-DLLVM_DIR=$EXT_BUILD_DEPS/copy_llvm-19_1_0/llvm/lib/cmake/llvm", + # WAMR's CMake will find LLVM via CMAKE_PREFIX_PATH + # No need to set LLVM_DIR explicitly "-DWAMR_BUILD_AOT=1", "-DWAMR_BUILD_FAST_INTERP=0", "-DWAMR_BUILD_INTERP=0", @@ -65,13 +95,20 @@ cmake( ], }), lib_source = ":srcs", + out_static_libs = ["libiwasm.a"], +) + +# Wrapper library that adds LLVM dependencies for linking +cc_library( + name = "wamr_lib", linkopts = select({ "@proxy_wasm_cpp_host//bazel:engine_wamr_jit": ["-ldl"], "//conditions:default": [], }), - out_static_libs = ["libiwasm.a"], - deps = select({ - "@proxy_wasm_cpp_host//bazel:engine_wamr_jit": ["@llvm-19_1_0//:llvm_wamr_lib"], + deps = [":wamr_lib_cmake"] + select({ + "@proxy_wasm_cpp_host//bazel:engine_wamr_jit": [ + "@llvm-raw//:llvm_wamr_lib", + ], "//conditions:default": [], }), ) diff --git a/bazel/external/wamr.patch b/bazel/external/wamr.patch index 3220f52e..2b17f84d 100644 --- a/bazel/external/wamr.patch +++ b/bazel/external/wamr.patch @@ -12,10 +12,36 @@ index c33b211e..d04d0cc8 100644 EXPORT iwasmTargets LIBRARY DESTINATION lib diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake -index cb15b8b0..b71cf077 100644 +index cb15b8b0..41c32f79 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake -@@ -140,7 +140,7 @@ else () +@@ -103,14 +103,20 @@ if (WAMR_BUILD_JIT EQUAL 1) + if (NOT DEFINED LLVM_DIR) + set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") + set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/build") +- if (NOT EXISTS "${LLVM_BUILD_ROOT}") +- message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_BUILD_ROOT}") +- endif () + set (CMAKE_PREFIX_PATH "${LLVM_BUILD_ROOT};${CMAKE_PREFIX_PATH}") + set (LLVM_DIR ${LLVM_BUILD_ROOT}/lib/cmake/llvm) + endif () +- find_package(LLVM REQUIRED CONFIG) +- include_directories(${LLVM_INCLUDE_DIRS}) ++ # Skip LLVM CMake detection when BAZEL_BUILD is set (Bazel provides LLVM) ++ if (NOT DEFINED BAZEL_BUILD) ++ find_package(LLVM REQUIRED CONFIG) ++ include_directories(${LLVM_INCLUDE_DIRS}) ++ message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") ++ message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") ++ else() ++ # Bazel build: LLVM headers from hermetic toolchain, libs via cc_library ++ message(STATUS "Bazel build: Skipping LLVM find_package") ++ include_directories(${LLVM_INCLUDE_DIR}) ++ endif() + add_definitions(${LLVM_DEFINITIONS}) + message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") + message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") +@@ -140,7 +146,7 @@ else () endif () # Version diff --git a/bazel/external/wamr_llvm.BUILD b/bazel/external/wamr_llvm.BUILD index 726f5629..75f7980f 100644 --- a/bazel/external/wamr_llvm.BUILD +++ b/bazel/external/wamr_llvm.BUILD @@ -12,532 +12,89 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") +load("@rules_cc//cc:defs.bzl", "cc_library") licenses(["notice"]) # Apache 2 package(default_visibility = ["//visibility:public"]) -filegroup( - name = "srcs", - srcs = glob(["**"]), -) - -# Platform and architecture-aware alias that selects the appropriate LLVM configuration -alias( +# LLVM libraries needed by WAMR JIT - built with native Bazel. +# This replaces the foreign_cc cmake build of LLVM with native Bazel builds. +# These libraries are linked into the final binary, while WAMR's CMake build +# uses the hermetic LLVM toolchain's CMake configs for configuration only. +# Uses select() for CPU-specific libraries only. +cc_library( name = "llvm_wamr_lib", - actual = select({ - ":linux_x86_64": ":llvm_wamr_lib_linux_x86", - ":linux_aarch64": ":llvm_wamr_lib_linux_aarch64", - ":macos_x86_64": ":llvm_wamr_lib_macos_x86", - ":macos_aarch64": ":llvm_wamr_lib_macos_aarch64", - # Default to x86_64 Linux for other architectures - "//conditions:default": ":llvm_wamr_lib_linux_x86", + deps = [ + "@llvm-project//llvm:Analysis", + "@llvm-project//llvm:BitReader", + "@llvm-project//llvm:BitWriter", + "@llvm-project//llvm:CodeGen", + "@llvm-project//llvm:Core", + "@llvm-project//llvm:ExecutionEngine", + "@llvm-project//llvm:IPO", + "@llvm-project//llvm:IRReader", + "@llvm-project//llvm:InstCombine", + "@llvm-project//llvm:Instrumentation", + "@llvm-project//llvm:JITLink", + "@llvm-project//llvm:Linker", + "@llvm-project//llvm:MC", + "@llvm-project//llvm:MCJIT", + "@llvm-project//llvm:Object", + "@llvm-project//llvm:OrcJIT", + "@llvm-project//llvm:Passes", + "@llvm-project//llvm:Scalar", + "@llvm-project//llvm:Support", + "@llvm-project//llvm:Target", + "@llvm-project//llvm:TransformUtils", + "@llvm-project//llvm:Vectorize", + ] + select({ + "@platforms//cpu:x86_64": [ + "@llvm-project//llvm:X86AsmParser", + "@llvm-project//llvm:X86CodeGen", + "@llvm-project//llvm:X86Disassembler", + ], + "@platforms//cpu:aarch64": [ + "@llvm-project//llvm:AArch64AsmParser", + "@llvm-project//llvm:AArch64CodeGen", + "@llvm-project//llvm:AArch64Disassembler", + ], + "//conditions:default": [ + "@llvm-project//llvm:X86AsmParser", + "@llvm-project//llvm:X86CodeGen", + "@llvm-project//llvm:X86Disassembler", + ], }), ) -# LLVM configuration for Linux x86_64 builds -# LLVM_BUILD_UTILS and LLVM_INCLUDE_UTILS are disabled to avoid mlgo-utils -# test suite errors (requires llvm-objcopy and yaml2obj tools that are disabled). -# Only X86 target is built to minimize library size. -cmake( - name = "llvm_wamr_lib_linux_x86", - cache_entries = { - # Disable both: BUILD and INCLUDE, since some of the INCLUDE - # targets build code instead of only generating build files. - "LLVM_BUILD_BENCHMARKS": "off", - "LLVM_BUILD_DOCS": "off", - "LLVM_BUILD_EXAMPLES": "off", - "LLVM_BUILD_TESTS": "off", - "LLVM_BUILD_TOOLS": "off", - "LLVM_BUILD_UTILS": "off", - "LLVM_ENABLE_IDE": "off", - "LLVM_ENABLE_LIBEDIT": "off", - "LLVM_ENABLE_LIBXML2": "off", - "LLVM_ENABLE_TERMINFO": "off", - "LLVM_ENABLE_ZLIB": "off", - "LLVM_ENABLE_ZSTD": "off", - "LLVM_INCLUDE_BENCHMARKS": "off", - "LLVM_INCLUDE_DOCS": "off", - "LLVM_INCLUDE_EXAMPLES": "off", - "LLVM_INCLUDE_TESTS": "off", - "LLVM_INCLUDE_TOOLS": "off", - "LLVM_INCLUDE_UTILS": "off", - "LLVM_TARGETS_TO_BUILD": "X86", - "CMAKE_CXX_FLAGS": "-Wno-unused-command-line-argument", - }, - # `lld` works on Linux - generate_args = [ - "-GNinja", - "-DLLVM_USE_LINKER=lld", - ], - lib_source = ":srcs", - out_data_dirs = [ - "libexec", - "share", - ], - out_static_libs = [ - # How to get the library list: - # build LLVM with "-DLLVM_INCLUDE_TOOLS=ON" - # cd bin and run "./llvm-config --libnames" - # X86-specific libraries only (no AArch64, no Windows-specific libs) - "libLLVMX86Disassembler.a", - "libLLVMX86AsmParser.a", - "libLLVMX86CodeGen.a", - "libLLVMX86Desc.a", - "libLLVMX86Info.a", - "libLLVMOrcJIT.a", - "libLLVMMCJIT.a", - "libLLVMJITLink.a", - "libLLVMInterpreter.a", - "libLLVMExecutionEngine.a", - "libLLVMRuntimeDyld.a", - "libLLVMOrcTargetProcess.a", - "libLLVMOrcShared.a", - "libLLVMDWP.a", - "libLLVMSymbolize.a", - "libLLVMDebugInfoPDB.a", - "libLLVMDebugInfoGSYM.a", - "libLLVMDebugInfoBTF.a", - "libLLVMOption.a", - "libLLVMObjectYAML.a", - "libLLVMMCA.a", - "libLLVMMCDisassembler.a", - "libLLVMLTO.a", - "libLLVMPasses.a", - "libLLVMHipStdPar.a", - "libLLVMCFGuard.a", - "libLLVMCoroutines.a", - "libLLVMObjCARCOpts.a", - "libLLVMipo.a", - "libLLVMVectorize.a", - "libLLVMLinker.a", - "libLLVMInstrumentation.a", - "libLLVMFrontendOpenMP.a", - "libLLVMFrontendOffloading.a", - "libLLVMFrontendOpenACC.a", - "libLLVMExtensions.a", - "libLLVMDWARFLinker.a", - "libLLVMGlobalISel.a", - "libLLVMMIRParser.a", - "libLLVMAsmPrinter.a", - "libLLVMDebugInfoMSF.a", - "libLLVMDebugInfoDWARF.a", - "libLLVMSelectionDAG.a", - "libLLVMCodeGenTypes.a", - "libLLVMCodeGen.a", - "libLLVMIRPrinter.a", - "libLLVMIRReader.a", - "libLLVMAsmParser.a", - "libLLVMInterfaceStub.a", - "libLLVMFileCheck.a", - "libLLVMFuzzMutate.a", - "libLLVMTarget.a", - "libLLVMScalarOpts.a", - "libLLVMInstCombine.a", - "libLLVMAggressiveInstCombine.a", - "libLLVMTransformUtils.a", - "libLLVMBitWriter.a", - "libLLVMAnalysis.a", - "libLLVMProfileData.a", - "libLLVMObject.a", - "libLLVMTextAPI.a", - "libLLVMMCParser.a", - "libLLVMMC.a", - "libLLVMDebugInfoCodeView.a", - "libLLVMBitReader.a", - "libLLVMCore.a", - "libLLVMRemarks.a", - "libLLVMBitstreamReader.a", - "libLLVMBinaryFormat.a", - "libLLVMWindowsDriver.a", - "libLLVMTableGen.a", - "libLLVMTargetParser.a", - "libLLVMSupport.a", - "libLLVMDemangle.a", - ], - working_directory = "llvm", -) - -# LLVM configuration for Linux aarch64 builds -# Similar to Linux x86_64 but builds only AArch64 target. -cmake( - name = "llvm_wamr_lib_linux_aarch64", - cache_entries = { - "LLVM_BUILD_BENCHMARKS": "off", - "LLVM_BUILD_DOCS": "off", - "LLVM_BUILD_EXAMPLES": "off", - "LLVM_BUILD_TESTS": "off", - "LLVM_BUILD_TOOLS": "off", - "LLVM_BUILD_UTILS": "off", - "LLVM_ENABLE_IDE": "off", - "LLVM_ENABLE_LIBEDIT": "off", - "LLVM_ENABLE_LIBXML2": "off", - "LLVM_ENABLE_TERMINFO": "off", - "LLVM_ENABLE_ZLIB": "off", - "LLVM_ENABLE_ZSTD": "off", - "LLVM_INCLUDE_BENCHMARKS": "off", - "LLVM_INCLUDE_DOCS": "off", - "LLVM_INCLUDE_EXAMPLES": "off", - "LLVM_INCLUDE_TESTS": "off", - "LLVM_INCLUDE_TOOLS": "off", - "LLVM_INCLUDE_UTILS": "off", - "LLVM_TARGETS_TO_BUILD": "AArch64", - "CMAKE_CXX_FLAGS": "-Wno-unused-command-line-argument", - }, - # `lld` works on Linux - generate_args = [ - "-GNinja", - "-DLLVM_USE_LINKER=lld", - ], - lib_source = ":srcs", - out_data_dirs = [ - "libexec", - "share", - ], - out_static_libs = [ - "libLLVMAArch64Disassembler.a", - "libLLVMAArch64AsmParser.a", - "libLLVMAArch64CodeGen.a", - "libLLVMAArch64Desc.a", - "libLLVMAArch64Info.a", - "libLLVMAArch64Utils.a", - "libLLVMOrcJIT.a", - "libLLVMMCJIT.a", - "libLLVMJITLink.a", - "libLLVMInterpreter.a", - "libLLVMExecutionEngine.a", - "libLLVMRuntimeDyld.a", - "libLLVMOrcTargetProcess.a", - "libLLVMOrcShared.a", - "libLLVMDWP.a", - "libLLVMSymbolize.a", - "libLLVMDebugInfoPDB.a", - "libLLVMDebugInfoGSYM.a", - "libLLVMDebugInfoBTF.a", - "libLLVMOption.a", - "libLLVMObjectYAML.a", - "libLLVMMCA.a", - "libLLVMMCDisassembler.a", - "libLLVMLTO.a", - "libLLVMPasses.a", - "libLLVMHipStdPar.a", - "libLLVMCFGuard.a", - "libLLVMCoroutines.a", - "libLLVMObjCARCOpts.a", - "libLLVMipo.a", - "libLLVMVectorize.a", - "libLLVMLinker.a", - "libLLVMInstrumentation.a", - "libLLVMFrontendOpenMP.a", - "libLLVMFrontendOffloading.a", - "libLLVMFrontendOpenACC.a", - "libLLVMExtensions.a", - "libLLVMDWARFLinker.a", - "libLLVMGlobalISel.a", - "libLLVMMIRParser.a", - "libLLVMAsmPrinter.a", - "libLLVMDebugInfoMSF.a", - "libLLVMDebugInfoDWARF.a", - "libLLVMSelectionDAG.a", - "libLLVMCodeGenTypes.a", - "libLLVMCodeGen.a", - "libLLVMIRPrinter.a", - "libLLVMIRReader.a", - "libLLVMAsmParser.a", - "libLLVMInterfaceStub.a", - "libLLVMFileCheck.a", - "libLLVMFuzzMutate.a", - "libLLVMTarget.a", - "libLLVMScalarOpts.a", - "libLLVMInstCombine.a", - "libLLVMAggressiveInstCombine.a", - "libLLVMTransformUtils.a", - "libLLVMBitWriter.a", - "libLLVMAnalysis.a", - "libLLVMProfileData.a", - "libLLVMObject.a", - "libLLVMTextAPI.a", - "libLLVMMCParser.a", - "libLLVMMC.a", - "libLLVMDebugInfoCodeView.a", - "libLLVMBitReader.a", - "libLLVMCore.a", - "libLLVMRemarks.a", - "libLLVMBitstreamReader.a", - "libLLVMBinaryFormat.a", - "libLLVMWindowsDriver.a", - "libLLVMTableGen.a", - "libLLVMTargetParser.a", - "libLLVMSupport.a", - "libLLVMDemangle.a", - ], - working_directory = "llvm", -) - -# LLVM configuration for macOS x86_64 builds -# LLVM_BUILD_UTILS and LLVM_INCLUDE_UTILS are disabled to avoid mlgo-utils -# test suite errors (requires llvm-objcopy and yaml2obj tools that are disabled). -# Only X86 target is built to minimize library size. -cmake( - name = "llvm_wamr_lib_macos_x86", - cache_entries = { - # Disable both: BUILD and INCLUDE, since some of the INCLUDE - # targets build code instead of only generating build files. - "CMAKE_OSX_ARCHITECTURES": "x86_64", - "LLVM_BUILD_BENCHMARKS": "off", - "LLVM_BUILD_DOCS": "off", - "LLVM_BUILD_EXAMPLES": "off", - "LLVM_BUILD_TESTS": "off", - "LLVM_BUILD_TOOLS": "off", - "LLVM_BUILD_UTILS": "off", - "LLVM_ENABLE_IDE": "off", - "LLVM_ENABLE_LIBEDIT": "off", - "LLVM_ENABLE_LIBXML2": "off", - "LLVM_ENABLE_TERMINFO": "off", - "LLVM_ENABLE_ZLIB": "off", - "LLVM_ENABLE_ZSTD": "off", - "LLVM_INCLUDE_BENCHMARKS": "off", - "LLVM_INCLUDE_DOCS": "off", - "LLVM_INCLUDE_EXAMPLES": "off", - "LLVM_INCLUDE_TESTS": "off", - "LLVM_INCLUDE_TOOLS": "off", - "LLVM_INCLUDE_UTILS": "off", - "LLVM_TARGETS_TO_BUILD": "X86", - "CMAKE_CXX_FLAGS": "-Wno-unused-command-line-argument", - }, - # `lld` doesn't work on macOS - generate_args = ["-GNinja"], - lib_source = ":srcs", - out_data_dirs = [ - "libexec", - "share", - ], - out_static_libs = [ - # How to get the library list: - # build LLVM with "-DLLVM_INCLUDE_TOOLS=ON" - # cd bin and run "./llvm-config --libnames" - # X86-specific libraries only (no AArch64, no Windows-specific libs) - "libLLVMX86Disassembler.a", - "libLLVMX86AsmParser.a", - "libLLVMX86CodeGen.a", - "libLLVMX86Desc.a", - "libLLVMX86Info.a", - "libLLVMOrcJIT.a", - "libLLVMMCJIT.a", - "libLLVMJITLink.a", - "libLLVMInterpreter.a", - "libLLVMExecutionEngine.a", - "libLLVMRuntimeDyld.a", - "libLLVMOrcTargetProcess.a", - "libLLVMOrcShared.a", - "libLLVMDWP.a", - "libLLVMSymbolize.a", - "libLLVMDebugInfoPDB.a", - "libLLVMDebugInfoGSYM.a", - "libLLVMDebugInfoBTF.a", - "libLLVMOption.a", - "libLLVMObjectYAML.a", - "libLLVMMCA.a", - "libLLVMMCDisassembler.a", - "libLLVMLTO.a", - "libLLVMPasses.a", - "libLLVMHipStdPar.a", - "libLLVMCFGuard.a", - "libLLVMCoroutines.a", - "libLLVMObjCARCOpts.a", - "libLLVMipo.a", - "libLLVMVectorize.a", - "libLLVMLinker.a", - "libLLVMInstrumentation.a", - "libLLVMFrontendOpenMP.a", - "libLLVMFrontendOffloading.a", - "libLLVMFrontendOpenACC.a", - "libLLVMExtensions.a", - "libLLVMDWARFLinker.a", - "libLLVMGlobalISel.a", - "libLLVMMIRParser.a", - "libLLVMAsmPrinter.a", - "libLLVMDebugInfoMSF.a", - "libLLVMDebugInfoDWARF.a", - "libLLVMSelectionDAG.a", - "libLLVMCodeGenTypes.a", - "libLLVMCodeGen.a", - "libLLVMIRPrinter.a", - "libLLVMIRReader.a", - "libLLVMAsmParser.a", - "libLLVMInterfaceStub.a", - "libLLVMFileCheck.a", - "libLLVMFuzzMutate.a", - "libLLVMTarget.a", - "libLLVMScalarOpts.a", - "libLLVMInstCombine.a", - "libLLVMAggressiveInstCombine.a", - "libLLVMTransformUtils.a", - "libLLVMBitWriter.a", - "libLLVMAnalysis.a", - "libLLVMProfileData.a", - "libLLVMObject.a", - "libLLVMTextAPI.a", - "libLLVMMCParser.a", - "libLLVMMC.a", - "libLLVMDebugInfoCodeView.a", - "libLLVMBitReader.a", - "libLLVMCore.a", - "libLLVMRemarks.a", - "libLLVMBitstreamReader.a", - "libLLVMBinaryFormat.a", - "libLLVMWindowsDriver.a", - "libLLVMTableGen.a", - "libLLVMTargetParser.a", - "libLLVMSupport.a", - "libLLVMDemangle.a", - ], - working_directory = "llvm", -) - -# LLVM configuration for macOS aarch64 builds -cmake( - name = "llvm_wamr_lib_macos_aarch64", - cache_entries = { - "CMAKE_OSX_ARCHITECTURES": "arm64", - "LLVM_BUILD_BENCHMARKS": "off", - "LLVM_BUILD_DOCS": "off", - "LLVM_BUILD_EXAMPLES": "off", - "LLVM_BUILD_TESTS": "off", - "LLVM_BUILD_TOOLS": "off", - "LLVM_BUILD_UTILS": "off", - "LLVM_ENABLE_IDE": "off", - "LLVM_ENABLE_LIBEDIT": "off", - "LLVM_ENABLE_LIBXML2": "off", - "LLVM_ENABLE_TERMINFO": "off", - "LLVM_ENABLE_ZLIB": "off", - "LLVM_ENABLE_ZSTD": "off", - "LLVM_INCLUDE_BENCHMARKS": "off", - "LLVM_INCLUDE_DOCS": "off", - "LLVM_INCLUDE_EXAMPLES": "off", - "LLVM_INCLUDE_TESTS": "off", - "LLVM_INCLUDE_TOOLS": "off", - "LLVM_INCLUDE_UTILS": "off", - "LLVM_TARGETS_TO_BUILD": "AArch64", - "CMAKE_CXX_FLAGS": "-Wno-unused-command-line-argument", - }, - # `lld` doesn't work on macOS - generate_args = ["-GNinja"], - lib_source = ":srcs", - out_data_dirs = [ - "libexec", - "share", - ], - out_static_libs = [ - "libLLVMAArch64Disassembler.a", - "libLLVMAArch64AsmParser.a", - "libLLVMAArch64CodeGen.a", - "libLLVMAArch64Desc.a", - "libLLVMAArch64Info.a", - "libLLVMAArch64Utils.a", - "libLLVMOrcJIT.a", - "libLLVMMCJIT.a", - "libLLVMJITLink.a", - "libLLVMInterpreter.a", - "libLLVMExecutionEngine.a", - "libLLVMRuntimeDyld.a", - "libLLVMOrcTargetProcess.a", - "libLLVMOrcShared.a", - "libLLVMDWP.a", - "libLLVMSymbolize.a", - "libLLVMDebugInfoPDB.a", - "libLLVMDebugInfoGSYM.a", - "libLLVMDebugInfoBTF.a", - "libLLVMOption.a", - "libLLVMObjectYAML.a", - "libLLVMMCA.a", - "libLLVMMCDisassembler.a", - "libLLVMLTO.a", - "libLLVMPasses.a", - "libLLVMHipStdPar.a", - "libLLVMCFGuard.a", - "libLLVMCoroutines.a", - "libLLVMObjCARCOpts.a", - "libLLVMipo.a", - "libLLVMVectorize.a", - "libLLVMLinker.a", - "libLLVMInstrumentation.a", - "libLLVMFrontendOpenMP.a", - "libLLVMFrontendOffloading.a", - "libLLVMFrontendOpenACC.a", - "libLLVMExtensions.a", - "libLLVMDWARFLinker.a", - "libLLVMGlobalISel.a", - "libLLVMMIRParser.a", - "libLLVMAsmPrinter.a", - "libLLVMDebugInfoMSF.a", - "libLLVMDebugInfoDWARF.a", - "libLLVMSelectionDAG.a", - "libLLVMCodeGenTypes.a", - "libLLVMCodeGen.a", - "libLLVMIRPrinter.a", - "libLLVMIRReader.a", - "libLLVMAsmParser.a", - "libLLVMInterfaceStub.a", - "libLLVMFileCheck.a", - "libLLVMFuzzMutate.a", - "libLLVMTarget.a", - "libLLVMScalarOpts.a", - "libLLVMInstCombine.a", - "libLLVMAggressiveInstCombine.a", - "libLLVMTransformUtils.a", - "libLLVMBitWriter.a", - "libLLVMAnalysis.a", - "libLLVMProfileData.a", - "libLLVMObject.a", - "libLLVMTextAPI.a", - "libLLVMMCParser.a", - "libLLVMMC.a", - "libLLVMDebugInfoCodeView.a", - "libLLVMBitReader.a", - "libLLVMCore.a", - "libLLVMRemarks.a", - "libLLVMBitstreamReader.a", - "libLLVMBinaryFormat.a", - "libLLVMWindowsDriver.a", - "libLLVMTableGen.a", - "libLLVMTargetParser.a", - "libLLVMSupport.a", - "libLLVMDemangle.a", - ], - working_directory = "llvm", -) - -# Platform-specific config settings to enable proper select() in alias rule -config_setting( - name = "linux_x86_64", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - ], -) - -config_setting( - name = "linux_aarch64", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:aarch64", - ], -) - -config_setting( - name = "macos_x86_64", - constraint_values = [ - "@platforms//os:macos", - "@platforms//cpu:x86_64", - ], +# Create a tarball with LLVM headers preserving directory structure +# This is a robust, bzlmod-compatible solution for providing headers to rules_foreign_cc +genrule( + name = "package_llvm_headers", + srcs = ["@llvm_toolchain_llvm//:all_includes"], + outs = ["llvm_headers.tar.gz"], + cmd = """ + # Create temporary directory for building the archive + TMPDIR=$$(mktemp -d) + + # Copy all headers preserving directory structure + # The all_includes filegroup contains files like include/llvm/Config/llvm-config.h + for src in $(SRCS); do + # Extract the path relative to the workspace + # Files are like external/llvm_toolchain_llvm/include/llvm/... + rel_path=$$(echo $$src | sed 's|.*/llvm_toolchain_llvm/||') + dest_path=$$TMPDIR/$$rel_path + mkdir -p $$(dirname $$dest_path) + cp $$src $$dest_path + done + + # Create tarball from the temp directory + tar -czf $(location llvm_headers.tar.gz) -C $$TMPDIR . + rm -rf $$TMPDIR + """, ) -config_setting( - name = "macos_aarch64", - constraint_values = [ - "@platforms//os:macos", - "@platforms//cpu:aarch64", - ], +filegroup( + name = "llvm_headers", + srcs = [":package_llvm_headers"], ) diff --git a/bazel/repositories.bzl b/bazel/repositories.bzl index 26bb34bd..eeb7a468 100644 --- a/bazel/repositories.bzl +++ b/bazel/repositories.bzl @@ -312,13 +312,36 @@ def proxy_wasm_cpp_host_repositories(): maybe( http_archive, - name = "llvm-19_1_0", + name = "llvm-raw", build_file = "@proxy_wasm_cpp_host//bazel/external:wamr_llvm.BUILD", sha256 = "5042522b49945bc560ff9206f25fb87980a9b89b914193ca00d961511ff0673c", strip_prefix = "llvm-project-19.1.0.src", url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-19.1.0/llvm-project-19.1.0.src.tar.xz", ) + # LLVM external dependencies for native Bazel build. + maybe( + http_archive, + name = "llvm_zlib", + build_file = "@llvm-raw//utils/bazel/third_party_build:zlib-ng.BUILD", + sha256 = "e36bb346c00472a1f9ff2a0a4643e590a254be6379da7cddd9daeb9a7f296731", + strip_prefix = "zlib-ng-2.0.7", + urls = [ + "https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.0.7.zip", + ], + ) + + maybe( + http_archive, + name = "llvm_zstd", + build_file = "@llvm-raw//utils/bazel/third_party_build:zstd.BUILD", + sha256 = "7c42d56fac126929a6a85dbc73ff1db2411d04f104fae9bdea51305663a83fd0", + strip_prefix = "zstd-1.5.2", + urls = [ + "https://github.com/facebook/zstd/releases/download/v1.5.2/zstd-1.5.2.tar.gz", + ], + ) + # WasmEdge with dependencies. maybe(