From c7e7d1a4c354b21fe9308dd872a99ec4bc7356be Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 20 Apr 2014 13:58:20 +0300 Subject: [PATCH] Can execute found programs with run_command. --- dependencies.py | 8 ++++++-- interpreter.py | 17 ++++++++++++++--- run_tests.py | 3 ++- test cases/common/55 file grabber/meson.build | 7 +++++++ .../common/55 file grabber/subdir/meson.build | 5 +++++ test cases/common/55 file grabber/subdir/suba.c | 1 + test cases/common/55 file grabber/subdir/subb.c | 1 + test cases/common/55 file grabber/subdir/subc.c | 1 + .../common/55 file grabber/subdir/subprog.c | 7 +++++++ 9 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 test cases/common/55 file grabber/subdir/meson.build create mode 100644 test cases/common/55 file grabber/subdir/suba.c create mode 100644 test cases/common/55 file grabber/subdir/subb.c create mode 100644 test cases/common/55 file grabber/subdir/subc.c create mode 100644 test cases/common/55 file grabber/subdir/subprog.c diff --git a/dependencies.py b/dependencies.py index 13fdcd31f..eabdb7136 100644 --- a/dependencies.py +++ b/dependencies.py @@ -127,17 +127,21 @@ class PkgConfigDependency(Dependency): return self.is_found class ExternalProgram(): - def __init__(self, name, fullpath=None, silent=False): + def __init__(self, name, fullpath=None, silent=False, search_dir=None): self.name = name if fullpath is not None: self.fullpath = fullpath else: self.fullpath = shutil.which(name) + if self.fullpath is None and search_dir is not None: + trial = os.path.join(search_dir, name) + if os.access(trial, os.X_OK): + self.fullpath = trial if not silent: if self.found(): mlog.log('Program', mlog.bold(name), 'found:', mlog.green('YES'), '(%s)' % self.fullpath) else: - mlog.log('Program', mlog.bold(name), 'found:,', mlog.red('NO')) + mlog.log('Program', mlog.bold(name), 'found:', mlog.red('NO')) def found(self): return self.fullpath is not None diff --git a/interpreter.py b/interpreter.py index 7328cba57..7940c9437 100644 --- a/interpreter.py +++ b/interpreter.py @@ -754,9 +754,18 @@ class Interpreter(): raise InvalidArguments('Incorrect argument type.') def func_run_command(self, node, args, kwargs): - for i in args: + if len(args) < 1: + raise InterpreterException('Not enough arguments') + cmd = args[0] + cargs = args[1:] + if isinstance(cmd, ExternalProgramHolder): + cmd = cmd.get_command() + elif not isinstance(cmd, str): + raise InterpreterException('First argument is of incorrect type.') + for i in cargs: if not isinstance(i, str): - raise InterpreterObject('Run_command arguments must be strings.') + raise InterpreterException('Run_command arguments must be strings.') + args = [cmd] + cargs return RunProcess(args, self.environment.source_dir, self.environment.build_dir, self.subdir) def func_gettext(self, nodes, args, kwargs): @@ -931,7 +940,9 @@ class Interpreter(): if exename in self.coredata.ext_progs and\ self.coredata.ext_progs[exename].found(): return ExternalProgramHolder(self.coredata.ext_progs[exename]) - extprog = dependencies.ExternalProgram(exename) + # Search for scripts relative to current subdir. + search_dir = os.path.join(self.environment.get_source_dir(), self.subdir) + extprog = dependencies.ExternalProgram(exename, search_dir=search_dir) progobj = ExternalProgramHolder(extprog) self.coredata.ext_progs[exename] = extprog if required and not progobj.found(): diff --git a/run_tests.py b/run_tests.py index 4ca0659e3..83c79bbbb 100755 --- a/run_tests.py +++ b/run_tests.py @@ -25,7 +25,8 @@ test_build_dir = 'work area' install_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], 'install dir') meson_command = './meson.py' -unity_flags = ['--unity'] +#unity_flags = ['--unity'] +unity_flags = [] msbuild_exe = shutil.which('msbuild') if msbuild_exe is not None: diff --git a/test cases/common/55 file grabber/meson.build b/test cases/common/55 file grabber/meson.build index c0c11b99b..88e586133 100644 --- a/test cases/common/55 file grabber/meson.build +++ b/test cases/common/55 file grabber/meson.build @@ -11,10 +11,14 @@ project('grabber', 'c') if build.name() == 'windows' c = run_command('grabber.bat') + grabber = find_program('grabber') else c = run_command('grabber.sh') + grabber = find_program('grabber.sh') endif + +# First test running command explicitly. if c.returncode() != 0 error('Executing script failed.') endif @@ -26,3 +30,6 @@ sources = c.stdout().strip().split(newline) e = executable('prog', sources) test('grabtest', e) + +# Then test using program with find_program +subdir('subdir') diff --git a/test cases/common/55 file grabber/subdir/meson.build b/test cases/common/55 file grabber/subdir/meson.build new file mode 100644 index 000000000..230d6f7de --- /dev/null +++ b/test cases/common/55 file grabber/subdir/meson.build @@ -0,0 +1,5 @@ +sc = run_command(grabber) +subsources = sc.stdout().strip().split(newline) + +se = executable('subprog', subsources) +test('subgrabtest', se) diff --git a/test cases/common/55 file grabber/subdir/suba.c b/test cases/common/55 file grabber/subdir/suba.c new file mode 100644 index 000000000..bee8ad7a1 --- /dev/null +++ b/test cases/common/55 file grabber/subdir/suba.c @@ -0,0 +1 @@ +int funca() { return 0; } diff --git a/test cases/common/55 file grabber/subdir/subb.c b/test cases/common/55 file grabber/subdir/subb.c new file mode 100644 index 000000000..0fdd16287 --- /dev/null +++ b/test cases/common/55 file grabber/subdir/subb.c @@ -0,0 +1 @@ +int funcb() { return 0; } diff --git a/test cases/common/55 file grabber/subdir/subc.c b/test cases/common/55 file grabber/subdir/subc.c new file mode 100644 index 000000000..63f951cad --- /dev/null +++ b/test cases/common/55 file grabber/subdir/subc.c @@ -0,0 +1 @@ +int funcc() { return 0; } diff --git a/test cases/common/55 file grabber/subdir/subprog.c b/test cases/common/55 file grabber/subdir/subprog.c new file mode 100644 index 000000000..3524f602f --- /dev/null +++ b/test cases/common/55 file grabber/subdir/subprog.c @@ -0,0 +1,7 @@ +int funca(); +int funcb(); +int funcc(); + +int main(int argc, char **argv) { + return funca() + funcb() + funcc(); +}