summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordeshevoy <[email protected]>2024-12-17 03:07:08 +0300
committerdeshevoy <[email protected]>2024-12-17 03:24:08 +0300
commitfcbdc8d5a1a76c6d7488c2562c805f3e873a2188 (patch)
treefd5ad16edba90d2ee3d2888542059d8bcf09be9c
parent2513f8020dcbe0c1d82a44ca9b34f31962753ce1 (diff)
[build] Add LINK_EXCLUDE_LIBRARIES() macro
This macro could be used to implement a lazy DSO loader ISSUE: commit_hash:2a6b9d418cf404d8f742ecab947c3388ef7a8884
-rw-r--r--build/scripts/link_exe.py19
-rw-r--r--build/ymake.core.conf28
2 files changed, 45 insertions, 2 deletions
diff --git a/build/scripts/link_exe.py b/build/scripts/link_exe.py
index 12f2cb1083f..220beec6125 100644
--- a/build/scripts/link_exe.py
+++ b/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:
diff --git a/build/ymake.core.conf b/build/ymake.core.conf
index e94764714e6..8978137f2d0 100644
--- a/build/ymake.core.conf
+++ b/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)
+}