aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2017-04-15 18:16:35 +0300
committerGitHub <noreply@github.com>2017-04-15 18:16:35 +0300
commit4e1249c920a6f64e2ca953334e9ec700f30693da (patch)
tree4ff1e03ac95c0827c6519b0fe684f41602bb47c3 /mesonbuild/backend
parentdcc95d7f705c5fbc036d7d6511f6df50beaac44a (diff)
parent62b86824f03d6b401f7bc8da6ce68b334726df44 (diff)
downloadmeson-4e1249c920a6f64e2ca953334e9ec700f30693da.zip
meson-4e1249c920a6f64e2ca953334e9ec700f30693da.tar.gz
meson-4e1249c920a6f64e2ca953334e9ec700f30693da.tar.bz2
Merge pull request #1549 from mesonbuild/linkwhole
Add option to link the entire contents of a static library to a target.
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r--mesonbuild/backend/ninjabackend.py9
-rw-r--r--mesonbuild/backend/vs2010backend.py4
2 files changed, 13 insertions, 0 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 98a2110..dc05d34 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -2187,6 +2187,10 @@ rule FORTRAN_DEP_HACK
raise RuntimeError('Unknown build target type.')
return commands
+ def get_link_whole_args(self, linker, target):
+ target_args = self.build_target_link_arguments(linker, target.link_whole_targets)
+ return linker.get_link_whole_for(target_args)
+
def generate_link(self, target, outfile, outname, obj_list, linker, extra_args=[]):
if isinstance(target, build.StaticLibrary):
linker_base = 'STATIC'
@@ -2226,6 +2230,11 @@ rule FORTRAN_DEP_HACK
# Add link args specific to this BuildTarget type, such as soname args,
# PIC, import library generation, etc.
commands += self.get_target_type_link_args(target, linker)
+ # Archives that are copied wholesale in the result. Must be before any
+ # other link targets so missing symbols from whole archives are found in those.
+ if not isinstance(target, build.StaticLibrary):
+ commands += self.get_link_whole_args(linker, target)
+
if not isinstance(target, build.StaticLibrary):
# Add link args added using add_project_link_arguments()
commands += self.build.get_project_link_args(linker, target.subproject)
diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py
index 46eab11..9937521 100644
--- a/mesonbuild/backend/vs2010backend.py
+++ b/mesonbuild/backend/vs2010backend.py
@@ -225,6 +225,8 @@ class Vs2010Backend(backends.Backend):
elif isinstance(target, build.BuildTarget):
for ldep in target.link_targets:
all_deps[ldep.get_id()] = ldep
+ for ldep in target.link_whole_targets:
+ all_deps[ldep.get_id()] = ldep
for obj_id, objdep in self.get_obj_target_deps(target.objects):
all_deps[obj_id] = objdep
for gendep in target.get_generated_sources():
@@ -927,6 +929,8 @@ class Vs2010Backend(backends.Backend):
for t in target.get_dependencies():
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:
+ linkname = compiler.get_link_whole_for(linkname)[0]
additional_links.append(linkname)
for lib in self.get_custom_target_provided_libraries(target):
additional_links.append(self.relpath(lib, self.get_target_dir(target)))