https://github.com/wenju-he created 
https://github.com/llvm/llvm-project/pull/214150

This option allows to only build the static archive library if a target doesn't 
use bitcode files. This saves build time and unneeded archifacts.

>From b46cf45f364281cf0f884aeb4ebd0b4c07aebedc Mon Sep 17 00:00:00 2001
From: Wenju He <[email protected]>
Date: Wed, 5 Aug 2026 09:57:45 +0200
Subject: [PATCH] [libclc] Add LIBCLC_GENERATE_BITCODE option to skip
 bitcode/SPIR-V generation

This option allows to only build the static archive library if a target
doesn't use bitcode files. This saves build time and unneeded archifacts.

Co-authored-by: Claude Sonnet 5 <[email protected]>
---
 libclc/CMakeLists.txt                |  18 ++--
 libclc/cmake/modules/AddLibclc.cmake | 130 ++++++++++++++-------------
 2 files changed, 79 insertions(+), 69 deletions(-)

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 5829bd9b39eac..452b8430c5309 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -25,6 +25,8 @@ include( GNUInstallDirs )
 
 set( LIBCLC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
 
+option(LIBCLC_GENERATE_BITCODE "Build and generate bitcode file" ON)
+
 option(
   LIBCLC_USE_SPIRV_BACKEND "Build SPIR-V targets with the SPIR-V backend." OFF
 )
@@ -95,7 +97,7 @@ else()
   )
 endif()
 
-if( NOT LIBCLC_USE_SPIRV_BACKEND )
+if( LIBCLC_GENERATE_BITCODE AND NOT LIBCLC_USE_SPIRV_BACKEND )
   # llvm-spirv is an optional dependency, used to build spirv-* targets when
   # the SPIR-V backend hasn't been requested. It may be provided in-tree or
   # externally.
@@ -118,17 +120,19 @@ elseif(LIBCLC_TARGET_ARCH IN_LIST LIBCLC_ARCHS_SPIRV)
   set(LIBCLC_ARCH_DIR spirv)
 endif()
 
