aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend/backends.py
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2017-11-28 03:04:39 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2017-12-02 02:07:19 +0530
commit62ba5ca1ec1b9423b2fe6676dd163e2a06a7b0a5 (patch)
tree129bbe84d8360da562aca8cd300fa088d5d9527c /mesonbuild/backend/backends.py
parente1bdc098ca48990322b058e2a2a9fce16c3e7674 (diff)
downloadmeson-62ba5ca1ec1b9423b2fe6676dd163e2a06a7b0a5.zip
meson-62ba5ca1ec1b9423b2fe6676dd163e2a06a7b0a5.tar.gz
meson-62ba5ca1ec1b9423b2fe6676dd163e2a06a7b0a5.tar.bz2
custom target: Consider all build depends while serializing
Currently, we only consider the build depends of the Executable being run when serializing custom targets. However, this is not always sufficient, for example if the executable loads modules at runtime or if the executable is actually a python script that loads a built module. For these cases, we need to set PATH on Windows correctly or the custom target will fail to run at build time complaining about missing DLLs.
Diffstat (limited to 'mesonbuild/backend/backends.py')
-rw-r--r--mesonbuild/backend/backends.py30
1 files changed, 18 insertions, 12 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index d613f50..3e12c89 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -238,8 +238,14 @@ class Backend:
return obj_list
def serialize_executable(self, exe, cmd_args, workdir, env={},
- capture=None):
+ extra_paths=None, capture=None):
import hashlib
+ if extra_paths is None:
+ # The callee didn't check if we needed extra paths, so check it here
+ if mesonlib.is_windows() or mesonlib.is_cygwin():
+ extra_paths = self.determine_windows_extra_paths(exe, [])
+ else:
+ extra_paths = []
# Can't just use exe.name here; it will likely be run more than once
if isinstance(exe, (dependencies.ExternalProgram,
build.BuildTarget, build.CustomTarget)):
@@ -272,10 +278,6 @@ class Backend:
exe_wrapper = self.environment.cross_info.config['binaries'].get('exe_wrapper', None)
else:
exe_wrapper = None
- if mesonlib.is_windows() or mesonlib.is_cygwin():
- extra_paths = self.determine_windows_extra_paths(exe)
- else:
- extra_paths = []
es = ExecutableSerialisation(basename, exe_cmd, cmd_args, env,
is_cross_built, exe_wrapper, workdir,
extra_paths, capture)
@@ -529,23 +531,27 @@ class Backend:
args.append(d_arg)
return args
- def determine_windows_extra_paths(self, target):
+ def determine_windows_extra_paths(self, target, extra_bdeps):
'''On Windows there is no such thing as an rpath.
We must determine all locations of DLLs that this exe
links to and return them so they can be used in unit
tests.'''
- if not isinstance(target, build.Executable):
- return []
- prospectives = target.get_transitive_link_deps()
result = []
+ prospectives = []
+ if isinstance(target, build.Executable):
+ prospectives = target.get_transitive_link_deps()
+ # External deps
+ for deppath in self.rpaths_for_bundled_shared_libraries(target):
+ result.append(os.path.normpath(os.path.join(self.environment.get_build_dir(), deppath)))
+ for bdep in extra_bdeps:
+ prospectives += bdep.get_transitive_link_deps()
+ # Internal deps
for ld in prospectives:
if ld == '' or ld == '.':
continue
dirseg = os.path.join(self.environment.get_build_dir(), self.get_target_dir(ld))
if dirseg not in result:
result.append(dirseg)
- for deppath in self.rpaths_for_bundled_shared_libraries(target):
- result.append(os.path.normpath(os.path.join(self.environment.get_build_dir(), deppath)))
return result
def write_benchmark_file(self, datafile):
@@ -576,7 +582,7 @@ class Backend:
else:
exe_wrapper = None
if mesonlib.is_windows() or mesonlib.is_cygwin():
- extra_paths = self.determine_windows_extra_paths(exe)
+ extra_paths = self.determine_windows_extra_paths(exe, [])
else:
extra_paths = []
cmd_args = []