Properly handle the case of linking static library with custom targets
@@ -1130,7 +1130,13 @@ You probably should put it in link_with instead.''')
def link(self, target):
for t in unholder(listify(target)):
- if isinstance(self, StaticLibrary) and self.need_install and t.is_internal():
+ if isinstance(self, StaticLibrary) and self.need_install:
+ if isinstance(t, (CustomTarget, CustomTargetIndex)):
+ if not t.should_install():
+ mlog.warning('Try to link an installed static library target {} with a custom target '
+ 'that is not installed, this might cause problems when you try to use '
+ 'this static library'.format(self.name))
+ elif t.is_internal():
# When we're a static library and we link_with to an
# internal/convenience library, promote to link_whole.
return self.link_whole(t)
@@ -2274,6 +2280,18 @@ class CustomTarget(Target):
def get_all_link_deps(self):
return []
+ def is_internal(self) -> bool:
+ if not self.should_install():
+ return True
+ for out in self.get_outputs():
+ # Can't check if this is a static library, so try to guess
+ if not out.endswith(('.a', '.lib')):
+ return False
+ return True
+
+ def extract_all_objects_recurse(self):
+ return self.get_outputs()
+
def type_suffix(self):
return "@cus"
@@ -2419,6 +2437,15 @@ class CustomTargetIndex:
if suf == '.a' or suf == '.dll' or suf == '.lib' or suf == '.so':
return True
+ def should_install(self) -> bool:
+ return self.target.should_install()
+
+ def is_internal(self) -> bool:
+ return self.target.is_internal()
+
+ def extract_all_objects_recurse(self):
+ return self.target.extract_all_objects_recurse()
+
class ConfigureFile:
def __init__(self, subdir, sourcename, targetname, configuration_data):
