Skip to content

Conversation

@Meinersbur
Copy link
Member

@Meinersbur Meinersbur commented Nov 16, 2025

Post-commit fix of #164794 reported at #164794 (comment)

LLVM_LIBRARY_OUTPUT_INTDIR and LLVM_RUNTIME_OUTPUT_INTDIR is used by AddLLVM.cmake as output directories. It must not point to directories found by find_package(LLVM) which may be read-only directories. MLIR for instance sets thesese variables to its own build output directory, so should the runtimes.

@Meinersbur Meinersbur marked this pull request as ready for review November 16, 2025 12:53
@Meinersbur Meinersbur requested a review from a team as a code owner November 16, 2025 12:53
@llvmbot llvmbot added cmake Build system in general and CMake in particular compiler-rt compiler-rt:sanitizer openmp:libomp OpenMP host runtime openmp:libomptarget OpenMP offload runtime offload labels Nov 16, 2025
@llvmbot
Copy link
Member

llvmbot commented Nov 16, 2025

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: Michael Kruse (Meinersbur)

Changes

Post-commit fix of #164794 reported at #164794 (comment)

LLVM_LIBRARY_OUTPUT_INTDIR and LLVM_RUNTIME_OUTPUT_INTDIR is used by AddLLVM.cmake as output directories. It must not point to directories found by find_package(LLVM) which may be read-only directories. MLIR for instance sets thesese variables to its own build output directory, so should the runtimes.


Full diff: https://github.com/llvm/llvm-project/pull/168266.diff

8 Files Affected:

  • (modified) compiler-rt/cmake/base-config-ix.cmake (+2-2)
  • (modified) compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt (+1-1)
  • (modified) offload/CMakeLists.txt (+6-6)
  • (modified) offload/cmake/OpenMPTesting.cmake (+4-4)
  • (modified) offload/test/lit.site.cfg.in (+1-1)
  • (modified) openmp/CMakeLists.txt (+4-4)
  • (modified) openmp/cmake/OpenMPTesting.cmake (+2-2)
  • (modified) runtimes/CMakeLists.txt (+11-5)
diff --git a/compiler-rt/cmake/base-config-ix.cmake b/compiler-rt/cmake/base-config-ix.cmake
index d92bc0e71fa1a..37dfa5534dfef 100644
--- a/compiler-rt/cmake/base-config-ix.cmake
+++ b/compiler-rt/cmake/base-config-ix.cmake
@@ -59,9 +59,9 @@ if (LLVM_TREE_AVAILABLE)
     set(_host_executable_suffix ${CMAKE_EXECUTABLE_SUFFIX})
   endif()
   set(COMPILER_RT_TEST_COMPILER
-    ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${_host_executable_suffix})
+    ${LLVM_TOOLS_BINARY_DIR}/clang${_host_executable_suffix})
   set(COMPILER_RT_TEST_CXX_COMPILER
-    ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++${_host_executable_suffix})
+    ${LLVM_TOOLS_BINARY_DIR}/clang++${_host_executable_suffix})
 else()
     # Take output dir and install path from the user.
   set(COMPILER_RT_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH
diff --git a/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt
index ab37454acbe19..bb8298931c390 100644
--- a/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt
+++ b/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt
@@ -13,7 +13,7 @@ foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH})
                              scripts/build_symbolizer.sh
                      WORKING_DIRECTORY ${RTSanitizerCommonSymbolizerInternalDir}
                      COMMAND FLAGS=${TARGET_CFLAGS}
-                             CLANG=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
+                             CLANG=${LLVM_TOOLS_BINARY_DIR}/clang
                              ${CMAKE_CURRENT_SOURCE_DIR}/scripts/build_symbolizer.sh
                              ${CMAKE_CURRENT_BINARY_DIR}/RTSanitizerCommonSymbolizerInternal.${arch}.o
                      USES_TERMINAL)
diff --git a/offload/CMakeLists.txt b/offload/CMakeLists.txt
index b277380783500..6e801b1d47011 100644
--- a/offload/CMakeLists.txt
+++ b/offload/CMakeLists.txt
@@ -90,18 +90,18 @@ else()
   set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}")
 
   if (NOT MSVC)
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++)
   else()
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang.exe)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++.exe)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang.exe)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++.exe)
   endif()
 
   # Check for flang
   if (NOT MSVC)
