[llvm] [Runtimes] Rework and remove default runtimes build (PR #158156)

Joseph Huber via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 12 10:15:36 PDT 2025


https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/158156

>From 49fb07f3905c6226d8424b4bcb9175bf2c8e28cc Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Thu, 11 Sep 2025 16:39:56 -0500
Subject: [PATCH 1/2] [Runtimes] Rework and remove default runtimes build

Summary:
Currently the runtimes builds works by creating separate CMake projects
that build the respetive runtime. Right now we have a separate handling
for the 'default' target and manually specific runtimes via the
`-DLLVM_RUNTIME_TARGETS` option.

This patch changes the behavior to put all runtimes through the
`LLVM_RUNTIME_TARGETS` pipeline. The old `"default"` argument is now a
shorthand for `LLVM_DEFAULT_TARGET_TRIPLE` and corresponds to a sane
default.

In practical terms, this means the old `runtimes-bins` directory will
now be `runtimes-x86_64-unknown-linux-gnu-bins` for the majority of
users. We will not have `check-<name>-<triple>` targets, but I have made
a top-level target that invokes all of the enabled targets check lines
to keep this backward compatible.

There's likely some edge cases I missed here, but it seems to work in
the typical case for me. We'll see what CI thinks of this.
---
 llvm/runtimes/CMakeLists.txt | 273 ++++++++++++-----------------------
 1 file changed, 91 insertions(+), 182 deletions(-)

diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index c98d12ce7992d..1cc4591531a8a 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -18,7 +18,7 @@ endforeach()
 
 function(get_compiler_rt_path path)
   set(all_runtimes ${runtimes})
-  foreach(name ${LLVM_RUNTIME_TARGETS})
+  foreach(name ${runtime_targets})
     foreach(proj ${RUNTIMES_${name}_LLVM_ENABLE_RUNTIMES})
       set(proj_dir "${CMAKE_CURRENT_SOURCE_DIR}/../../${proj}")
       if(IS_DIRECTORY ${proj_dir} AND EXISTS ${proj_dir}/CMakeLists.txt)
@@ -42,6 +42,20 @@ if(NOT LLVM_BUILD_RUNTIMES)
   set(EXTRA_ARGS EXCLUDE_FROM_ALL)
 endif()
 
+set(runtime_targets "")
+if(NOT LLVM_RUNTIME_TARGETS)
+  list(APPEND runtime_targets "${LLVM_DEFAULT_TARGET_TRIPLE}")
+else()
+  foreach(target ${LLVM_RUNTIME_TARGETS})
+    if("${target}" STREQUAL "default")
+      list(APPEND runtime_targets "${LLVM_DEFAULT_TARGET_TRIPLE}")
+    else()
+      list(APPEND runtime_targets "${target}")
+    endif()
+  endforeach()
+endif()
+list(REMOVE_DUPLICATES runtime_targets)
+
 function(check_apple_target triple builtin_or_runtime)
   set(error "\
 compiler-rt for Darwin builds for all platforms and architectures using a \
@@ -77,33 +91,6 @@ macro(set_enable_per_target_runtime_dir)
   endif()
 endmacro()
 
-function(builtin_default_target compiler_rt_path)
-  cmake_parse_arguments(ARG "" "" "DEPENDS" ${ARGN})
-
-  set_enable_per_target_runtime_dir()
-
-  llvm_ExternalProject_Add(builtins
-                           ${compiler_rt_path}/lib/builtins
-                           DEPENDS ${ARG_DEPENDS}
-                           CMAKE_ARGS -DLLVM_LIBRARY_OUTPUT_INTDIR=${LLVM_LIBRARY_DIR}
-                                      -DLLVM_RUNTIME_OUTPUT_INTDIR=${LLVM_TOOLS_BINARY_DIR}
-                                      -DLLVM_DEFAULT_TARGET_TRIPLE=${LLVM_TARGET_TRIPLE}
-                                      -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR}
-                                      -DLLVM_CMAKE_DIR=${CMAKE_BINARY_DIR}
-                                      -DCMAKE_C_COMPILER_WORKS=ON
-                                      -DCMAKE_CXX_COMPILER_WORKS=ON
-                                      -DCMAKE_ASM_COMPILER_WORKS=ON
-                                      ${COMMON_CMAKE_ARGS}
-                                      ${BUILTINS_CMAKE_ARGS}
-                           PASSTHROUGH_PREFIXES COMPILER_RT
-                                                DARWIN
-                                                SANITIZER
-                           USE_TOOLCHAIN
-                           TARGET_TRIPLE ${LLVM_TARGET_TRIPLE}
-                           FOLDER "Compiler-RT"
-                           ${EXTRA_ARGS})
-endfunction()
-
 function(builtin_register_target compiler_rt_path name)
   cmake_parse_arguments(ARG "" "" "DEPENDS;CMAKE_ARGS;EXTRA_ARGS" ${ARGN})
 
@@ -147,31 +134,35 @@ endfunction()
 # before the just-built compiler can pass the configuration tests.
 get_compiler_rt_path(compiler_rt_path)
 if(compiler_rt_path)
-  # If the user did not specify the targets infer them from the runtimes.
-  set(builtin_targets ${LLVM_BUILTIN_TARGETS})
-  if(NOT builtin_targets)
+# If the user did not specify the targets infer them from the runtimes.
+  set(builtin_targets "")
+  if(NOT LLVM_BUILTIN_TARGETS)
     if("compiler-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
-      list(APPEND builtin_targets "default")
+      list(APPEND builtin_targets "${LLVM_DEFAULT_TARGET_TRIPLE}")
     endif()
-    foreach(name ${LLVM_RUNTIME_TARGETS})
+    foreach(name ${runtime_targets})
       if("compiler-rt" IN_LIST RUNTIMES_${name}_LLVM_ENABLE_RUNTIMES)
         list(APPEND builtin_targets ${name})
       endif()
     endforeach()
-  endif()
-  if("default" IN_LIST builtin_targets)
-    builtin_default_target(${compiler_rt_path}
-      DEPENDS clang-resource-headers)
-    list(REMOVE_ITEM builtin_targets "default")
   else()
-    add_custom_target(builtins)
-    add_custom_target(install-builtins)
-    add_custom_target(install-builtins-stripped)
-    set_target_properties(
-      builtins install-builtins install-builtins-stripped
-      PROPERTIES FOLDER "Compiler-RT"
-    )
+    foreach(target ${LLVM_RUNTIME_TARGETS})
+      if("${target}" STREQUAL "default")
+        list(APPEND builtin_targets "${LLVM_DEFAULT_TARGET_TRIPLE}")
+      else()
+        list(APPEND builtin_targets "${target}")
+      endif()
+    endforeach()
   endif()
+  list(REMOVE_DUPLICATES builtin_targets)
+
+  add_custom_target(builtins)
+  add_custom_target(install-builtins)
+  add_custom_target(install-builtins-stripped)
+  set_target_properties(
+    builtins install-builtins install-builtins-stripped
+    PROPERTIES FOLDER "Compiler-RT"
+  )
 
   foreach(target ${builtin_targets})
     check_apple_target(${target} builtin)
@@ -226,74 +217,6 @@ foreach(entry ${runtimes})
   list(APPEND RUNTIME_NAMES ${name})
 endforeach()
 
-function(runtime_default_target)
-  cmake_parse_arguments(ARG "" "" "DEPENDS;CMAKE_ARGS;PREFIXES;EXTRA_ARGS" ${ARGN})
-
-  include(${LLVM_BINARY_DIR}/runtimes/Components.cmake OPTIONAL)
-  set(SUB_CHECK_TARGETS ${SUB_CHECK_TARGETS} PARENT_SCOPE)
-  set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LLVM_BINARY_DIR}/runtimes/Components.cmake)
-
-  foreach(runtime_name ${RUNTIME_NAMES})
-    list(APPEND extra_targets
-      ${runtime_name}
-      install-${runtime_name}
-      install-${runtime_name}-stripped)
-    if(LLVM_INCLUDE_TESTS)
-      list(APPEND test_targets check-${runtime_name})
-    endif()
-  endforeach()
-  foreach(component ${LLVM_RUNTIME_DISTRIBUTION_COMPONENTS})
-    if(NOT ${component} IN_LIST SUB_COMPONENTS)
-      list(APPEND extra_targets install-${component} install-${component}-stripped)
-    endif()
-  endforeach()
-  if ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
-    # The target libomp-mod is a dependee of check-flang needed to run its
-    # OpenMP tests
-    list(APPEND extra_targets "libomp-mod")
-  endif ()
-
-  if(LLVM_INCLUDE_TESTS)
-    set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_TESTSUITES "@${LLVM_BINARY_DIR}/runtimes/runtimes-bins/lit.tests")
-    list(APPEND test_targets runtimes-test-depends check-runtimes)
-  endif()
-
-  set_enable_per_target_runtime_dir()
-
-  llvm_ExternalProject_Add(runtimes
-                           ${CMAKE_CURRENT_SOURCE_DIR}/../../runtimes
-                           DEPENDS ${ARG_DEPENDS}
-                           # Builtins were built separately above
-                           CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=Off
-                                      -DLLVM_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS}
-                                      -DLLVM_DEFAULT_TARGET_TRIPLE=${LLVM_TARGET_TRIPLE}
-                                      -DLLVM_ENABLE_PROJECTS_USED=${LLVM_ENABLE_PROJECTS_USED}
-                                      -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR}
-                                      -DLLVM_BUILD_TOOLS=${LLVM_BUILD_TOOLS}
-                                      -DCMAKE_C_COMPILER_WORKS=ON
-                                      -DCMAKE_CXX_COMPILER_WORKS=ON
-                                      -DCMAKE_Fortran_COMPILER_WORKS=ON
-                                      -DCMAKE_ASM_COMPILER_WORKS=ON
-                                      ${COMMON_CMAKE_ARGS}
-                                      ${RUNTIMES_CMAKE_ARGS}
-                                      ${ARG_CMAKE_ARGS}
-                           PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES
-                                                LLVM_USE_LINKER
-                                                CUDA CMAKE_CUDA # For runtimes that may look for the CUDA compiler and/or SDK (libc, offload, flang-rt)
-                                                FFI # offload uses libffi
-                                                FLANG_RUNTIME # Shared between Flang and Flang-RT
-                                                ${ARG_PREFIXES}
-                           EXTRA_TARGETS ${extra_targets}
-                                         ${test_targets}
-                                         ${SUB_COMPONENTS}
-                                         ${SUB_CHECK_TARGETS}
-                                         ${SUB_INSTALL_TARGETS}
-                           USE_TOOLCHAIN
-                           TARGET_TRIPLE ${LLVM_TARGET_TRIPLE}
-                           FOLDER "Runtimes"
-                           ${EXTRA_ARGS} ${ARG_EXTRA_ARGS})
-endfunction()
-
 # runtime_register_target(name)
 #   Utility function to register external runtime target.
 function(runtime_register_target name)
