aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends.py4
-rwxr-xr-xrun_cross_test.py88
-rwxr-xr-xrun_tests.py2
-rwxr-xr-xsymbolextractor.py23
4 files changed, 111 insertions, 6 deletions
diff --git a/backends.py b/backends.py
index 97991a0..5049be4 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 0000000..e96e622
--- /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 c49a1d4..93f9640 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 a652b5d..a1c390d 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] <shared library> <symbol file>'
+
+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], '<shared library file> <output file>')
sys.exit(1)
libfile = sys.argv[1]
outfile = sys.argv[2]
- gen_symbols(libfile, outfile)
+ gen_symbols(libfile, outfile, options.cross_host)