Browse Source

[build] Add LINK_EXCLUDE_LIBRARIES() macro

This macro could be used to implement a lazy DSO loader

ISSUE:
commit_hash:2a6b9d418cf404d8f742ecab947c3388ef7a8884
deshevoy 2 months ago
parent
commit
fcbdc8d5a1
2 changed files with 45 additions and 2 deletions
  1. 19 0
      build/scripts/link_exe.py
  2. 26 2
      build/ymake.core.conf

+ 19 - 0
build/scripts/link_exe.py

@@ -275,6 +275,20 @@ def fix_cmd_for_dynamic_cuda(cmd):
     return flags
 
 
+def remove_libs(cmd, libs):
+    excluded_flags = ['-l{}'.format(lib) for lib in libs]
+
+    flags = []
+
+    for flag in cmd:
+        if flag in excluded_flags:
+            continue
+
+        flags.append(flag)
+
+    return flags
+
+
 def gen_default_suppressions(inputs, output, source_root):
     import collections
     import os
@@ -325,6 +339,7 @@ def parse_args():
     parser.add_option('--linker-output')
     parser.add_option('--whole-archive-peers', action='append')
     parser.add_option('--whole-archive-libs', action='append')
+    parser.add_option('--exclude-libs', action='append')
     thinlto_cache.add_options(parser)
     return parser.parse_args()
 
@@ -347,6 +362,10 @@ if __name__ == '__main__':
         cuda_manager = CUDAManager(opts.cuda_architectures, opts.nvprune_exe)
         cmd = process_cuda_libraries_by_nvprune(cmd, cuda_manager, opts.build_root)
         cmd = process_cuda_libraries_by_objcopy(cmd, opts.build_root, opts.objcopy_exe)
+
+    if opts.exclude_libs:
+        cmd = remove_libs(cmd, opts.exclude_libs)
+
     cmd = ProcessWholeArchiveOption(opts.arch, opts.whole_archive_peers, opts.whole_archive_libs).construct_cmd(cmd)
 
     if opts.custom_step:

+ 26 - 2
build/ymake.core.conf

@@ -1103,6 +1103,8 @@ module _LINK_UNIT: _BASE_UNIT {
         LINK_SCRIPT_EXE_FLAGS+=--objcopy-exe $OBJCOPY_TOOL
     }
 
+    LINK_SCRIPT_EXE_FLAGS += ${pre=--exclude-libs :_LINK_EXCLUDE_LIBRARIES_GLOBAL}
+
     when ($OPENSOURCE == "yes" && $AUTOCHECK == "yes") {
         # FIXME: Replace AUTOCHECK == yes with _not a host platform_ check after YMAKE-218
         MODULE_LICENSES_RESTRICTION_TYPES = ALLOW_ONLY
@@ -1137,7 +1139,7 @@ macro ADD_CLANG_TIDY() {
 module _BASE_PROGRAM: _LINK_UNIT {
     .SYMLINK_POLICY=EXE
     .ALLOWED=INDUCED_DEPS WHOLE_ARCHIVE
-    .GLOBAL=LDFLAGS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB
+    .GLOBAL=LDFLAGS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB _LINK_EXCLUDE_LIBRARIES
     SET(MODULE_TYPE PROGRAM)
     SET(MODULE_LANG CPP)
     FORCE_COVERAGE_ENABLED=yes
@@ -1780,7 +1782,7 @@ module _LIBRARY: _BASE_UNIT {
     .PEERDIR_POLICY=as_include
     .EXTS=.o .obj .a .mf .supp .sbom .tidyjson .ld .lib .sdcmeta
     .ALLOWED=GRPC USE_SKIFF EXTRALIBS OBJADDE_GLOBAL RESOURCE_FILES
-    .GLOBAL=USER_CFLAGS USER_CXXFLAGS USER_CONLYFLAGS LDFLAGS SRCS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB
+    .GLOBAL=USER_CFLAGS USER_CXXFLAGS USER_CONLYFLAGS LDFLAGS SRCS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB _LINK_EXCLUDE_LIBRARIES
     .RESTRICTED=ALLOCATOR SIZE TAG DATA TEST_DATA DEPENDS FORK_TESTS FORK_SUBTESTS SPLIT_FACTOR TEST_CWD RUN TIMEOUT SPLIT_DWARF
     .ALIASES=EXTRALIBS=PY_EXTRALIBS
     .FINAL_TARGET=no
@@ -5858,3 +5860,25 @@ macro TOOLCHAIN(Name) {
 macro WITHOUT_VERSION() {
     ENABLE(SKIP_VERSION_REQUIREMENTS)
 }
+
+### @usage: LINK_EXCLUDE_LIBRARIES(Libs...)
+###
+### Exclude specified external dynamic libraries from linker command
+###
+### May be used to implement shims/mocks, e.g. a lazy loader
+###
+### @example:
+###
+###     LIBRARY()
+###
+###     SRCS(
+###         # provide some shim/mock implementation for libcuda.so
+###     )
+###
+###     LINK_EXCLUDE_LIBRARIES(cuda)
+###
+###     END()
+###
+macro LINK_EXCLUDE_LIBRARIES(Libs...) {
+    SET_APPEND(_LINK_EXCLUDE_LIBRARIES_GLOBAL $Libs)
+}