-    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/flang)
+    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_TOOLS_BINARY_DIR}/flang)
   else()
-    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/flang.exe)
+    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_TOOLS_BINARY_DIR}/flang.exe)
   endif()
 
   # Set fortran test compiler if flang is found
diff --git a/offload/cmake/OpenMPTesting.cmake b/offload/cmake/OpenMPTesting.cmake
index ef8cf34ba0c85..623909bb15415 100644
--- a/offload/cmake/OpenMPTesting.cmake
+++ b/offload/cmake/OpenMPTesting.cmake
@@ -68,12 +68,12 @@ else()
     message(WARNING "The check targets will not be available!")
     set(ENABLE_CHECK_TARGETS FALSE)
   else()
-    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/FileCheck)
+    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/FileCheck)
   endif()
-  set(OPENMP_NOT_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/not)
+  set(OPENMP_NOT_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/not)
 endif()
-set(OFFLOAD_DEVICE_INFO_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-offload-device-info)
-set(OFFLOAD_TBLGEN_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/offload-tblgen)
+set(OFFLOAD_DEVICE_INFO_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/llvm-offload-device-info)
+set(OFFLOAD_TBLGEN_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/offload-tblgen)
 
 # Macro to extract information about compiler from file. (no own scope)
 macro(extract_test_compiler_information lang file)
diff --git a/offload/test/lit.site.cfg.in b/offload/test/lit.site.cfg.in
index 00f4e2b74a5b0..c8ba45c9683e2 100644
--- a/offload/test/lit.site.cfg.in
+++ b/offload/test/lit.site.cfg.in
@@ -1,6 +1,6 @@
 @AUTO_GEN_COMMENT@
 
-config.bin_llvm_tools_dir = "@LLVM_RUNTIME_OUTPUT_INTDIR@"
+config.bin_llvm_tools_dir = "@LLVM_TOOLS_BINARY_DIR@"
 config.test_c_compiler = "@OPENMP_TEST_C_COMPILER@"
 config.test_cxx_compiler = "@OPENMP_TEST_CXX_COMPILER@"
 config.test_fortran_compiler="@OPENMP_TEST_Fortran_COMPILER@"
diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt
index 88be8c75abfe6..44cef3fb3f413 100644
--- a/openmp/CMakeLists.txt
+++ b/openmp/CMakeLists.txt
@@ -71,11 +71,11 @@ else()
   endif()
 
   if (NOT MSVC)
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++)
   else()
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang.exe)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++.exe)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang.exe)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++.exe)
   endif()
 
   # Set fortran test compiler if flang is found
diff --git a/openmp/cmake/OpenMPTesting.cmake b/openmp/cmake/OpenMPTesting.cmake
index 60280b7ed4893..262ea968c8351 100644
--- a/openmp/cmake/OpenMPTesting.cmake
+++ b/openmp/cmake/OpenMPTesting.cmake
@@ -68,9 +68,9 @@ else()
     message(WARNING "The check targets will not be available!")
     set(ENABLE_CHECK_TARGETS FALSE)
   else()
-    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/FileCheck)
+    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/FileCheck)
   endif()
-  set(OPENMP_NOT_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/not)
+  set(OPENMP_NOT_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/not)
 endif()
 
 # Macro to extract information about compiler from file. (no own scope)
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index b17bd8f665361..d9fcac3a646b8 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -77,11 +77,6 @@ if (NOT LLVM_FOUND)
   set(LLVM_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
 endif()
 
-# Setting these variables will allow the sub-build to put their outputs into
-# the library and bin directories of the top-level build.
-set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
-set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_TOOLS_BINARY_DIR})
-
 # This variable makes sure that e.g. llvm-lit is found.
 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../llvm)
 set(LLVM_CMAKE_DIR ${LLVM_MAIN_SRC_DIR}/cmake/modules)
