@@ -403,6 +403,23 @@ def host_target(self):
403403 def host_target_is_enabled (self ):
404404 return 'all' in self .targets or self .host_target () in self .targets
405405
406+ def llvm_driver_binaries (self , project ):
407+ # Find all CMakeLists.txt for LLVM or clang tools that have multicall driver support
408+ cmakelists_txts = [
409+ '' .join (cmakelists_txt )
410+ for path in Path (self .folders .source , project ).glob ('tools/*/CMakeLists.txt' )
411+ if ' GENERATE_DRIVER' in (cmakelists_txt := path .read_text (encoding = 'utf-8' ))
412+ ]
413+ skip_tools = (
414+ # llvm-mt depends on libxml2, which we explicitly do not link against
415+ 'llvm-mt' , )
416+ # Return the values of the add_clang_tool() or add_llvm_tool() CMake macros
417+ return [
418+ tool for cmakelists_txt in cmakelists_txts
419+ if (match := re .search (r"^add_(?:clang|llvm)_tool\((.*)$" , cmakelists_txt , flags = re .M ))
420+ and (tool := match .groups ()[0 ]) not in skip_tools
421+ ]
422+
406423 def multicall_is_enabled (self ):
407424 return self .cmake_defines .get ('LLVM_TOOL_LLVM_DRIVER_BUILD' , 'OFF' ) == 'ON'
408425
@@ -522,30 +539,13 @@ def configure(self):
522539 # slight increase in installation size due to being a multicall
523540 # binary.
524541 if self .multicall_is_enabled ():
525- distribution_components += [
526- 'dsymutil' ,
527- 'llvm-cgdata' ,
528- 'llvm-cxxfilt' ,
529- 'llvm-debuginfod' ,
530- 'llvm-debuginfod-find' ,
531- 'llvm-dwp' ,
532- 'llvm-gsymutil' ,
533- 'llvm-ifs' ,
534- 'llvm-libtool-darwin' ,
535- 'llvm-lipo' ,
536- 'llvm-ml' ,
537- 'llvm-rc' ,
538- 'llvm-readobj' ,
539- 'llvm-size' ,
540- 'llvm-symbolizer' ,
541- 'sancov' ,
542- ]
542+ distribution_components += [item for item in self .llvm_driver_binaries ('llvm' ) if item not in distribution_components ]
543543 if self .project_is_enabled ('bolt' ):
544544 distribution_components .append ('bolt' )
545545 if self .project_is_enabled ('clang' ):
546546 distribution_components += ['clang' , 'clang-resource-headers' ]
547547 if self .multicall_is_enabled ():
548- distribution_components += ['clang-installapi' , 'clang-scan-deps' ]
548+ distribution_components += [item for item in self . llvm_driver_binaries ( 'clang' ) if item not in distribution_components ]
549549 if self .project_is_enabled ('lld' ):
550550 distribution_components .append ('lld' )
551551 if build_compiler_rt :
0 commit comments