diff --git a/backends.py b/backends.py index 97991a032..5049be488 100644 --- a/backends.py +++ b/backends.py @@ -530,7 +530,7 @@ class NinjaBackend(Backend): scriptdir = self.environment.get_script_dir() outfile.write('\n') symrule = 'rule SHSYM\n' - symcmd = ' command = "%s" "%s" "%s" "%s"\n' % (ninja_quote(sys.executable), + symcmd = ' command = "%s" "%s" "%s" "%s" $CROSS\n' % (ninja_quote(sys.executable), ninja_quote(os.path.join(scriptdir, 'symbolextractor.py')), '$in', '$out') synstat = ' restat = 1\n' @@ -729,6 +729,8 @@ class NinjaBackend(Backend): targetdir = self.get_target_private_dir(target) symname = os.path.join(targetdir, target_name + '.symbols') elem = NinjaBuildElement(symname, 'SHSYM', target_name) + if self.environment.is_cross_build(): + elem.add_item('CROSS', '--cross-host=' + self.environment.cross_info['name']) elem.write(outfile) def generate_link(self, target, outfile, outname, obj_list): diff --git a/run_cross_test.py b/run_cross_test.py new file mode 100755 index 000000000..e96e622ec --- /dev/null +++ b/run_cross_test.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 + +# Copyright 2013 Jussi Pakkanen + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +'''Runs the basic test suite through a cross compiler. +Not part of the main test suite because of two reasons: + +1) setup of the cross build is platform specific +2) it can be slow (e.g. when invoking test apps via wine) + +Eventually migrate to something fancier.''' + +from glob import glob +import os, subprocess, shutil, sys +import environment + +from run_tests import gather_tests + +test_build_dir = 'work area' +install_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], 'install dir') +meson_command = './meson.py' + +extra_flags = ['--cross-file', 'cross/ubuntu-mingw.txt'] +ninja_command = environment.detect_ninja() +if ninja_command is None: + raise RuntimeError('Could not find Ninja executable.') +compile_commands = [ninja_command] +test_commands = [ninja_command, 'test'] +install_commands = [ninja_command, 'install'] + +def run_test(testdir, should_succeed=True): + shutil.rmtree(test_build_dir) + shutil.rmtree(install_dir) + os.mkdir(test_build_dir) + os.mkdir(install_dir) + print('Running test: ' + testdir) + gen_command = [sys.executable, meson_command, '--prefix', install_dir, testdir, test_build_dir] + extra_flags + p = subprocess.Popen(gen_command) + p.wait() + if not should_succeed: + if p.returncode != 0: + return + raise RuntimeError('Test that should fail succeeded.') + if p.returncode != 0: + raise RuntimeError('Generating the build system failed.') + pc = subprocess.Popen(compile_commands, cwd=test_build_dir) + pc.wait() + if pc.returncode != 0: + raise RuntimeError('Compiling source code failed.') + pt = subprocess.Popen(test_commands, cwd=test_build_dir) + pt.wait() + if pt.returncode != 0: + raise RuntimeError('Running unit tests failed.') + pi = subprocess.Popen(install_commands, cwd=test_build_dir) + pi.wait() + if pi.returncode != 0: + raise RuntimeError('Running install failed.') + +def run_tests(): + commontests = gather_tests('test cases/common') + try: + os.mkdir(test_build_dir) + except OSError: + pass + try: + os.mkdir(install_dir) + except OSError: + pass + print('\nRunning cross compilation tests.\n') + [run_test(t) for t in commontests] + +if __name__ == '__main__': + script_dir = os.path.split(__file__)[0] + if script_dir != '': + os.chdir(script_dir) + run_tests() diff --git a/run_tests.py b/run_tests.py index c49a1d4f9..93f964003 100755 --- a/run_tests.py +++ b/run_tests.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright 2012 Jussi Pakkanen +# Copyright 2012-2013 Jussi Pakkanen # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/symbolextractor.py b/symbolextractor.py index a652b5d6b..a1c390d3a 100755 --- a/symbolextractor.py +++ b/symbolextractor.py @@ -23,6 +23,14 @@ # http://cgit.freedesktop.org/libreoffice/core/commit/?id=3213cd54b76bc80a6f0516aac75a48ff3b2ad67c import sys, subprocess, platform +from optparse import OptionParser + +usage_info = '%prog [options] ' + +parser = OptionParser(usage=usage_info) + +parser.add_option('--cross-host', default=None, dest='cross_host', + help='cross compilation host platform') def dummy_syms(outfilename): """Just touch it so relinking happens always.""" @@ -70,8 +78,14 @@ def osx_syms(libfilename, outfilename): result += [' '.join(x.split()[0:2]) for x in output.split('\n') if len(x) > 0 and not x.endswith('U')] write_if_changed('\n'.join(result) + '\n', outfilename) -def gen_symbols(libfilename, outfilename): - if platform.system() == 'Linux': +def gen_symbols(libfilename, outfilename, cross_host): + if cross_host is not None: + # In case of cross builds just always relink. + # In theory we could determine the correct + # toolset but there are more important things + # to do. + dummy_syms(outfilename) + elif platform.system() == 'Linux': linux_syms(libfilename, outfilename) elif platform.system() == 'Darwin': osx_syms(libfilename, outfilename) @@ -79,9 +93,10 @@ def gen_symbols(libfilename, outfilename): dummy_syms(outfilename) if __name__ == '__main__': - if len(sys.argv) != 3: + (options, args) = parser.parse_args(sys.argv) + if len(args) != 3: print(sys.argv[0], ' ') sys.exit(1) libfile = sys.argv[1] outfile = sys.argv[2] - gen_symbols(libfile, outfile) + gen_symbols(libfile, outfile, options.cross_host)