@@ -99,6 +94,17 @@ if (LLVM_LIBRARY_OUTPUT_INTDIR AND LLVM_RUNTIME_OUTPUT_INTDIR AND PACKAGE_VERSIO
   set(LLVM_TREE_AVAILABLE ON)
 endif()
 
+if(LLVM_TREE_AVAILABLE)
+  # Setting these variables will allow the sub-build to put their outputs into
+  # the library and bin directories of the top-level build.
+  set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
+  set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_TOOLS_BINARY_DIR})
+else()
+  # Use own build directory for artifact output.
+  set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}")
+  set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/bin")
+endif()
+
 # CMake omits default compiler include paths, but in runtimes build, we use
 # -nostdinc and -nostdinc++ and control include paths manually so this behavior
 # is undesirable. Filtering CMAKE_{LANG}_IMPLICIT_INCLUDE_DIRECTORIES to remove

@llvmbot
Copy link
Member

llvmbot commented Nov 16, 2025

@llvm/pr-subscribers-offload

Author: Michael Kruse (Meinersbur)

Changes

Post-commit fix of #164794 reported at #164794 (comment)

LLVM_LIBRARY_OUTPUT_INTDIR and LLVM_RUNTIME_OUTPUT_INTDIR is used by AddLLVM.cmake as output directories. It must not point to directories found by find_package(LLVM) which may be read-only directories. MLIR for instance sets thesese variables to its own build output directory, so should the runtimes.


Full diff: https://github.com/llvm/llvm-project/pull/168266.diff

8 Files Affected:

  • (modified) compiler-rt/cmake/base-config-ix.cmake (+2-2)
  • (modified) compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt (+1-1)
  • (modified) offload/CMakeLists.txt (+6-6)
  • (modified) offload/cmake/OpenMPTesting.cmake (+4-4)
  • (modified) offload/test/lit.site.cfg.in (+1-1)
  • (modified) openmp/CMakeLists.txt (+4-4)
  • (modified) openmp/cmake/OpenMPTesting.cmake (+2-2)
  • (modified) runtimes/CMakeLists.txt (+11-5)
diff --git a/compiler-rt/cmake/base-config-ix.cmake b/compiler-rt/cmake/base-config-ix.cmake
index d92bc0e71fa1a..37dfa5534dfef 100644
--- a/compiler-rt/cmake/base-config-ix.cmake
+++ b/compiler-rt/cmake/base-config-ix.cmake
@@ -59,9 +59,9 @@ if (LLVM_TREE_AVAILABLE)
     set(_host_executable_suffix ${CMAKE_EXECUTABLE_SUFFIX})
   endif()
   set(COMPILER_RT_TEST_COMPILER
-    ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${_host_executable_suffix})
+    ${LLVM_TOOLS_BINARY_DIR}/clang${_host_executable_suffix})
   set(COMPILER_RT_TEST_CXX_COMPILER
-    ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++${_host_executable_suffix})
+    ${LLVM_TOOLS_BINARY_DIR}/clang++${_host_executable_suffix})
 else()
     # Take output dir and install path from the user.
   set(COMPILER_RT_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH
diff --git a/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt
index ab37454acbe19..bb8298931c390 100644
--- a/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt
+++ b/compiler-rt/lib/sanitizer_common/symbolizer/CMakeLists.txt
@@ -13,7 +13,7 @@ foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH})
                              scripts/build_symbolizer.sh
                      WORKING_DIRECTORY ${RTSanitizerCommonSymbolizerInternalDir}
                      COMMAND FLAGS=${TARGET_CFLAGS}
-                             CLANG=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
+                             CLANG=${LLVM_TOOLS_BINARY_DIR}/clang
                              ${CMAKE_CURRENT_SOURCE_DIR}/scripts/build_symbolizer.sh
                              ${CMAKE_CURRENT_BINARY_DIR}/RTSanitizerCommonSymbolizerInternal.${arch}.o
                      USES_TERMINAL)
diff --git a/offload/CMakeLists.txt b/offload/CMakeLists.txt
index b277380783500..6e801b1d47011 100644
--- a/offload/CMakeLists.txt
+++ b/offload/CMakeLists.txt
@@ -90,18 +90,18 @@ else()
   set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}")
 
   if (NOT MSVC)
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++)
   else()
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang.exe)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++.exe)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang.exe)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++.exe)
   endif()
 
   # Check for flang
   if (NOT MSVC)
-    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/flang)
+    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_TOOLS_BINARY_DIR}/flang)
   else()
