aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-01-26 13:51:23 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2021-01-30 09:51:06 +0000
commit0626465ea8aa65b10776d5c4064e881fe0d6fa25 (patch)
treebe11f7029bd7bd418494d45cf7f3de52cbaf435f /mesonbuild/interpreter.py
parentc321339b24f896d02b0839d1b1e5008eae405858 (diff)
downloadmeson-0626465ea8aa65b10776d5c4064e881fe0d6fa25.zip
meson-0626465ea8aa65b10776d5c4064e881fe0d6fa25.tar.gz
meson-0626465ea8aa65b10776d5c4064e881fe0d6fa25.tar.bz2
Fix executable as script on Windows
On Windows this would fail because of missing DLL: ``` mylib = library(...) exe = executable(..., link_with: mylib) meson.add_install_script(exe) ``` The reason is on Windows we cannot rely on rpath to find libraries from build directory, they are searched in $PATH. We already have all that mechanism in place for custom_target() using ExecutableSerialisation class, so reuse it for install/dist/postconf scripts too. This has bonus side effect to also use exe_wrapper for those scripts. Fixes: #8187
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py15
1 files changed, 6 insertions, 9 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 8924a46..ceaa29a 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -34,7 +34,7 @@ from .interpreterbase import ObjectHolder, MesonVersionString
from .interpreterbase import TYPE_var, TYPE_nkwargs
from .modules import ModuleReturnValue, ExtensionModule
from .cmake import CMakeInterpreter
-from .backend.backends import TestProtocol, Backend
+from .backend.backends import TestProtocol, Backend, ExecutableSerialisation
from pathlib import Path, PurePath
import os
@@ -1948,11 +1948,8 @@ class MesonMain(InterpreterObject):
})
def _find_source_script(self, prog: T.Union[str, mesonlib.File, ExecutableHolder], args):
- if isinstance(prog, ExecutableHolder):
- prog_path = self.interpreter.backend.get_target_filename(prog.held_object)
- return build.RunScript([prog_path], args)
- elif isinstance(prog, ExternalProgramHolder):
- return build.RunScript(prog.get_command(), args)
+ if isinstance(prog, (ExecutableHolder, ExternalProgramHolder)):
+ return self.interpreter.backend.get_executable_serialisation([unholder(prog)] + args)
# Prefer scripts in the current source directory
search_dir = os.path.join(self.interpreter.environment.source_dir,
self.interpreter.subdir)
@@ -1970,7 +1967,7 @@ class MesonMain(InterpreterObject):
else:
m = 'Script or command {!r} not found or not executable'
raise InterpreterException(m.format(prog))
- return build.RunScript(found.get_command(), args)
+ return self.interpreter.backend.get_executable_serialisation([found] + args)
def _process_script_args(
self, name: str, args: T.List[T.Union[
@@ -2557,7 +2554,7 @@ class Interpreter(InterpreterBase):
return GeneratedListHolder(item)
elif isinstance(item, build.RunTarget):
raise RuntimeError('This is not a pipe.')
- elif isinstance(item, build.RunScript):
+ elif isinstance(item, ExecutableSerialisation):
raise RuntimeError('Do not do this.')
elif isinstance(item, build.Data):
return DataHolder(item)
@@ -2584,7 +2581,7 @@ class Interpreter(InterpreterBase):
self.module_method_callback(v)
elif isinstance(v, build.GeneratedList):
pass
- elif isinstance(v, build.RunScript):
+ elif isinstance(v, ExecutableSerialisation):
self.build.install_scripts.append(v)
elif isinstance(v, build.Data):
self.build.data.append(v)