From f3c793b9c1705f4eebbc68755bea7fe7926d123f Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Mon, 25 Jul 2016 21:06:25 +0300 Subject: Added test for a prebuilt static library and a declare_dependency that uses it. --- run_tests.py | 65 +++++++++++++++++-------- test cases/prebuilt object/1 basic/main.c | 5 -- test cases/prebuilt object/1 basic/meson.build | 25 ---------- test cases/prebuilt object/1 basic/source.c | 8 --- test cases/prebuilt/1 object/main.c | 5 ++ test cases/prebuilt/1 object/meson.build | 25 ++++++++++ test cases/prebuilt/1 object/source.c | 8 +++ test cases/prebuilt/2 static/libdir/best.c | 3 ++ test cases/prebuilt/2 static/libdir/best.h | 3 ++ test cases/prebuilt/2 static/libdir/meson.build | 5 ++ test cases/prebuilt/2 static/main.c | 7 +++ test cases/prebuilt/2 static/meson.build | 5 ++ 12 files changed, 106 insertions(+), 58 deletions(-) delete mode 100644 test cases/prebuilt object/1 basic/main.c delete mode 100644 test cases/prebuilt object/1 basic/meson.build delete mode 100644 test cases/prebuilt object/1 basic/source.c create mode 100644 test cases/prebuilt/1 object/main.c create mode 100644 test cases/prebuilt/1 object/meson.build create mode 100644 test cases/prebuilt/1 object/source.c create mode 100644 test cases/prebuilt/2 static/libdir/best.c create mode 100644 test cases/prebuilt/2 static/libdir/best.h create mode 100644 test cases/prebuilt/2 static/libdir/meson.build create mode 100644 test cases/prebuilt/2 static/main.c create mode 100644 test cases/prebuilt/2 static/meson.build diff --git a/run_tests.py b/run_tests.py index b0d666f..34258d8 100755 --- a/run_tests.py +++ b/run_tests.py @@ -308,7 +308,7 @@ def detect_tests_to_run(): all_tests = [] all_tests.append(('common', gather_tests('test cases/common'), False)) all_tests.append(('failing', gather_tests('test cases/failing'), False)) - all_tests.append(('prebuilt object', gather_tests('test cases/prebuilt object'), False)) + all_tests.append(('prebuilt', gather_tests('test cases/prebuilt'), False)) all_tests.append(('platform-osx', gather_tests('test cases/osx'), False if mesonlib.is_osx() else True)) all_tests.append(('platform-windows', gather_tests('test cases/windows'), False if mesonlib.is_windows() else True)) @@ -405,27 +405,51 @@ def check_format(): fullname = os.path.join(root, file) check_file(fullname) -def generate_prebuilt_object(): - source = 'test cases/prebuilt object/1 basic/source.c' - objectbase = 'test cases/prebuilt object/1 basic/prebuilt.' - if shutil.which('cl'): - objectfile = objectbase + 'obj' - cmd = ['cl', '/nologo', '/Fo'+objectfile, '/c', source] +def pbcompile(compiler, source, objectfile): + if compiler == 'cl': + cmd = [compiler, '/nologo', '/Fo'+objectfile, '/c', source] else: - if mesonlib.is_windows(): - objectfile = objectbase + 'obj' - else: - objectfile = objectbase + 'o' - if shutil.which('cc'): - cmd = 'cc' - elif shutil.which('gcc'): - cmd = 'gcc' - else: - raise RuntimeError("Could not find C compiler.") - cmd = [cmd, '-c', source, '-o', objectfile] + cmd = [compiler, '-c', source, '-o', objectfile] subprocess.check_call(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + +def generate_pb_object(compiler, object_suffix): + source = 'test cases/prebuilt/1 object/source.c' + objectfile = 'test cases/prebuilt/1 object/prebuilt.' + object_suffix + pbcompile(compiler, source, objectfile) return objectfile +def generate_pb_static(compiler, object_suffix, static_suffix): + source = 'test cases/prebuilt/2 static/libdir/best.c' + objectfile = 'test cases/prebuilt/2 static/libdir/best.' + object_suffix + stlibfile = 'test cases/prebuilt/2 static/libdir/libbest.' + static_suffix + pbcompile(compiler, source, objectfile) + if compiler == 'cl': + linker = ['lib', '/NOLOGO', '/OUT:' + stlibfile, objectfile] + else: + linker = ['ar', 'csr', stlibfile, objectfile] + subprocess.check_call(linker) + os.unlink(objectfile) + return stlibfile + +def generate_prebuilt(): + static_suffix = 'a' + if shutil.which('cl'): + compiler = 'cl' + static_suffix = 'lib' + elif shutil.which('cc'): + compiler = 'cc' + elif shutil.which('gcc'): + compiler = 'gcc' + else: + raise RuntimeError("Could not find C compiler.") + if mesonlib.is_windows(): + object_suffix = 'obj' + else: + object_suffix = 'o' + objectfile = generate_pb_object(compiler, object_suffix) + stlibfile = generate_pb_static(compiler, object_suffix, static_suffix) + return (objectfile, stlibfile) + if __name__ == '__main__': parser = argparse.ArgumentParser(description="Run the test suite of Meson.") parser.add_argument('extra_args', nargs='*', @@ -439,12 +463,13 @@ if __name__ == '__main__': if script_dir != '': os.chdir(script_dir) check_format() - pbfile = generate_prebuilt_object() + pbfiles = generate_prebuilt() try: run_tests(options.extra_args) except StopException: pass - os.unlink(pbfile) + for f in pbfiles: + os.unlink(f) print('\nTotal passed tests:', passing_tests) print('Total failed tests:', failing_tests) print('Total skipped tests:', skipped_tests) diff --git a/test cases/prebuilt object/1 basic/main.c b/test cases/prebuilt object/1 basic/main.c deleted file mode 100644 index 480bda5..0000000 --- a/test cases/prebuilt object/1 basic/main.c +++ /dev/null @@ -1,5 +0,0 @@ -int func(); - -int main(int argc, char **argv) { - return func() == 42 ? 0 : 99; -} diff --git a/test cases/prebuilt object/1 basic/meson.build b/test cases/prebuilt object/1 basic/meson.build deleted file mode 100644 index 92f966b..0000000 --- a/test cases/prebuilt object/1 basic/meson.build +++ /dev/null @@ -1,25 +0,0 @@ -# This test is on its own because it is special. -# To run the test you need the prebuilt object -# file for the given platform. -# -# Combined with cross compilation this would make -# the state space explode so let's just keep this -# in its own subdir so it's not run during cross -# compilation tests. - -project('prebuilt object', 'c') - -if host_machine.system() == 'windows' - prebuilt = 'prebuilt.obj' -else - prebuilt = 'prebuilt.o' -endif - -# Remember: do not put source.c in this -# declaration. run_tests.py generates the -# prebuilt object before running this test. - -e = executable('prog', 'main.c', -objects : prebuilt) - -test('objtest', e) diff --git a/test cases/prebuilt object/1 basic/source.c b/test cases/prebuilt object/1 basic/source.c deleted file mode 100644 index f39b4f3..0000000 --- a/test cases/prebuilt object/1 basic/source.c +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Compile this manually on new platforms and add the - * object file to revision control and Meson configuration. - */ - -int func() { - return 42; -} diff --git a/test cases/prebuilt/1 object/main.c b/test cases/prebuilt/1 object/main.c new file mode 100644 index 0000000..480bda5 --- /dev/null +++ b/test cases/prebuilt/1 object/main.c @@ -0,0 +1,5 @@ +int func(); + +int main(int argc, char **argv) { + return func() == 42 ? 0 : 99; +} diff --git a/test cases/prebuilt/1 object/meson.build b/test cases/prebuilt/1 object/meson.build new file mode 100644 index 0000000..92f966b --- /dev/null +++ b/test cases/prebuilt/1 object/meson.build @@ -0,0 +1,25 @@ +# This test is on its own because it is special. +# To run the test you need the prebuilt object +# file for the given platform. +# +# Combined with cross compilation this would make +# the state space explode so let's just keep this +# in its own subdir so it's not run during cross +# compilation tests. + +project('prebuilt object', 'c') + +if host_machine.system() == 'windows' + prebuilt = 'prebuilt.obj' +else + prebuilt = 'prebuilt.o' +endif + +# Remember: do not put source.c in this +# declaration. run_tests.py generates the +# prebuilt object before running this test. + +e = executable('prog', 'main.c', +objects : prebuilt) + +test('objtest', e) diff --git a/test cases/prebuilt/1 object/source.c b/test cases/prebuilt/1 object/source.c new file mode 100644 index 0000000..f39b4f3 --- /dev/null +++ b/test cases/prebuilt/1 object/source.c @@ -0,0 +1,8 @@ +/* + * Compile this manually on new platforms and add the + * object file to revision control and Meson configuration. + */ + +int func() { + return 42; +} diff --git a/test cases/prebuilt/2 static/libdir/best.c b/test cases/prebuilt/2 static/libdir/best.c new file mode 100644 index 0000000..ab774e1 --- /dev/null +++ b/test cases/prebuilt/2 static/libdir/best.c @@ -0,0 +1,3 @@ +const char *msg() { + return "I am the best."; +} diff --git a/test cases/prebuilt/2 static/libdir/best.h b/test cases/prebuilt/2 static/libdir/best.h new file mode 100644 index 0000000..063017f --- /dev/null +++ b/test cases/prebuilt/2 static/libdir/best.h @@ -0,0 +1,3 @@ +#pragma once + +const char *msg(); diff --git a/test cases/prebuilt/2 static/libdir/meson.build b/test cases/prebuilt/2 static/libdir/meson.build new file mode 100644 index 0000000..8d74ccf --- /dev/null +++ b/test cases/prebuilt/2 static/libdir/meson.build @@ -0,0 +1,5 @@ +cc = meson.get_compiler('c') +stlib = cc.find_library('best', dirs : meson.current_source_dir()) + +best_dep = declare_dependency(dependencies : stlib, + include_directories : include_directories('.')) diff --git a/test cases/prebuilt/2 static/main.c b/test cases/prebuilt/2 static/main.c new file mode 100644 index 0000000..d172625 --- /dev/null +++ b/test cases/prebuilt/2 static/main.c @@ -0,0 +1,7 @@ +#include +#include + +int main(int argc, char **argv) { + printf("%s\n", msg()); + return 0; +} diff --git a/test cases/prebuilt/2 static/meson.build b/test cases/prebuilt/2 static/meson.build new file mode 100644 index 0000000..9ea1d0d --- /dev/null +++ b/test cases/prebuilt/2 static/meson.build @@ -0,0 +1,5 @@ +project('prebuilt static lib', 'c') + +subdir('libdir') + +test('static', executable('mainprog', 'main.c', dependencies : best_dep)) -- cgit v1.1