-    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/flang.exe)
+    set(OPENMP_TEST_Fortran_COMPILER ${LLVM_TOOLS_BINARY_DIR}/flang.exe)
   endif()
 
   # Set fortran test compiler if flang is found
diff --git a/offload/cmake/OpenMPTesting.cmake b/offload/cmake/OpenMPTesting.cmake
index ef8cf34ba0c85..623909bb15415 100644
--- a/offload/cmake/OpenMPTesting.cmake
+++ b/offload/cmake/OpenMPTesting.cmake
@@ -68,12 +68,12 @@ else()
     message(WARNING "The check targets will not be available!")
     set(ENABLE_CHECK_TARGETS FALSE)
   else()
-    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/FileCheck)
+    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/FileCheck)
   endif()
-  set(OPENMP_NOT_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/not)
+  set(OPENMP_NOT_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/not)
 endif()
-set(OFFLOAD_DEVICE_INFO_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-offload-device-info)
-set(OFFLOAD_TBLGEN_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/offload-tblgen)
+set(OFFLOAD_DEVICE_INFO_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/llvm-offload-device-info)
+set(OFFLOAD_TBLGEN_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/offload-tblgen)
 
 # Macro to extract information about compiler from file. (no own scope)
 macro(extract_test_compiler_information lang file)
diff --git a/offload/test/lit.site.cfg.in b/offload/test/lit.site.cfg.in
index 00f4e2b74a5b0..c8ba45c9683e2 100644
--- a/offload/test/lit.site.cfg.in
+++ b/offload/test/lit.site.cfg.in
@@ -1,6 +1,6 @@
 @AUTO_GEN_COMMENT@
 
-config.bin_llvm_tools_dir = "@LLVM_RUNTIME_OUTPUT_INTDIR@"
+config.bin_llvm_tools_dir = "@LLVM_TOOLS_BINARY_DIR@"
 config.test_c_compiler = "@OPENMP_TEST_C_COMPILER@"
 config.test_cxx_compiler = "@OPENMP_TEST_CXX_COMPILER@"
 config.test_fortran_compiler="@OPENMP_TEST_Fortran_COMPILER@"
diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt
index 88be8c75abfe6..44cef3fb3f413 100644
--- a/openmp/CMakeLists.txt
+++ b/openmp/CMakeLists.txt
@@ -71,11 +71,11 @@ else()
   endif()
 
   if (NOT MSVC)
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++)
   else()
-    set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang.exe)
-    set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++.exe)
+    set(OPENMP_TEST_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang.exe)
+    set(OPENMP_TEST_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++.exe)
   endif()
 
   # Set fortran test compiler if flang is found
diff --git a/openmp/cmake/OpenMPTesting.cmake b/openmp/cmake/OpenMPTesting.cmake
index 60280b7ed4893..262ea968c8351 100644
--- a/openmp/cmake/OpenMPTesting.cmake
+++ b/openmp/cmake/OpenMPTesting.cmake
@@ -68,9 +68,9 @@ else()
     message(WARNING "The check targets will not be available!")
     set(ENABLE_CHECK_TARGETS FALSE)
   else()
-    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/FileCheck)
+    set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/FileCheck)
   endif()
-  set(OPENMP_NOT_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/not)
+  set(OPENMP_NOT_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/not)
 endif()
 
 # Macro to extract information about compiler from file. (no own scope)
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index b17bd8f665361..d9fcac3a646b8 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -77,11 +77,6 @@ if (NOT LLVM_FOUND)
   set(LLVM_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
 endif()
 
-# Setting these variables will allow the sub-build to put their outputs into
-# the library and bin directories of the top-level build.
-set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
-set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_TOOLS_BINARY_DIR})
-
 # This variable makes sure that e.g. llvm-lit is found.
 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../llvm)
 set(LLVM_CMAKE_DIR ${LLVM_MAIN_SRC_DIR}/cmake/modules)
