diff options
author | Nirbheek Chauhan <nirbheek@centricular.com> | 2016-11-08 15:34:44 +0530 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek@centricular.com> | 2016-11-08 16:05:32 +0530 |
commit | ae5a3629509fdd8f17fbfcecbfeb6798d2be6630 (patch) | |
tree | 45cbce44d03a0ac56e5b24add55ea6869f6fee27 | |
parent | 7400284e3233d7974beb53761db97885e26d1547 (diff) | |
download | meson-ae5a3629509fdd8f17fbfcecbfeb6798d2be6630.zip meson-ae5a3629509fdd8f17fbfcecbfeb6798d2be6630.tar.gz meson-ae5a3629509fdd8f17fbfcecbfeb6798d2be6630.tar.bz2 |
tests/common: Run compiler checks for both C & C++
Without this we're just hoping that the C++ compiler behaves the same
way as the C compiler, which is not always true as demonstrated by
https://github.com/mesonbuild/meson/issues/958
-rw-r--r-- | test cases/common/33 try compile/meson.build | 29 | ||||
-rw-r--r-- | test cases/common/35 sizeof/meson.build | 24 | ||||
-rw-r--r-- | test cases/common/35 sizeof/prog.c.in (renamed from test cases/common/35 sizeof/prog.c) | 6 | ||||
-rw-r--r-- | test cases/common/37 has header/meson.build | 18 | ||||
-rw-r--r-- | test cases/common/39 tryrun/meson.build | 80 | ||||
-rw-r--r-- | test cases/common/43 has function/meson.build | 72 | ||||
-rw-r--r-- | test cases/common/44 has member/meson.build | 30 | ||||
-rw-r--r-- | test cases/common/45 alignment/meson.build | 48 | ||||
-rw-r--r-- | test cases/common/83 has type/meson.build | 18 |
9 files changed, 178 insertions, 147 deletions
diff --git a/test cases/common/33 try compile/meson.build b/test cases/common/33 try compile/meson.build index bca82ce..09ca395 100644 --- a/test cases/common/33 try compile/meson.build +++ b/test cases/common/33 try compile/meson.build @@ -1,4 +1,4 @@ -project('try compile', 'c') +project('try compile', 'c', 'cpp') code = '''#include<stdio.h> void func() { printf("Something.\n"); } @@ -8,19 +8,20 @@ breakcode = '''#include<nonexisting.h> void func() { printf("This won't work.\n"); } ''' -compiler = meson.get_compiler('c') -if compiler.compiles(code, name : 'should succeed') == false - error('Compiler is fail.') -endif +foreach compiler : [meson.get_compiler('c'), meson.get_compiler('cpp')] + if compiler.compiles(code, name : 'should succeed') == false + error('Compiler ' + compiler.get_id() + ' is fail.') + endif -if compiler.compiles(files('valid.c'), name : 'should succeed') == false - error('Compiler is fail.') -endif + if compiler.compiles(files('valid.c'), name : 'should succeed') == false + error('Compiler ' + compiler.get_id() + ' is fail.') + endif -if compiler.compiles(breakcode, name : 'should fail') - error('Compiler returned true on broken code.') -endif + if compiler.compiles(breakcode, name : 'should fail') + error('Compiler ' + compiler.get_id() + ' returned true on broken code.') + endif -if compiler.compiles(files('invalid.c'), name : 'should fail') - error('Compiler returned true on broken code.') -endif + if compiler.compiles(files('invalid.c'), name : 'should fail') + error('Compiler ' + compiler.get_id() + ' returned true on broken code.') + endif +endforeach diff --git a/test cases/common/35 sizeof/meson.build b/test cases/common/35 sizeof/meson.build index 4a0398b..9de5b78 100644 --- a/test cases/common/35 sizeof/meson.build +++ b/test cases/common/35 sizeof/meson.build @@ -1,13 +1,33 @@ -project('sizeof', 'c') +project('sizeof', 'c', 'cpp') +# Test with C cc = meson.get_compiler('c') + intsize = cc.sizeof('int') wcharsize = cc.sizeof('wchar_t', prefix : '#include<wchar.h>') cd = configuration_data() cd.set('INTSIZE', intsize) cd.set('WCHARSIZE', wcharsize) +cd.set('CONFIG', 'config.h') configure_file(input : 'config.h.in', output : 'config.h', configuration : cd) +s = configure_file(input : 'prog.c.in', output : 'prog.c', configuration : cd) -e = executable('prog', 'prog.c') +e = executable('prog', s) test('sizeof test', e) + +# Test with C++ +cpp = meson.get_compiler('cpp') + +intsize = cpp.sizeof('int') +wcharsize = cpp.sizeof('wchar_t', prefix : '#include<wchar.h>') + +cdpp = configuration_data() +cdpp.set('INTSIZE', intsize) +cdpp.set('WCHARSIZE', wcharsize) +cdpp.set('CONFIG', 'config.hpp') +configure_file(input : 'config.h.in', output : 'config.hpp', configuration : cdpp) +spp = configure_file(input : 'prog.c.in', output : 'prog.cc', configuration : cdpp) + +epp = executable('progpp', spp) +test('sizeof test c++', epp) diff --git a/test cases/common/35 sizeof/prog.c b/test cases/common/35 sizeof/prog.c.in index 9164c18..85b1229 100644 --- a/test cases/common/35 sizeof/prog.c +++ b/test cases/common/35 sizeof/prog.c.in @@ -1,6 +1,6 @@ -#include"config.h" -#include<stdio.h> -#include<wchar.h> +#include "@CONFIG@" +#include <stdio.h> +#include <wchar.h> int main(int argc, char **argv) { if(INTSIZE != sizeof(int)) { diff --git a/test cases/common/37 has header/meson.build b/test cases/common/37 has header/meson.build index bbfce6d..ce6e71a 100644 --- a/test cases/common/37 has header/meson.build +++ b/test cases/common/37 has header/meson.build @@ -1,11 +1,11 @@ -project('has header', 'c') +project('has header', 'c', 'cpp') -cc = meson.get_compiler('c') +foreach comp : [meson.get_compiler('c'), meson.get_compiler('cpp')] + if comp.has_header('stdio.h') == false + error('Stdio missing.') + endif -if cc.has_header('stdio.h') == false - error('Stdio missing.') -endif - -if cc.has_header('ouagadougou.h') - error('Found non-existant header.') -endif + if comp.has_header('ouagadougou.h') + error('Found non-existant header.') + endif +endforeach diff --git a/test cases/common/39 tryrun/meson.build b/test cases/common/39 tryrun/meson.build index f5d07ab..c64446f 100644 --- a/test cases/common/39 tryrun/meson.build +++ b/test cases/common/39 tryrun/meson.build @@ -1,14 +1,14 @@ -project('tryrun', 'c') +project('tryrun', 'c', 'cpp') # Complex to exercise all code paths. if meson.is_cross_build() if meson.has_exe_wrapper() - cc = meson.get_compiler('c', native : false) + compilers = [meson.get_compiler('c', native : false), meson.get_compiler('cpp', native : false)] else - cc = meson.get_compiler('c', native : true) + compilers = [meson.get_compiler('c', native : true), meson.get_compiler('cpp', native : true)] endif else - cc = meson.get_compiler('c') + compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] endif ok_code = '''#include<stdio.h> @@ -32,45 +32,47 @@ INPUTS = [ ['File', files('ok.c'), files('error.c'), files('no_compile.c')], ] -foreach input : INPUTS - type = input[0] - ok = cc.run(input[1], name : type + ' should succeed') - err = cc.run(input[2], name : type + ' should fail') - noc = cc.run(input[3], name : type + ' does not compile') +foreach cc : compilers + foreach input : INPUTS + type = input[0] + ok = cc.run(input[1], name : type + ' should succeed') + err = cc.run(input[2], name : type + ' should fail') + noc = cc.run(input[3], name : type + ' does not compile') - if noc.compiled() - error(type + ' compilation fail test failed.') - else - message(type + ' fail detected properly.') - endif + if noc.compiled() + error(type + ' compilation fail test failed.') + else + message(type + ' fail detected properly.') + endif - if ok.compiled() - message(type + ' compilation worked.') - else - error(type + ' compilation did not work.') - endif + if ok.compiled() + message(type + ' compilation worked.') + else + error(type + ' compilation did not work.') + endif - if ok.returncode() == 0 - message(type + ' return code ok.') - else - error(type + ' return code fail') - endif + if ok.returncode() == 0 + message(type + ' return code ok.') + else + error(type + ' return code fail') + endif - if err.returncode() == 1 - message(type + ' bad return code ok.') - else - error(type + ' bad return code fail.') - endif + if err.returncode() == 1 + message(type + ' bad return code ok.') + else + error(type + ' bad return code fail.') + endif - if ok.stdout().strip() == 'stdout' - message(type + ' stdout ok.') - else - message(type + ' bad stdout.') - endif + if ok.stdout().strip() == 'stdout' + message(type + ' stdout ok.') + else + message(type + ' bad stdout.') + endif - if ok.stderr().strip() == 'stderr' - message(type + ' stderr ok.') - else - message(type + ' bad stderr.') - endif + if ok.stderr().strip() == 'stderr' + message(type + ' stderr ok.') + else + message(type + ' bad stderr.') + endif + endforeach endforeach diff --git a/test cases/common/43 has function/meson.build b/test cases/common/43 has function/meson.build index 00ca640..61f96e1 100644 --- a/test cases/common/43 has function/meson.build +++ b/test cases/common/43 has function/meson.build @@ -1,41 +1,43 @@ -project('has function', 'c') +project('has function', 'c', 'cpp') -cc = meson.get_compiler('c') +compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] -if not cc.has_function('printf', prefix : '#include<stdio.h>') - error('"printf" function not found (should always exist).') -endif +foreach cc : compilers + if not cc.has_function('printf', prefix : '#include<stdio.h>') + error('"printf" function not found (should always exist).') + endif -# Should also be able to detect it without specifying the header -# We check for a different function here to make sure the result is -# not taken from a cache (ie. the check above) -# On MSVC fprintf is defined as an inline function in the header, so it cannot -# be found without the include. -if cc.get_id() != 'msvc' - assert(cc.has_function('fprintf'), '"fprintf" function not found without include (on !msvc).') -else - assert(cc.has_function('fprintf', prefix : '#include <stdio.h>'), '"fprintf" function not found with include (on msvc).') -endif + # Should also be able to detect it without specifying the header + # We check for a different function here to make sure the result is + # not taken from a cache (ie. the check above) + # On MSVC fprintf is defined as an inline function in the header, so it cannot + # be found without the include. + if cc.get_id() != 'msvc' + assert(cc.has_function('fprintf'), '"fprintf" function not found without include (on !msvc).') + else + assert(cc.has_function('fprintf', prefix : '#include <stdio.h>'), '"fprintf" function not found with include (on msvc).') + endif -if cc.has_function('hfkerhisadf', prefix : '#include<stdio.h>') - error('Found non-existent function "hfkerhisadf".') -endif + if cc.has_function('hfkerhisadf', prefix : '#include<stdio.h>') + error('Found non-existent function "hfkerhisadf".') + endif -# With glibc on Linux lchmod is a stub that will always return an error, -# we want to detect that and declare that the function is not available. -# We can't check for the C library used here of course, but if it's not -# implemented in glibc it's probably not implemented in any other 'slimmer' -# C library variants either, so the check should be safe either way hopefully. -if host_machine.system() == 'linux' and cc.get_id() == 'gcc' - assert (cc.has_function('poll', prefix : '#include <poll.h>'), 'couldn\'t detect "poll" when defined by a header') - assert (not cc.has_function('lchmod', prefix : '''#include <sys/stat.h> - #include <unistd.h>'''), '"lchmod" check should have failed') -endif + # With glibc on Linux lchmod is a stub that will always return an error, + # we want to detect that and declare that the function is not available. + # We can't check for the C library used here of course, but if it's not + # implemented in glibc it's probably not implemented in any other 'slimmer' + # C library variants either, so the check should be safe either way hopefully. + if host_machine.system() == 'linux' and cc.get_id() == 'gcc' + assert (cc.has_function('poll', prefix : '#include <poll.h>'), 'couldn\'t detect "poll" when defined by a header') + assert (not cc.has_function('lchmod', prefix : '''#include <sys/stat.h> + #include <unistd.h>'''), '"lchmod" check should have failed') + endif -# For some functions one needs to define _GNU_SOURCE before including the -# right headers to get them picked up. Make sure we can detect these functions -# as well without any prefix -if cc.has_header_symbol('sys/socket.h', 'recvmmsg', prefix : '#define _GNU_SOURCE') - # We assume that if recvmmsg exists sendmmsg does too - assert (cc.has_function('sendmmsg'), 'Failed to detect function "sendmmsg" (should always exist).') -endif + # For some functions one needs to define _GNU_SOURCE before including the + # right headers to get them picked up. Make sure we can detect these functions + # as well without any prefix + if cc.has_header_symbol('sys/socket.h', 'recvmmsg', prefix : '#define _GNU_SOURCE') + # We assume that if recvmmsg exists sendmmsg does too + assert (cc.has_function('sendmmsg'), 'Failed to detect function "sendmmsg" (should always exist).') + endif +endforeach diff --git a/test cases/common/44 has member/meson.build b/test cases/common/44 has member/meson.build index e60aeb3..4e61956 100644 --- a/test cases/common/44 has member/meson.build +++ b/test cases/common/44 has member/meson.build @@ -1,19 +1,21 @@ -project('has member', 'c') +project('has member', 'c', 'cpp') -cc = meson.get_compiler('c') +compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] -if not cc.has_member('struct tm', 'tm_sec', prefix : '#include<time.h>') - error('Did not detect member of "struct tm" that exists: "tm_sec"') -endif +foreach cc : compilers + if not cc.has_member('struct tm', 'tm_sec', prefix : '#include<time.h>') + error('Did not detect member of "struct tm" that exists: "tm_sec"') + endif -if cc.has_member('struct tm', 'tm_nonexistent', prefix : '#include<time.h>') - error('Not existing member "tm_nonexistent" found.') -endif + if cc.has_member('struct tm', 'tm_nonexistent', prefix : '#include<time.h>') + error('Not existing member "tm_nonexistent" found.') + endif -if not cc.has_members('struct tm', 'tm_sec', 'tm_min', prefix : '#include<time.h>') - error('Did not detect members of "struct tm" that exist: "tm_sec" "tm_min"') -endif + if not cc.has_members('struct tm', 'tm_sec', 'tm_min', prefix : '#include<time.h>') + error('Did not detect members of "struct tm" that exist: "tm_sec" "tm_min"') + endif -if cc.has_members('struct tm', 'tm_sec', 'tm_nonexistent2', prefix : '#include<time.h>') - error('Not existing member "tm_nonexistent2" found.') -endif + if cc.has_members('struct tm', 'tm_sec', 'tm_nonexistent2', prefix : '#include<time.h>') + error('Not existing member "tm_nonexistent2" found.') + endif +endforeach diff --git a/test cases/common/45 alignment/meson.build b/test cases/common/45 alignment/meson.build index 2ec3f89..a9bd65b 100644 --- a/test cases/common/45 alignment/meson.build +++ b/test cases/common/45 alignment/meson.build @@ -1,29 +1,31 @@ -project('alignment', 'c') +project('alignment', 'c', 'cpp') -cc = meson.get_compiler('c') +compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] -# These tests should return the same value on all -# platforms. If (and when) they don't, fix 'em up. -if cc.alignment('char') != 1 - error('Alignment of char misdetected.') -endif +foreach cc : compilers + # These tests should return the same value on all + # platforms. If (and when) they don't, fix 'em up. + if cc.alignment('char') != 1 + error('Alignment of char misdetected.') + endif -ptr_size = cc.sizeof('void*') -dbl_alignment = cc.alignment('double') + ptr_size = cc.sizeof('void*') + dbl_alignment = cc.alignment('double') -# These tests are not thorough. Doing this properly -# would take a lot of work because it is strongly -# platform and compiler dependent. So just check -# that they produce something fairly sane. + # These tests are not thorough. Doing this properly + # would take a lot of work because it is strongly + # platform and compiler dependent. So just check + # that they produce something fairly sane. -if ptr_size == 8 or ptr_size == 4 - message('Size of ptr ok.') -else - error('Size of ptr misdetected.') -endif + if ptr_size == 8 or ptr_size == 4 + message('Size of ptr ok.') + else + error('Size of ptr misdetected.') + endif -if dbl_alignment == 8 or dbl_alignment == 4 - message('Alignment of double ok.') -else - error('Alignment of double misdetected.') -endif + if dbl_alignment == 8 or dbl_alignment == 4 + message('Alignment of double ok.') + else + error('Alignment of double misdetected.') + endif +endforeach diff --git a/test cases/common/83 has type/meson.build b/test cases/common/83 has type/meson.build index 002f150..de8dbc8 100644 --- a/test cases/common/83 has type/meson.build +++ b/test cases/common/83 has type/meson.build @@ -1,11 +1,13 @@ -project('has type', 'c') +project('has type', 'c', 'cpp') -cc = meson.get_compiler('c') +compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] -if not cc.has_type('time_t', prefix : '#include<time.h>') - error('Did not detect type that exists.') -endif +foreach cc : compilers + if not cc.has_type('time_t', prefix : '#include<time.h>') + error('Did not detect type that exists.') + endif -if cc.has_type('no_time_t', prefix : '#include<time.h>') - error('Not existing type found.') -endif + if cc.has_type('no_time_t', prefix : '#include<time.h>') + error('Not existing type found.') + endif +endforeach |