@@ -318,8 +241,12 @@ function(runtime_register_target name)
     set(install-${runtime_name}-${name}-stripped install-${runtime_name}-stripped)
     list(APPEND ${name}_extra_targets ${runtime_name}-${name} install-${runtime_name}-${name} install-${runtime_name}-${name}-stripped)
     if(LLVM_INCLUDE_TESTS)
-      set(check-${runtime_name}-${name} check-${runtime_name} )
+      set(check-${runtime_name}-${name} check-${runtime_name})
       list(APPEND ${name}_test_targets check-${runtime_name}-${name})
+      if(NOT TARGET check-${runtime_name})
+        add_custom_target(check-${runtime_name})
+      endif()
+      add_dependencies(check-${runtime_name} check-${runtime_name}-${name})
     endif()
   endforeach()
 
@@ -456,7 +383,7 @@ endfunction()
 if(runtimes)
   set(build_runtimes TRUE)
 endif()
-foreach(name ${LLVM_RUNTIME_TARGETS})
+foreach(name ${runtime_targets})
   if(RUNTIMES_${name}_LLVM_ENABLE_RUNTIMES)
     set(build_runtimes TRUE)
   endif()
@@ -566,82 +493,64 @@ if(build_runtimes)
     list(APPEND extra_args ENABLE_FORTRAN)
   endif ()
 