-if(LIBCLC_TARGET_ARCH IN_LIST LIBCLC_ARCHS_SPIRV)
+if(LIBCLC_GENERATE_BITCODE AND LIBCLC_TARGET_ARCH IN_LIST LIBCLC_ARCHS_SPIRV)
   if(NOT LIBCLC_TARGET_OS STREQUAL vulkan AND NOT LIBCLC_USE_SPIRV_BACKEND AND 
NOT llvm-spirv_exe)
     message(FATAL_ERROR "SPIR-V backend or llvm-spirv is required for libclc 
${LIBCLC_TARGET}")
   endif()
 endif()
 
-foreach( tool IN ITEMS opt llvm-link )
-  if( NOT EXISTS "${${tool}_exe}" AND "${${tool}_target}" STREQUAL "" )
-    message( FATAL_ERROR "libclc toolchain incomplete - missing tool ${tool}!" 
)
-  endif()
-endforeach()
+if(LIBCLC_GENERATE_BITCODE)
+  foreach( tool IN ITEMS opt llvm-link )
+    if( NOT EXISTS "${${tool}_exe}" AND "${${tool}_target}" STREQUAL "" )
+      message( FATAL_ERROR "libclc toolchain incomplete - missing tool 
${tool}!" )
+    endif()
+  endforeach()
+endif()
 
 # Determine the clang target triple.
 set(clang_triple ${LIBCLC_TARGET})
diff --git a/libclc/cmake/modules/AddLibclc.cmake 
b/libclc/cmake/modules/AddLibclc.cmake
index d84101f71d2f9..606bc8a3aae03 100644
--- a/libclc/cmake/modules/AddLibclc.cmake
+++ b/libclc/cmake/modules/AddLibclc.cmake
@@ -125,77 +125,83 @@ function(libclc_add_library target_name)
     FOLDER "libclc/Device IR/Library"
   )
 
-  # Link the object files, using a temporary library for internalization.
-  set(linked_bc ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.linked.bc)
-  set(link_cmd ${llvm-link_exe})
-  set(link_deps ${llvm-link_target})
-
-  add_library(${target_name}-src STATIC)
-  target_link_libraries(${target_name}-src PRIVATE ${ARG_SOURCE_TARGET})
-  set_target_properties(${target_name}-src PROPERTIES
-    FOLDER "libclc/Device IR/Library"
-  )
-  list(APPEND link_cmd $<TARGET_FILE:${target_name}-src>)
-  list(APPEND link_deps ${target_name}-src)
-
-  if(ARG_INTERNALIZE_LIBRARIES)
-    list(APPEND link_cmd --internalize --only-needed)
-    foreach(lib ${ARG_INTERNALIZE_LIBRARIES})
-      add_library(${target_name}-${lib} STATIC)
-      target_link_libraries(${target_name}-${lib} PRIVATE ${lib})
-      set_target_properties(${target_name}-${lib} PROPERTIES
-        FOLDER "libclc/Device IR/Library"
-      )
-      list(APPEND link_cmd $<TARGET_FILE:${target_name}-${lib}>)
-      list(APPEND link_deps ${target_name}-${lib})
-    endforeach()
-  endif()
-  list(APPEND link_cmd -o ${linked_bc})
+  set(install_files $<TARGET_FILE:${archive_target}>)
+  add_dependencies(${ARG_PARENT_TARGET} ${archive_target})
+
+  if(LIBCLC_GENERATE_BITCODE)
+    # Link the object files, using a temporary library for internalization.
+    set(linked_bc ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.linked.bc)
+    set(link_cmd ${llvm-link_exe})
+    set(link_deps ${llvm-link_target})
+
+    add_library(${target_name}-src STATIC)
+    target_link_libraries(${target_name}-src PRIVATE ${ARG_SOURCE_TARGET})
+    set_target_properties(${target_name}-src PROPERTIES
+      FOLDER "libclc/Device IR/Library"
+    )
+    list(APPEND link_cmd $<TARGET_FILE:${target_name}-src>)
+    list(APPEND link_deps ${target_name}-src)
+
+    if(ARG_INTERNALIZE_LIBRARIES)
+      list(APPEND link_cmd --internalize --only-needed)
+      foreach(lib ${ARG_INTERNALIZE_LIBRARIES})
+        add_library(${target_name}-${lib} STATIC)
+        target_link_libraries(${target_name}-${lib} PRIVATE ${lib})
+        set_target_properties(${target_name}-${lib} PROPERTIES
+          FOLDER "libclc/Device IR/Library"
+        )
+        list(APPEND link_cmd $<TARGET_FILE:${target_name}-${lib}>)
+        list(APPEND link_deps ${target_name}-${lib})
+      endforeach()
+    endif()
+    list(APPEND link_cmd -o ${linked_bc})
 
-  add_custom_command(OUTPUT ${linked_bc}
-    COMMAND ${link_cmd}
-    DEPENDS ${link_deps}
-  )
+    add_custom_command(OUTPUT ${linked_bc}
+      COMMAND ${link_cmd}
+      DEPENDS ${link_deps}
+    )
 
-  string(REPLACE "-" ";" triple_parts "${ARG_TRIPLE}")
-  list(GET triple_parts 2 triple_os)
-  if(ARG_ARCH IN_LIST LIBCLC_ARCHS_SPIRV AND NOT triple_os STREQUAL vulkan)
-    # SPIR-V targets produce a .spv file from the linked bitcode.
-    set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.spv)
-    if(LIBCLC_USE_SPIRV_BACKEND)
-      add_custom_command(OUTPUT ${builtins_lib}
-        COMMAND ${CMAKE_CLC_COMPILER} -c --target=${ARG_TRIPLE}
-                -mllvm --spirv-ext=+SPV_KHR_fma
-                -x ir -o ${builtins_lib} ${linked_bc}
-        DEPENDS ${linked_bc}
-      )
+    string(REPLACE "-" ";" triple_parts "${ARG_TRIPLE}")
+    list(GET triple_parts 2 triple_os)
+    if(ARG_ARCH IN_LIST LIBCLC_ARCHS_SPIRV AND NOT triple_os STREQUAL vulkan)
+      # SPIR-V targets produce a .spv file from the linked bitcode.
+      set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.spv)
+      if(LIBCLC_USE_SPIRV_BACKEND)
+        add_custom_command(OUTPUT ${builtins_lib}
+          COMMAND ${CMAKE_CLC_COMPILER} -c --target=${ARG_TRIPLE}
+                  -mllvm --spirv-ext=+SPV_KHR_fma
+                  -x ir -o ${builtins_lib} ${linked_bc}
+          DEPENDS ${linked_bc}
+        )
+      else()
+        add_custom_command(OUTPUT ${builtins_lib}
+          COMMAND ${llvm-spirv_exe}
+                  --spirv-max-version=1.1
+                  --spirv-ext=+SPV_KHR_fma
+                  -o ${builtins_lib} ${linked_bc}
+          DEPENDS ${linked_bc}
+        )
+      endif()
     else()
+      # All other targets produce an optimized .bc file.
+      set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.bc)
       add_custom_command(OUTPUT ${builtins_lib}
-        COMMAND ${llvm-spirv_exe}
-                --spirv-max-version=1.1
-                --spirv-ext=+SPV_KHR_fma
-                -o ${builtins_lib} ${linked_bc}
-        DEPENDS ${linked_bc}
+        COMMAND ${opt_exe} ${ARG_OPT_FLAGS} -o ${builtins_lib} ${linked_bc}
+        DEPENDS ${opt_target} ${linked_bc}
       )
     endif()
-  else()
-    # All other targets produce an optimized .bc file.
-    set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.bc)
-    add_custom_command(OUTPUT ${builtins_lib}
-      COMMAND ${opt_exe} ${ARG_OPT_FLAGS} -o ${builtins_lib} ${linked_bc}
-      DEPENDS ${opt_target} ${linked_bc}
-    )
-  endif()
 
-  add_custom_target(${target_name} ALL DEPENDS ${builtins_lib})
-  set_target_properties(${target_name} PROPERTIES
-    TARGET_FILE ${builtins_lib}
-    FOLDER "libclc/Device IR/Library"
-  )
+    add_custom_target(${target_name} ALL DEPENDS ${builtins_lib})
+    set_target_properties(${target_name} PROPERTIES
+      TARGET_FILE ${builtins_lib}
+      FOLDER "libclc/Device IR/Library"
+    )
 
-  add_dependencies(${ARG_PARENT_TARGET} ${target_name} ${archive_target})
+    add_dependencies(${ARG_PARENT_TARGET} ${target_name})
+    list(APPEND install_files ${builtins_lib})
+  endif()
 
-  install(FILES ${builtins_lib} $<TARGET_FILE:${archive_target}>
+  install(FILES ${install_files}
     DESTINATION ${LIBCLC_INSTALL_DIR}/${ARG_TARGET_TRIPLE}
     COMPONENT ${ARG_PARENT_TARGET}
   )

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to