meson: revert patch that fixes static linking

it breaks libGL compilation
This commit is contained in:
maxice8 2018-09-16 09:59:15 -03:00
parent 84be5cba83
commit a29d3bd89b
No known key found for this signature in database
GPG key ID: 543B9D4F4299F06B
2 changed files with 1 additions and 143 deletions

View file

@ -1,142 +0,0 @@
From 2d370c24ec83de889c83511c4a32e52e75a38aca Mon Sep 17 00:00:00 2001
From: Nirbheek Chauhan <nirbheek@centricular.com>
Date: Wed, 25 Jul 2018 12:59:41 +0530
Subject: [PATCH] Fix linking of shared/static libs with static libs
This commit contains the following fixes:
1. When a shared library A does `link_with:` to static library B, the
parts of B used by A will be added to A, and so we don't need to
return B in A.get_dependencies() for targets that link to A. This
already is the behaviour when a shared library A does `link_whole:`
on B.
2. In situation (1), when generating a pkg-config file for A, we must
also not add B to Libs.private for A. This already is the behaviour
when a shared library A does `link_whole:` on B.
3. When a static library A does `link_whole:` to static library B, we
must add the objects in B to A.
4. When a static library A does `link_with:` to static library B, and
B is not installed (which makes it an internal static library), we
must add the objects in B to A, otherwise nothing can use A.
5. In situation (4), when generating a pkg-config file for A, we must
also not add B to Libs.private for A.
All these situations are tested by the unit test added in this commit.
--- mesonbuild/backend/ninjabackend.py
+++ mesonbuild/backend/ninjabackend.py
@@ -2412,7 +2412,7 @@ def generate_link(self, target, outfile, outname, obj_list, linker, extra_args=[
# line where the static library is used.
dependencies = []
else:
- dependencies = target.get_dependencies()
+ dependencies = target.get_dependencies(link_whole=True)
internal = self.build_target_link_arguments(linker, dependencies)
commands += internal
# Only non-static built targets need link args and link dependencies
--- mesonbuild/backend/vs2010backend.py
+++ mesonbuild/backend/vs2010backend.py
@@ -1032,7 +1032,7 @@ def gen_vcxproj(self, target, ofname, guid):
(additional_libpaths, additional_links, extra_link_args) = self.split_link_args(extra_link_args.to_native())
# Add more libraries to be linked if needed
- for t in target.get_dependencies():
+ for t in target.get_dependencies(link_whole=True):
lobj = self.build.targets[t.get_id()]
linkname = os.path.join(down, self.get_target_filename_for_linking(lobj))
if t in target.link_whole_targets:
--- mesonbuild/build.py
+++ mesonbuild/build.py
@@ -856,22 +856,43 @@ def get_outputs(self):
def get_extra_args(self, language):
return self.extra_args.get(language, [])
- def get_dependencies(self, exclude=None, internal=True):
+ def is_internal(self):
+ if isinstance(self, StaticLibrary) and not self.need_install:
+ return True
+ return False
+
+ def get_dependencies(self, exclude=None, internal=True, link_whole=False):
transitive_deps = []
if exclude is None:
exclude = []
- if internal:
- link_targets = itertools.chain(self.link_targets, self.link_whole_targets)
- else:
- # We don't want the 'internal' libraries when generating the
- # `Libs:` and `Libs.private:` lists in pkg-config files.
- link_targets = self.link_targets
- for t in link_targets:
+ for t in self.link_targets:
if t in transitive_deps or t in exclude:
continue
+ # When we don't want internal libraries, f.ex. when we're
+ # generating the list of private installed libraries for use in
+ # a pkg-config file, don't include static libraries that aren't
+ # installed because those get directly included in the static
+ # or shared library already. See: self.link()
+ if not internal and t.is_internal():
+ continue
transitive_deps.append(t)
if isinstance(t, StaticLibrary):
- transitive_deps += t.get_dependencies(transitive_deps + exclude, internal)
+ transitive_deps += t.get_dependencies(transitive_deps + exclude,
+ internal, link_whole)
+ for t in self.link_whole_targets:
+ if t in transitive_deps or t in exclude:
+ continue
+ if not internal and t.is_internal():
+ continue
+ # self.link_whole_targets are not included by default here because
+ # the objects from those will already be in the library. They are
+ # only needed while generating backend (ninja) target dependencies.
+ if link_whole:
+ transitive_deps.append(t)
+ # However, the transitive dependencies are still needed
+ if isinstance(t, StaticLibrary):
+ transitive_deps += t.get_dependencies(transitive_deps + exclude,
+ internal, link_whole)
return transitive_deps
def get_source_subdir(self):
@@ -958,7 +979,17 @@ def link(self, target):
raise InvalidArguments(msg)
if self.is_cross != t.is_cross:
raise InvalidArguments('Tried to mix cross built and native libraries in target {!r}'.format(self.name))
- self.link_targets.append(t)
+ # When linking to a static library that's not installed, we
+ # transparently add that target's objects to ourselves.
+ # Static libraries that are installed will either be linked through
+ # self.link_targets or using the pkg-config file.
+ if isinstance(self, StaticLibrary) and isinstance(t, StaticLibrary) and not t.need_install:
+ self.objects.append(t.extract_all_objects())
+ # Add internal and external deps
+ self.external_deps += t.external_deps
+ self.link_targets += t.link_targets
+ else:
+ self.link_targets.append(t)
def link_whole(self, target):
for t in listify(target, unholder=True):
@@ -970,7 +1001,15 @@ def link_whole(self, target):
raise InvalidArguments(msg)
if self.is_cross != t.is_cross:
raise InvalidArguments('Tried to mix cross built and native libraries in target {!r}'.format(self.name))
- self.link_whole_targets.append(t)
+ # When we're a static library and we link_whole: to another static
+ # library, we need to add that target's objects to ourselves.
+ if isinstance(self, StaticLibrary):
+ self.objects.append(t.extract_all_objects())
+ # Add internal and external deps
+ self.external_deps += t.external_deps
+ self.link_targets += t.link_targets
+ else:
+ self.link_whole_targets.append(t)
def add_pch(self, language, pchlist):
if not pchlist:

View file

@ -1,7 +1,7 @@
# Template file for 'meson'
pkgname=meson
version=0.47.2
revision=3
revision=4
noarch=yes
build_style=python3-module
pycompile_module="mesonbuild"