-  if(NOT LLVM_RUNTIME_TARGETS)
-    runtime_default_target(
-      DEPENDS ${builtins_dep} ${extra_deps}
-      CMAKE_ARGS ${extra_cmake_args}
-      PREFIXES ${prefixes}
-      EXTRA_ARGS ${extra_args})
-    set(test_targets check-runtimes)
-  else()
-    if("default" IN_LIST LLVM_RUNTIME_TARGETS)
-      runtime_default_target(
-        DEPENDS ${builtins_dep} ${extra_deps}
-        CMAKE_ARGS ${extra_cmake_args}
-        PREFIXES ${prefixes}
-        EXTRA_ARGS ${extra_args})
-      list(REMOVE_ITEM LLVM_RUNTIME_TARGETS "default")
-    else()
-      add_custom_target(runtimes)
-      add_custom_target(runtimes-configure)
-      add_custom_target(install-runtimes)
-      add_custom_target(install-runtimes-stripped)
+  add_custom_target(runtimes)
+  add_custom_target(runtimes-configure)
+  add_custom_target(install-runtimes)
+  add_custom_target(install-runtimes-stripped)
+  set_target_properties(
+    runtimes runtimes-configure install-runtimes install-runtimes-stripped
+    PROPERTIES FOLDER "Runtimes"
+  )
+  if(LLVM_INCLUDE_TESTS)
+    add_custom_target(check-runtimes)
+    add_custom_target(runtimes-test-depends)
+    set_target_properties(
+      check-runtimes runtimes-test-depends
+      PROPERTIES FOLDER "Runtimes"
+    )
+    set(test_targets "")
+  endif()
+  if(LLVM_RUNTIME_DISTRIBUTION_COMPONENTS)
+    foreach(component ${LLVM_RUNTIME_DISTRIBUTION_COMPONENTS})
+      add_custom_target(${component})
+      add_custom_target(install-${component})
+      add_custom_target(install-${component}-stripped)
       set_target_properties(
-        runtimes runtimes-configure install-runtimes install-runtimes-stripped
-        PROPERTIES FOLDER "Runtimes"
+        ${component} install-${component} install-${component}-stripped
+        PROPERTIES FOLDER "${component}"
       )