@@ -99,6 +94,17 @@ if (LLVM_LIBRARY_OUTPUT_INTDIR AND LLVM_RUNTIME_OUTPUT_INTDIR AND PACKAGE_VERSIO
   set(LLVM_TREE_AVAILABLE ON)
 endif()
 
+if(LLVM_TREE_AVAILABLE)
+  # Setting these variables will allow the sub-build to put their outputs into
+  # the library and bin directories of the top-level build.
+  set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
+  set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_TOOLS_BINARY_DIR})
+else()
+  # Use own build directory for artifact output.
+  set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}")
+  set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/bin")
+endif()
+
 # CMake omits default compiler include paths, but in runtimes build, we use
 # -nostdinc and -nostdinc++ and control include paths manually so this behavior
 # is undesirable. Filtering CMAKE_{LANG}_IMPLICIT_INCLUDE_DIRECTORIES to remove

@Meinersbur Meinersbur requested a review from mgorny November 16, 2025 12:56
@mgorny
Copy link
Member

mgorny commented Nov 16, 2025

I can confirm that flang-rt builds fine for me with this patch.

@Meinersbur Meinersbur requested a review from petrhosek November 17, 2025 11:38
@mgorny
Copy link
Member

mgorny commented Nov 17, 2025

Unfortunately, the latest version causes regressions in offload tests:

# | '/usr/lib/llvm/22/bin/llvm-offload-device-info': command not found
# | '/usr/lib/llvm/22/bin/offload-tblgen': command not found

i.e. it's using system LLVM binary directory for just-built tools.

@jhuber6
Copy link
Contributor

jhuber6 commented Nov 17, 2025

Unfortunately, the latest version causes regressions in offload tests:

# | '/usr/lib/llvm/22/bin/llvm-offload-device-info': command not found
# | '/usr/lib/llvm/22/bin/offload-tblgen': command not found

i.e. it's using system LLVM binary directory for just-built tools.

I don't think those are handled properly, I noticed that the device-info tool isn't installed properly but I don't know why off the top of my head.

@mgorny
Copy link
Member

mgorny commented Nov 17, 2025

Installing them shouldn't matter since it shouldn't be expecting tools to be installed while testing the current build.

@github-actions
Copy link

🐧 Linux x64 Test Results

  • 5820 tests passed
  • 1319 tests skipped

Copy link
Member

@mgorny mgorny left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. That seems to fix the issue for me.

@Meinersbur
Copy link
Member Author

Unfortunately, the latest version causes regressions in offload tests:

# | '/usr/lib/llvm/22/bin/llvm-offload-device-info': command not found
# | '/usr/lib/llvm/22/bin/offload-tblgen': command not found

i.e. it's using system LLVM binary directory for just-built tools.

I didn't notice these are locally-built, i.e. LLVM_RUNTIME_OUTPUT_INTDIR is the expected path.

The "CMake-proper" way for locally built files is $<TARGET_FILE:llvm-offload-device-info> and add_custom_command(COMMAND offload-tblgen). The former requires to use file(GENERATE ...) instead of configure_file(...).

I don't get how offload-tblgen is supposed to work in a runtime. Unless compiling to the native platform, it cannot be executed.

@jhuber6
Copy link
Contributor

jhuber6 commented Nov 18, 2025

I don't get how offload-tblgen is supposed to work in a runtime. Unless compiling to the native platform, it cannot be executed.

Yeah, do you think we should move that to LLVM as a tool and pass in a path to the runtime build? Makes it slightly more annoying.

@Meinersbur
Copy link
Member Author

Yeah, do you think we should move that to LLVM as a tool and pass in a path to the runtime build? Makes it slightly more annoying.

That is one way, but also consider that libc moved away from this because of this being an "awkward dependency on the rest of LLVM". Now it is written in Python.

@jhuber6
Copy link
Contributor

jhuber6 commented Nov 18, 2025

Yeah, do you think we should move that to LLVM as a tool and pass in a path to the runtime build? Makes it slightly more annoying.

That is one way, but also consider that libc moved away from this because of this being an "awkward dependency on the rest of LLVM". Now it is written in Python.

Yeah, that's what I was thinking as well. I'm not sure if we have an ideal solution here, unless we transition to just checking in the generated files and using the tablegen to generate them manually when modified.

Copy link
Contributor

@jhuber6 jhuber6 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LG for the openmp / offload part.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cmake Build system in general and CMake in particular compiler-rt:sanitizer compiler-rt offload openmp:libomp OpenMP host runtime openmp:libomptarget OpenMP offload runtime

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants