diff options
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r-- | mesonbuild/backend/backends.py | 44 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 8 | ||||
-rw-r--r-- | mesonbuild/backend/vs2010backend.py | 3 |
3 files changed, 37 insertions, 18 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 48dfb11..e8d6beb 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -504,19 +504,13 @@ class Backend(): libs.append(os.path.join(self.get_target_dir(t), f)) return libs - def eval_custom_target_command(self, target, absolute_paths=False): - if not absolute_paths: - ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output] - else: - ofilenames = [os.path.join(self.environment.get_build_dir(), self.get_target_dir(target), i) \ - for i in target.output] + def get_custom_target_sources(self, target): + ''' + Custom target sources can be of various object types; strings, File, + BuildTarget, even other CustomTargets. + Returns the path to them relative to the build root directory. + ''' srcs = [] - outdir = self.get_target_dir(target) - # Many external programs fail on empty arguments. - if outdir == '': - outdir = '.' - if absolute_paths: - outdir = os.path.join(self.environment.get_build_dir(), outdir) for i in target.get_sources(): if hasattr(i, 'held_object'): i = i.held_object @@ -530,9 +524,25 @@ class Backend(): fname = [os.path.join(self.get_target_private_dir(target), p) for p in i.get_outputs()] else: fname = [i.rel_to_builddir(self.build_to_src)] - if absolute_paths: - fname =[os.path.join(self.environment.get_build_dir(), f) for f in fname] + if target.absolute_paths: + fname = [os.path.join(self.environment.get_build_dir(), f) for f in fname] srcs += fname + return srcs + + def eval_custom_target_command(self, target, absolute_outputs=False): + # We only want the outputs to be absolute when using the VS backend + if not absolute_outputs: + ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output] + else: + ofilenames = [os.path.join(self.environment.get_build_dir(), self.get_target_dir(target), i) \ + for i in target.output] + srcs = self.get_custom_target_sources(target) + outdir = self.get_target_dir(target) + # Many external programs fail on empty arguments. + if outdir == '': + outdir = '.' + if target.absolute_paths: + outdir = os.path.join(self.environment.get_build_dir(), outdir) cmd = [] for i in target.command: if isinstance(i, build.Executable): @@ -545,9 +555,9 @@ class Backend(): i = os.path.join(self.get_target_dir(i), tmp) elif isinstance(i, mesonlib.File): i = i.rel_to_builddir(self.build_to_src) - if absolute_paths: + if target.absolute_paths: i = os.path.join(self.environment.get_build_dir(), i) - # FIXME: str types are blindly added and ignore the 'absolute_paths' argument + # FIXME: str types are blindly added ignoring 'target.absolute_paths' elif not isinstance(i, str): err_msg = 'Argument {0} is of unknown type {1}' raise RuntimeError(err_msg.format(str(i), str(type(i)))) @@ -593,7 +603,7 @@ class Backend(): ''.format(target.name, i) raise MesonException(msg) source = match.group(0) - if match.group(1) is None and not absolute_paths: + if match.group(1) is None and not target.absolute_paths: lead_dir = '' else: lead_dir = self.environment.get_build_dir() diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index acbf4a4..332450f 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -13,6 +13,7 @@ # limitations under the License. from . import backends +from .. import modules from .. import environment, mesonlib from .. import build from .. import mlog @@ -951,7 +952,7 @@ int dummy; else: srctype = othersgen # Duplicate outputs are disastrous - if f in srctype: + if f in srctype and srctype[f] is not gensrc: msg = 'Duplicate output {0!r} from {1!r} {2!r}; ' \ 'conflicts with {0!r} from {4!r} {3!r}' \ ''.format(f, type(gensrc).__name__, gensrc.name, @@ -1032,6 +1033,11 @@ int dummy; args += ['--pkg', d.name] elif isinstance(d, dependencies.ExternalLibrary): args += d.get_lang_args('vala') + # Detect gresources and add --gresources arguments for each + for (gres, gensrc) in other_src[1].items(): + if isinstance(gensrc, modules.GResourceTarget): + gres_xml, = self.get_custom_target_sources(gensrc) + args += ['--gresources=' + gres_xml] extra_args = [] for a in target.extra_args.get('vala', []): diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index d043455..f3e9b4f 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -392,6 +392,9 @@ class Vs2010Backend(backends.Backend): root = self.create_basic_crap(target) action = ET.SubElement(root, 'ItemDefinitionGroup') customstep = ET.SubElement(action, 'CustomBuildStep') + # We need to always use absolute paths because our invocation is always + # from the target dir, not the build root. + target.absolute_paths = True (srcs, ofilenames, cmd) = self.eval_custom_target_command(target, True) cmd_templ = '''"%s" '''*len(cmd) ET.SubElement(customstep, 'Command').text = cmd_templ % tuple(cmd) |