-      if(LLVM_INCLUDE_TESTS)
-        add_custom_target(check-runtimes)
-        add_custom_target(runtimes-test-depends)
-        set_target_properties(
-          check-runtimes runtimes-test-depends
-          PROPERTIES FOLDER "Runtimes"
-        )
-        set(test_targets "")
-      endif()
-      if(LLVM_RUNTIME_DISTRIBUTION_COMPONENTS)
-        foreach(component ${LLVM_RUNTIME_DISTRIBUTION_COMPONENTS})
-          add_custom_target(${component})
-          add_custom_target(install-${component})
-          add_custom_target(install-${component}-stripped)
-          set_target_properties(
-            ${component} install-${component} install-${component}-stripped
-            PROPERTIES FOLDER "${component}"
-          )
-        endforeach()
+    endforeach()
+  endif()
+
+  foreach(name ${runtime_targets})
+    if(builtins_dep)
+      if (LLVM_BUILTIN_TARGETS)
+        set(builtins_dep_name "${builtins_dep}-${name}")
+      else()
+        set(builtins_dep_name ${builtins_dep})
       endif()
     endif()
 
-    foreach(name ${LLVM_RUNTIME_TARGETS})
-      if(builtins_dep)
-        if (LLVM_BUILTIN_TARGETS)
-          set(builtins_dep_name "${builtins_dep}-${name}")
-        else()
-          set(builtins_dep_name ${builtins_dep})
-        endif()
-      endif()
+    check_apple_target(${name} runtime)
 
