|
|
@ -20,6 +20,7 @@ import environment |
|
|
|
from meson_install import InstallData |
|
|
|
from meson_install import InstallData |
|
|
|
from interpreter import InvalidArguments |
|
|
|
from interpreter import InvalidArguments |
|
|
|
import shutil |
|
|
|
import shutil |
|
|
|
|
|
|
|
from coredata import MesonException |
|
|
|
|
|
|
|
|
|
|
|
if environment.is_windows(): |
|
|
|
if environment.is_windows(): |
|
|
|
quote_char = '"' |
|
|
|
quote_char = '"' |
|
|
@ -525,22 +526,29 @@ class NinjaBackend(Backend): |
|
|
|
exe = generator.get_exe() |
|
|
|
exe = generator.get_exe() |
|
|
|
infilelist = genlist.get_infilelist() |
|
|
|
infilelist = genlist.get_infilelist() |
|
|
|
outfilelist = genlist.get_outfilelist() |
|
|
|
outfilelist = genlist.get_outfilelist() |
|
|
|
if len(infilelist) != len(outfilelist): |
|
|
|
|
|
|
|
raise RuntimeError('Internal data structures broken.') |
|
|
|
|
|
|
|
if isinstance(exe, interpreter.BuildTarget): |
|
|
|
if isinstance(exe, interpreter.BuildTarget): |
|
|
|
exe_file = os.path.join(self.environment.get_build_dir(), self.get_target_filename(exe)) |
|
|
|
exe_file = os.path.join(self.environment.get_build_dir(), self.get_target_filename(exe)) |
|
|
|
else: |
|
|
|
else: |
|
|
|
exe_file = exe.get_command() |
|
|
|
exe_file = exe.get_command() |
|
|
|
base_args = generator.get_arglist() |
|
|
|
base_args = generator.get_arglist() |
|
|
|
for i in range(len(infilelist)): |
|
|
|
for i in range(len(infilelist)): |
|
|
|
infilename = os.path.join(self.environment.get_source_dir(), infilelist[i]) |
|
|
|
if len(infilelist) == len(outfilelist): |
|
|
|
outfilename = os.path.join(self.get_target_private_dir(target), outfilelist[i]) |
|
|
|
sole_output = os.path.join(self.get_target_private_dir(target), outfilelist[i]) |
|
|
|
args = [x.replace("@INPUT@", infilename).replace('@OUTPUT@', outfilename)\ |
|
|
|
else: |
|
|
|
|
|
|
|
for x in base_args: |
|
|
|
|
|
|
|
if '@OUTPUT@' in x: |
|
|
|
|
|
|
|
raise MesonException('Tried to use @OUTPUT@ in a rule with more than one output.') |
|
|
|
|
|
|
|
sole_output = '' |
|
|
|
|
|
|
|
curfile = infilelist[i] |
|
|
|
|
|
|
|
infilename = os.path.join(self.environment.get_source_dir(), curfile) |
|
|
|
|
|
|
|
outfiles = genlist.get_outputs_for(curfile) |
|
|
|
|
|
|
|
outfiles = [os.path.join(self.get_target_private_dir(target), of) for of in outfiles] |
|
|
|
|
|
|
|
args = [x.replace("@INPUT@", infilename).replace('@OUTPUT@', sole_output)\ |
|
|
|
for x in base_args] |
|
|
|
for x in base_args] |
|
|
|
args = [x.replace("@SOURCE_DIR@", self.environment.get_source_dir()).replace("@BUILD_DIR@", self.get_target_private_dir(target)) |
|
|
|
args = [x.replace("@SOURCE_DIR@", self.environment.get_source_dir()).replace("@BUILD_DIR@", self.get_target_private_dir(target)) |
|
|
|
for x in args] |
|
|
|
for x in args] |
|
|
|
cmdlist = [exe_file] + args |
|
|
|
cmdlist = [exe_file] + args |
|
|
|
elem = NinjaBuildElement(outfilename, 'CUSTOM_COMMAND', infilename) |
|
|
|
elem = NinjaBuildElement(outfiles, 'CUSTOM_COMMAND', infilename) |
|
|
|
elem.add_item('DESC', 'Generating $out') |
|
|
|
elem.add_item('DESC', 'Generating $out') |
|
|
|
if isinstance(exe, interpreter.BuildTarget): |
|
|
|
if isinstance(exe, interpreter.BuildTarget): |
|
|
|
elem.add_dep(self.get_target_filename(exe)) |
|
|
|
elem.add_dep(self.get_target_filename(exe)) |
|
|
|