meson: revert patch that fixes static linking
it breaks libGL compilation
This commit is contained in:
parent
84be5cba83
commit
a29d3bd89b
@ -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:
|
|
@ -1,7 +1,7 @@
|
|||||||
# Template file for 'meson'
|
# Template file for 'meson'
|
||||||
pkgname=meson
|
pkgname=meson
|
||||||
version=0.47.2
|
version=0.47.2
|
||||||
revision=3
|
revision=4
|
||||||
noarch=yes
|
noarch=yes
|
||||||
build_style=python3-module
|
build_style=python3-module
|
||||||
pycompile_module="mesonbuild"
|
pycompile_module="mesonbuild"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user