-      check_apple_target(${name} runtime)
+    runtime_register_target(${name}
+      DEPENDS ${builtins_dep_name} ${extra_deps}
+      CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=${name} ${extra_cmake_args}
+      EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args})
+  endforeach()
 
-      runtime_register_target(${name}
-        DEPENDS ${builtins_dep_name} ${extra_deps}
-        CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=${name} ${extra_cmake_args}
+  foreach(multilib ${LLVM_RUNTIME_MULTILIBS})
+    foreach(name ${LLVM_RUNTIME_MULTILIB_${multilib}_TARGETS})
+      runtime_register_target(${name}+${multilib}
+        DEPENDS runtimes-${name}
+        CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=${name}
+                   -DLLVM_RUNTIMES_PREFIX=${name}/
+                   -DLLVM_RUNTIMES_LIBDIR_SUBDIR=${multilib}
+                   ${extra_cmake_args}
+        BASE_NAME ${name}
         EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args})
     endforeach()
-
-    foreach(multilib ${LLVM_RUNTIME_MULTILIBS})
-      foreach(name ${LLVM_RUNTIME_MULTILIB_${multilib}_TARGETS})
-        runtime_register_target(${name}+${multilib}
-          DEPENDS runtimes-${name}
-          CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=${name}
-                     -DLLVM_RUNTIMES_PREFIX=${name}/
-                     -DLLVM_RUNTIMES_LIBDIR_SUBDIR=${multilib}
-                     ${extra_cmake_args}
-          BASE_NAME ${name}
-          EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args})
-      endforeach()
-    endforeach()
-  endif()
+  endforeach()
 
   if(NOT LLVM_BUILD_INSTRUMENTED AND CLANG_ENABLE_BOOTSTRAP)
     # TODO: This is a hack needed because the libcxx headers are copied into the

>From dd7f68c0c51fbce52247487f75b0532d4ba9d622 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Fri, 12 Sep 2025 09:52:36 -0500
Subject: [PATCH 2/2] Handle -DRUNTIMES_default_

---
 llvm/runtimes/CMakeLists.txt | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index 1cc4591531a8a..bcbe5f2dc8ab9 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -298,8 +298,19 @@ function(runtime_register_target name)
   list(APPEND ${name}_extra_args -DLLVM_USE_LINKER=${LLVM_USE_LINKER})
 
   get_cmake_property(variable_names VARIABLES)
+  set(normalized_variable_names "")
+  foreach(var ${variable_names})
+    if(var MATCHES "^RUNTIMES_default_")
+      string(REPLACE "RUNTIMES_default_" "RUNTIMES_${LLVM_DEFAULT_TARGET_TRIPLE}_" normalized_var "${var}")
+      set(${normalized_var} "${${var}}")
+      list(APPEND normalized_variable_names "${normalized_var}")
+    else()
+      list(APPEND normalized_variable_names "${var}")
+    endif()
+  endforeach()
+
   foreach(extra_name IN ITEMS ${ARG_BASE_NAME} ${name})
-    foreach(variable_name ${variable_names})
+    foreach(variable_name ${normalized_variable_names})
       string(FIND "${variable_name}" "RUNTIMES_${extra_name}_" out)
       if("${out}" EQUAL 0)
         string(REPLACE "RUNTIMES_${extra_name}_" "" new_name ${variable_name})



More information about the llvm-commits mailing list