Unbreak the `byo_llvm.sh` build with `iree_bitcode_library`. (#13968)
The byo-llvm build is broken by the way `iree_bitcode_library` assumes
it's dealing with our own bundled `clang` (#13957). This is an attempt
to fix that. Specifically, this implements the idea in
https://github.com/openxla/iree/issues/13957#issuecomment-1579175544 .
So `iree_bitcode_library` is changed to take `clang`, Clang builtin
headers, and `llvm-link` paths from externally defined variables.
`iree_llvm.cmake` is updated to set these variables appropriately, in
both the bundled and the installed cases.
`byo_llvm.sh` is updated to pass a `LLVM_INSTALL_DIR` to
`iree_llvm.cmake`.
Fixes #13957 .
diff --git a/build_tools/cmake/iree_bitcode_library.cmake b/build_tools/cmake/iree_bitcode_library.cmake
index 6b175f0..593348a 100644
--- a/build_tools/cmake/iree_bitcode_library.cmake
+++ b/build_tools/cmake/iree_bitcode_library.cmake
@@ -25,25 +25,12 @@
${ARGN}
)
- set(_CLANG_TOOL "$<TARGET_FILE:${IREE_CLANG_TARGET}>")
- set(_LINK_TOOL "$<TARGET_FILE:${IREE_LLVM_LINK_TARGET}>")
-
if(DEFINED _RULE_OUT)
set(_OUT "${_RULE_OUT}")
else()
set(_OUT "${_RULE_NAME}.bc")
endif()
- # We need CLANG_VERSION_MAJOR to set up include directories. Unfortunately,
- # Clang's own CMakeLists do not expose CLANG_VERSION_MAJOR to PARENT_SCOPE.
- # Likewise with LLVM_VERSION_MAJOR. However, CLANG_EXECUTABLE_VERSION is
- # CACHE'd, so we can access it, and it currently has the same value.
- set(_CLANG_VERSION_MAJOR "${CLANG_EXECUTABLE_VERSION}")
-
- # These are copied as part of the clang build; we could allow the user to
- # override this but it should be harmless.
- set(_BUILTIN_HEADERS_PATH "${IREE_BINARY_DIR}/llvm-project/lib/clang/${_CLANG_VERSION_MAJOR}/include/")
-
iree_arch_to_llvm_arch(_LLVM_ARCH "${_RULE_ARCH}")
set(_COPTS
@@ -77,7 +64,7 @@
"-DIREE_DEVICE_STANDALONE=1"
)
- list(APPEND _COPTS "-isystem" "${_BUILTIN_HEADERS_PATH}")
+ list(APPEND _COPTS "-isystem" "${IREE_CLANG_BUILTIN_HEADERS_PATH}")
list(APPEND _COPTS "-I" "${IREE_SOURCE_DIR}/runtime/src")
list(APPEND _COPTS "-I" "${IREE_BINARY_DIR}/runtime/src")
list(APPEND _COPTS "${_RULE_COPTS}")
@@ -91,14 +78,13 @@
OUTPUT
"${_BITCODE_FILE}"
COMMAND
- "${_CLANG_TOOL}"
+ "${IREE_CLANG_BINARY}"
${_COPTS}
"${_BITCODE_SRC_PATH}"
"-o"
"${_BITCODE_FILE}"
DEPENDS
- "${_CLANG_TOOL}"
- "${_LINK_TOOL}"
+ "${IREE_CLANG_BINARY}"
"${_SRC}"
COMMENT
"Compiling ${_SRC} to ${_BITCODE_FILE}"
@@ -110,12 +96,12 @@
OUTPUT
${_OUT}
COMMAND
- ${_LINK_TOOL}
+ ${IREE_LLVM_LINK_BINARY}
${_BITCODE_FILES}
"-o"
"${_OUT}"
DEPENDS
- ${_LINK_TOOL}
+ ${IREE_LLVM_LINK_BINARY}
${_BITCODE_FILES}
COMMENT
"Linking bitcode to ${_OUT}"
@@ -147,8 +133,6 @@
${ARGN}
)
- set(_LINK_TOOL "$<TARGET_FILE:${IREE_LLVM_LINK_TARGET}>")
-
if(DEFINED _RULE_OUT)
set(_OUT "${_RULE_OUT}")
else()
@@ -161,12 +145,12 @@
OUTPUT
${_OUT}
COMMAND
- ${_LINK_TOOL}
+ ${IREE_LLVM_LINK_BINARY}
${_BITCODE_FILES}
"-o"
"${_OUT}"
DEPENDS
- ${_LINK_TOOL}
+ ${IREE_LLVM_LINK_BINARY}
${_BITCODE_FILES}
COMMENT
"Linking bitcode to ${_OUT}"
diff --git a/build_tools/cmake/iree_llvm.cmake b/build_tools/cmake/iree_llvm.cmake
index d178b65..2235228 100644
--- a/build_tools/cmake/iree_llvm.cmake
+++ b/build_tools/cmake/iree_llvm.cmake
@@ -66,6 +66,10 @@
set(LLVM_BINARY_DIR "${IREE_BINARY_DIR}/llvm-project")
set(LLVM_TOOLS_BINARY_DIR "${LLVM_BINARY_DIR}/bin")
set(LLVM_EXTERNAL_LIT "${IREE_SOURCE_DIR}/third_party/llvm-project/llvm/utils/lit/lit.py")
+
+ set(IREE_LLVM_LINK_BINARY "$<TARGET_FILE:${IREE_LLVM_LINK_TARGET}>")
+ set(IREE_CLANG_BINARY "$<TARGET_FILE:${IREE_CLANG_TARGET}>")
+ set(IREE_CLANG_BUILTIN_HEADERS_PATH "${LLVM_BINARY_DIR}/lib/clang/${CLANG_EXECUTABLE_VERSION}/include/")
endmacro()
macro(iree_llvm_configure_installed)
@@ -82,9 +86,6 @@
list(APPEND CMAKE_MODULE_PATH "${LLD_CMAKE_DIR}")
include_directories(${LLD_INCLUDE_DIRS})
- find_package(Clang REQUIRED)
- list(APPEND CMAKE_MODULE_PATH "${CLANG_CMAKE_DIR}")
-
# Lit never gets installed with LLVM. So we have to reach into our copy
# of the monorepo to get it. I'm sorry. If this doesn't work for you,
# feel free to -DLLVM_EXTERNAL_LIT to provide your own.
@@ -93,6 +94,11 @@
if(NOT LLVM_EXTERNAL_LIT)
set(LLVM_EXTERNAL_LIT "${IREE_SOURCE_DIR}/third_party/llvm-project/llvm/utils/lit/lit.py")
endif()
+
+ set(IREE_LLVM_LINK_BINARY "${LLVM_INSTALL_DIR}/llvm/bin/llvm-link${CMAKE_EXECUTABLE_SUFFIX}")
+ set(IREE_CLANG_BINARY "${LLVM_INSTALL_DIR}/llvm/bin/clang${CMAKE_EXECUTABLE_SUFFIX}")
+ string(REGEX REPLACE "[^0-9].*" "" _LLVM_VERSION_MAJOR "${LLVM_VERSION}")
+ set(IREE_CLANG_BUILTIN_HEADERS_PATH "${LLVM_INSTALL_DIR}/llvm/lib/clang/${_LLVM_VERSION_MAJOR}/include/")
endmacro()
# iree_llvm_set_bundled_cmake_options()
diff --git a/build_tools/scripts/byo_llvm.sh b/build_tools/scripts/byo_llvm.sh
index e833311..eef42f0 100755
--- a/build_tools/scripts/byo_llvm.sh
+++ b/build_tools/scripts/byo_llvm.sh
@@ -144,7 +144,7 @@
return 1
fi
- echo "-DLLVM_DIR='$llvm_cmake_dir' -DLLD_DIR='$lld_cmake_dir' -DCLANG_DIR='$clang_cmake_dir' -DMLIR_DIR='$mlir_cmake_dir' -DIREE_BUILD_BUNDLED_LLVM=OFF"
+ echo "-DLLVM_DIR='$llvm_cmake_dir' -DLLD_DIR='$lld_cmake_dir' -DCLANG_DIR='$clang_cmake_dir' -DMLIR_DIR='$mlir_cmake_dir' -DIREE_BUILD_BUNDLED_LLVM=OFF -DLLVM_INSTALL_DIR=${LLVM_INSTALL_DIR}"
}
do_build_iree() {