From 7b6e527f440cd7e6f8be2b07cee320ee6ca18786 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 29 Apr 2024 06:41:38 +0200 Subject: Adding upstream version 1.0.1. Signed-off-by: Daniel Baumann --- test cases/common/14 configure file/basename.py | 28 ++ test cases/common/14 configure file/check_file.py | 34 +++ .../common/14 configure file/check_inputs.py | 14 + test cases/common/14 configure file/config.h | 1 + test cases/common/14 configure file/config.h.in | 5 + test cases/common/14 configure file/config4a.h.in | 2 + test cases/common/14 configure file/config4b.h.in | 2 + test cases/common/14 configure file/config5.h.in | 1 + test cases/common/14 configure file/config6.h.in | 19 ++ test cases/common/14 configure file/config7.h.in | 16 + test cases/common/14 configure file/config8.h.in | 3 + test cases/common/14 configure file/depfile | 0 .../14 configure file/differentafterbasename1.in | 0 .../14 configure file/differentafterbasename2.in | 0 test cases/common/14 configure file/dummy.dat | 0 test cases/common/14 configure file/dumpprog.c | 52 ++++ .../common/14 configure file/file_contains.py | 22 ++ .../common/14 configure file/generator-deps.py | 19 ++ .../generator-without-input-file.py | 14 + test cases/common/14 configure file/generator.py | 17 ++ .../common/14 configure file/invalid-utf8.bin.in | Bin 0 -> 10 bytes test cases/common/14 configure file/meson.build | 330 +++++++++++++++++++++ .../14 configure file/nosubst-nocopy1.txt.in | 1 + .../14 configure file/nosubst-nocopy2.txt.in | 1 + test cases/common/14 configure file/prog.c | 17 ++ test cases/common/14 configure file/prog2.c | 5 + test cases/common/14 configure file/prog4.c | 6 + test cases/common/14 configure file/prog5.c | 6 + test cases/common/14 configure file/prog6.c | 11 + test cases/common/14 configure file/prog7.c | 10 + test cases/common/14 configure file/prog9.c | 18 ++ .../common/14 configure file/sameafterbasename.in | 0 .../common/14 configure file/sameafterbasename.in2 | 0 .../common/14 configure file/subdir/meson.build | 38 +++ test cases/common/14 configure file/test.json | 9 + test cases/common/14 configure file/test.py.in | 4 + test cases/common/14 configure file/touch.py | 16 + 37 files changed, 721 insertions(+) create mode 100644 test cases/common/14 configure file/basename.py create mode 100644 test cases/common/14 configure file/check_file.py create mode 100644 test cases/common/14 configure file/check_inputs.py create mode 100644 test cases/common/14 configure file/config.h create mode 100644 test cases/common/14 configure file/config.h.in create mode 100644 test cases/common/14 configure file/config4a.h.in create mode 100644 test cases/common/14 configure file/config4b.h.in create mode 100644 test cases/common/14 configure file/config5.h.in create mode 100644 test cases/common/14 configure file/config6.h.in create mode 100644 test cases/common/14 configure file/config7.h.in create mode 100644 test cases/common/14 configure file/config8.h.in create mode 100644 test cases/common/14 configure file/depfile create mode 100644 test cases/common/14 configure file/differentafterbasename1.in create mode 100644 test cases/common/14 configure file/differentafterbasename2.in create mode 100644 test cases/common/14 configure file/dummy.dat create mode 100644 test cases/common/14 configure file/dumpprog.c create mode 100644 test cases/common/14 configure file/file_contains.py create mode 100755 test cases/common/14 configure file/generator-deps.py create mode 100755 test cases/common/14 configure file/generator-without-input-file.py create mode 100755 test cases/common/14 configure file/generator.py create mode 100644 test cases/common/14 configure file/invalid-utf8.bin.in create mode 100644 test cases/common/14 configure file/meson.build create mode 100644 test cases/common/14 configure file/nosubst-nocopy1.txt.in create mode 100644 test cases/common/14 configure file/nosubst-nocopy2.txt.in create mode 100644 test cases/common/14 configure file/prog.c create mode 100644 test cases/common/14 configure file/prog2.c create mode 100644 test cases/common/14 configure file/prog4.c create mode 100644 test cases/common/14 configure file/prog5.c create mode 100644 test cases/common/14 configure file/prog6.c create mode 100644 test cases/common/14 configure file/prog7.c create mode 100644 test cases/common/14 configure file/prog9.c create mode 100644 test cases/common/14 configure file/sameafterbasename.in create mode 100644 test cases/common/14 configure file/sameafterbasename.in2 create mode 100644 test cases/common/14 configure file/subdir/meson.build create mode 100644 test cases/common/14 configure file/test.json create mode 100644 test cases/common/14 configure file/test.py.in create mode 100644 test cases/common/14 configure file/touch.py (limited to 'test cases/common/14 configure file') diff --git a/test cases/common/14 configure file/basename.py b/test cases/common/14 configure file/basename.py new file mode 100644 index 0000000..d2c8662 --- /dev/null +++ b/test cases/common/14 configure file/basename.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +import sys +import argparse +import os + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('text', nargs='*', type=str) + args = parser.parse_args() + + text = args.text if isinstance(args.text, list) else [args.text] + + output = '' + for t in text: + t = os.path.basename(t) + + if not output: + output += t + else: + output += ' ' + t + + output += '\n' + + sys.stdout.write(output) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/test cases/common/14 configure file/check_file.py b/test cases/common/14 configure file/check_file.py new file mode 100644 index 0000000..7d96b2a --- /dev/null +++ b/test cases/common/14 configure file/check_file.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import os +import sys + +def permit_osx_workaround(m1, m2): + import platform + if platform.system().lower() != 'darwin': + return False + if m2 % 10000 != 0: + return False + if m1//10000 != m2//10000: + return False + return True + +if len(sys.argv) == 2: + assert os.path.exists(sys.argv[1]) +elif len(sys.argv) == 3: + f1 = sys.argv[1] + f2 = sys.argv[2] + m1 = os.stat(f1).st_mtime_ns + m2 = os.stat(f2).st_mtime_ns + # Compare only os.stat() + if m1 != m2: + # Under macOS the lower four digits sometimes get assigned + # zero, even though shutil.copy2 should preserve metadata. + # Just have to accept it, I guess. + if not permit_osx_workaround(m1, m2): + raise RuntimeError(f'mtime of {f1!r} ({m1!r}) != mtime of {f2!r} ({m2!r})') + import filecmp + if not filecmp.cmp(f1, f2): + raise RuntimeError(f'{f1!r} != {f2!r}') +else: + raise AssertionError diff --git a/test cases/common/14 configure file/check_inputs.py b/test cases/common/14 configure file/check_inputs.py new file mode 100644 index 0000000..1faa8ba --- /dev/null +++ b/test cases/common/14 configure file/check_inputs.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import sys +from pathlib import Path + +files = [Path(f) for f in sys.argv[1:]] +names = [f.name for f in files] + +assert names == ['check_inputs.txt', 'prog.c', 'prog.c', 'prog2.c', 'prog4.c', 'prog5.c'] +for f in files[1:]: + assert f.exists() + +with files[0].open('w') as ofile: + ofile.write("#define ZERO_RESULT 0\n") diff --git a/test cases/common/14 configure file/config.h b/test cases/common/14 configure file/config.h new file mode 100644 index 0000000..e85b634 --- /dev/null +++ b/test cases/common/14 configure file/config.h @@ -0,0 +1 @@ +#error "This file should not be included. Build dir must become before source dir in search order" diff --git a/test cases/common/14 configure file/config.h.in b/test cases/common/14 configure file/config.h.in new file mode 100644 index 0000000..14a1558 --- /dev/null +++ b/test cases/common/14 configure file/config.h.in @@ -0,0 +1,5 @@ +#define MESSAGE "@var@" +#define OTHER "@other@" "@second@" "@empty@" + +#mesondefine BE_TRUE +#mesondefine SHOULD_BE_UNDEF diff --git a/test cases/common/14 configure file/config4a.h.in b/test cases/common/14 configure file/config4a.h.in new file mode 100644 index 0000000..aafd195 --- /dev/null +++ b/test cases/common/14 configure file/config4a.h.in @@ -0,0 +1,2 @@ +/* Dummy file */ +#define RESULTA @ZERO@ diff --git a/test cases/common/14 configure file/config4b.h.in b/test cases/common/14 configure file/config4b.h.in new file mode 100644 index 0000000..3408bab --- /dev/null +++ b/test cases/common/14 configure file/config4b.h.in @@ -0,0 +1,2 @@ +/* Dummy file */ +#define RESULTB @ZERO@ diff --git a/test cases/common/14 configure file/config5.h.in b/test cases/common/14 configure file/config5.h.in new file mode 100644 index 0000000..323bec6 --- /dev/null +++ b/test cases/common/14 configure file/config5.h.in @@ -0,0 +1 @@ +#define MESSAGE "@var@" diff --git a/test cases/common/14 configure file/config6.h.in b/test cases/common/14 configure file/config6.h.in new file mode 100644 index 0000000..9719f87 --- /dev/null +++ b/test cases/common/14 configure file/config6.h.in @@ -0,0 +1,19 @@ +/* No escape */ +#define MESSAGE1 "@var1@" + +/* Single escape means no replace */ +#define MESSAGE2 "\@var1@" + +/* Replace pairs of escapes before '@' or '\@' with escape characters + * (note we have to double number of pairs due to C string escaping) + */ +#define MESSAGE3 "\\\\@var1@" + +/* Pairs of escapes and then single escape to avoid replace */ +#define MESSAGE4 "\\\\\@var1@" + +/* Check escaped variable does not overlap following variable */ +#define MESSAGE5 "\@var1@var2@" + +/* Check escape character outside variables */ +#define MESSAGE6 "\\ @ \@ \\\\@ \\\\\@" diff --git a/test cases/common/14 configure file/config7.h.in b/test cases/common/14 configure file/config7.h.in new file mode 100644 index 0000000..edd0bb3 --- /dev/null +++ b/test cases/common/14 configure file/config7.h.in @@ -0,0 +1,16 @@ +/* No escape */ +#define MESSAGE1 "${var1}" + +/* Single escape means no replace */ +#define MESSAGE2 "\${var1}" + +/* Replace pairs of escapes before '@' or '\@' with escape characters + * (note we have to double number of pairs due to C string escaping) + */ +#define MESSAGE3 "\\\\${var1}" + +/* Pairs of escapes and then single escape to avoid replace */ +#define MESSAGE4 "\\\\\${var1}" + +/* Check escape character outside variables */ +#define MESSAGE5 "\\ ${ \${ \\\\${ \\\\\${" diff --git a/test cases/common/14 configure file/config8.h.in b/test cases/common/14 configure file/config8.h.in new file mode 100644 index 0000000..b854ea0 --- /dev/null +++ b/test cases/common/14 configure file/config8.h.in @@ -0,0 +1,3 @@ +#define MESSAGE "@var@" + +#define "non isolatin1 char Ä fails decode with utf-8" diff --git a/test cases/common/14 configure file/depfile b/test cases/common/14 configure file/depfile new file mode 100644 index 0000000..e69de29 diff --git a/test cases/common/14 configure file/differentafterbasename1.in b/test cases/common/14 configure file/differentafterbasename1.in new file mode 100644 index 0000000..e69de29 diff --git a/test cases/common/14 configure file/differentafterbasename2.in b/test cases/common/14 configure file/differentafterbasename2.in new file mode 100644 index 0000000..e69de29 diff --git a/test cases/common/14 configure file/dummy.dat b/test cases/common/14 configure file/dummy.dat new file mode 100644 index 0000000..e69de29 diff --git a/test cases/common/14 configure file/dumpprog.c b/test cases/common/14 configure file/dumpprog.c new file mode 100644 index 0000000..9f63b23 --- /dev/null +++ b/test cases/common/14 configure file/dumpprog.c @@ -0,0 +1,52 @@ +#define SHOULD_BE_UNDEFINED 1 + +#include"config3.h" +#include +#include + +#ifdef SHOULD_BE_UNDEFINED +#error Token did not get undefined. +#endif + +#ifndef SHOULD_BE_DEFINED +#error Token did not get defined +#endif + +#define stringify(s) str(s) +#define str(s) #s + +int main(void) { +#if !(SHOULD_BE_UNQUOTED_STRING == string) + printf("String token (unquoted) defined wrong.\n"); + return 1; +#endif + if(strcmp(SHOULD_BE_STRING, "string") != 0) { + printf("String token defined wrong.\n"); + return 1; + } + if(strcmp(SHOULD_BE_STRING2, "A \"B\" C") != 0) { + printf("String token 2 defined wrong.\n"); + return 1; + } + if(strcmp(SHOULD_BE_STRING3, "A \"\" C") != 0) { + printf("String token 3 defined wrong.\n"); + return 1; + } + if(strcmp(SHOULD_BE_STRING4, "A \" C") != 0) { + printf("String token 4 defined wrong.\n"); + return 1; + } + if(SHOULD_BE_ONE != 1) { + printf("One defined incorrectly.\n"); + return 1; + } + if(SHOULD_BE_ZERO != 0) { + printf("Zero defined incorrectly.\n"); + return 1; + } + if(strcmp(SHOULD_BE_QUOTED_ONE, "1") != 0) { + printf("Quoted number defined incorrectly.\n"); + return 1; + } + SHOULD_BE_RETURN 0; +} diff --git a/test cases/common/14 configure file/file_contains.py b/test cases/common/14 configure file/file_contains.py new file mode 100644 index 0000000..409f09c --- /dev/null +++ b/test cases/common/14 configure file/file_contains.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +import sys +import argparse + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('file', nargs=1, type=str) + parser.add_argument('text', nargs=1, type=str) + args = parser.parse_args() + + text = args.text[0] + + with open(args.file[0], encoding='utf-8') as f: + for line in f: + if line.strip() == text: + return 0 + + return 1 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/test cases/common/14 configure file/generator-deps.py b/test cases/common/14 configure file/generator-deps.py new file mode 100755 index 0000000..cca253c --- /dev/null +++ b/test cases/common/14 configure file/generator-deps.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +import sys, os +from pathlib import Path + +if len(sys.argv) != 3: + print("Wrong amount of parameters.") + +build_dir = Path(os.environ['MESON_BUILD_ROOT']) +subdir = Path(os.environ['MESON_SUBDIR']) +outputf = Path(sys.argv[1]) + +with outputf.open('w') as ofile: + ofile.write("#define ZERO_RESULT 0\n") + +depf = Path(sys.argv[2]) +if not depf.exists(): + with depf.open('w') as ofile: + ofile.write(f"{outputf.name}: depfile\n") diff --git a/test cases/common/14 configure file/generator-without-input-file.py b/test cases/common/14 configure file/generator-without-input-file.py new file mode 100755 index 0000000..2ee059e --- /dev/null +++ b/test cases/common/14 configure file/generator-without-input-file.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import sys, os +from pathlib import Path + +if len(sys.argv) != 2: + print("Wrong amount of parameters.") + +build_dir = Path(os.environ['MESON_BUILD_ROOT']) +subdir = Path(os.environ['MESON_SUBDIR']) +outputf = Path(sys.argv[1]) + +with outputf.open('w') as ofile: + ofile.write("#define ZERO_RESULT 0\n") diff --git a/test cases/common/14 configure file/generator.py b/test cases/common/14 configure file/generator.py new file mode 100755 index 0000000..832a7b8 --- /dev/null +++ b/test cases/common/14 configure file/generator.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +import sys, os +from pathlib import Path + +if len(sys.argv) != 3: + print("Wrong amount of parameters.") + +build_dir = Path(os.environ['MESON_BUILD_ROOT']) +subdir = Path(os.environ['MESON_SUBDIR']) +inputf = Path(sys.argv[1]) +outputf = Path(sys.argv[2]) + +assert inputf.exists() + +with outputf.open('w') as ofile: + ofile.write("#define ZERO_RESULT 0\n") diff --git a/test cases/common/14 configure file/invalid-utf8.bin.in b/test cases/common/14 configure file/invalid-utf8.bin.in new file mode 100644 index 0000000..98e9ed9 Binary files /dev/null and b/test cases/common/14 configure file/invalid-utf8.bin.in differ diff --git a/test cases/common/14 configure file/meson.build b/test cases/common/14 configure file/meson.build new file mode 100644 index 0000000..569dd09 --- /dev/null +++ b/test cases/common/14 configure file/meson.build @@ -0,0 +1,330 @@ +project('configure file test', 'c', meson_version: '>=0.63.0') + +fs = import('fs') + +conf = configuration_data() + +conf.set('var', 'mystring') +conf.set('other', 'string 2') +conf.set('second', ' bonus') +conf.set('BE_TRUE', true) + +assert(conf.get('var') == 'mystring', 'Get function is not working.') +assert(conf.get('var', 'default') == 'mystring', 'Get function is not working.') +assert(conf.get('notthere', 'default') == 'default', 'Default value getting is not working.') +assert(conf.keys() == ['BE_TRUE', 'other', 'second', 'var'], 'Keys function is not working') + +cfile = configure_file(input : 'config.h.in', + output : 'config.h', + configuration : conf) + +e = executable('inctest', 'prog.c', +# Note that you should NOT do this. Don't add generated headers here +# This tests that we do the right thing even if people add in conf files +# to their sources. + cfile) +test('inctest', e) + +# Test if we can also pass files() as input +configure_file(input : files('config.h.in'), + output : 'config2.h', + configuration : conf) + +# Now generate a header file with an external script. +genprog = import('python3').find_python() +scriptfile = '@0@/generator.py'.format(meson.current_source_dir()) +ifile = '@0@/dummy.dat'.format(meson.current_source_dir()) +ofile = '@0@/config2.h'.format(meson.current_build_dir()) + +check_file = find_program('check_file.py') +# Configure in source root with command and absolute paths +outf = configure_file(input : 'dummy.dat', + output : 'config2.h', + command : [genprog, scriptfile, ifile, ofile], + install_dir : 'share/appdir') +ret = run_command(check_file, outf, check: false) +if ret.returncode() != 0 + error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) +endif + +# Same again as before, but an input file should not be required in +# this case where we use a command/script to generate the output file. +genscript2b = '@0@/generator-without-input-file.py'.format(meson.current_source_dir()) +ofile2b = '@0@/config2b.h'.format(meson.current_build_dir()) +outf = configure_file( + output : 'config2b.h', + command : [genprog, genscript2b, ofile2b], + install_dir : 'share/appdir') +ret = run_command(check_file, outf, check: false) +if ret.returncode() != 0 + error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) +endif + +genscript2deps = '@0@/generator-deps.py'.format(meson.current_source_dir()) +ofile2deps = '@0@/config2deps.h'.format(meson.current_build_dir()) +outf = configure_file( + output : 'config2deps.h', + depfile : 'depfile.d', + command : [genprog, genscript2deps, ofile2deps, '@DEPFILE@']) +ret = run_command(check_file, outf, check: false) +if ret.returncode() != 0 + error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) +endif + +found_script = find_program('generator.py') +# More configure_file tests in here +subdir('subdir') + +test('inctest2', executable('prog2', 'prog2.c')) + +# Generate a conf file without an input file. + +dump = configuration_data() +dump.set_quoted('SHOULD_BE_STRING', 'string', description : 'A string') +dump.set_quoted('SHOULD_BE_STRING2', 'A "B" C') +dump.set_quoted('SHOULD_BE_STRING3', 'A "" C') +dump.set_quoted('SHOULD_BE_STRING4', 'A " C') +dump.set('SHOULD_BE_RETURN', 'return') +dump.set('SHOULD_BE_DEFINED', true) +dump.set('SHOULD_BE_UNDEFINED', false) +dump.set('SHOULD_BE_ONE', 1) +dump.set('SHOULD_BE_ZERO', 0, description : 'Absolutely zero') +dump.set('SHOULD_BE_QUOTED_ONE', '"1"') + +dump.set_quoted('INTEGER_AS_STRING', '12') +if dump.get_unquoted('INTEGER_AS_STRING').to_int() == 12 + dump.set('SHOULD_BE_UNQUOTED_STRING', dump.get_unquoted('SHOULD_BE_STRING')) +endif + +configure_file(output : 'config3.h', + configuration : dump) + +test('Configless.', executable('dumpprog', 'dumpprog.c')) + + +# Config file generation in a loop with @BASENAME@ substitution +dump = configuration_data() +dump.set('ZERO', 0) +config_templates = files(['config4a.h.in', 'config4b.h.in']) +foreach config_template : config_templates + configure_file(input : config_template, output : '@BASENAME@', configuration : dump) +endforeach + +test('Substituted', executable('prog4', 'prog4.c')) + +# Test `capture` keyword + +basename_py = find_program('basename.py') +file_contains_py = find_program('file_contains.py') +test_string = 'hello world' +test_input_file = join_paths(meson.current_build_dir(), test_string) +run_command(find_program('touch.py'), test_input_file, check: true) +configs = [ + # no input + configure_file(command: [ basename_py, test_string ], capture: true, output: 'capture test 1'), + # with input + configure_file(input: test_input_file, command: [ basename_py, '@INPUT@' ], capture: true, output: 'capture test 2'), +] +foreach c : configs + test('@0@'.format(c), file_contains_py, args: [ c, test_string ]) +endforeach + +# Test variable is substituted only once +conf5 = configuration_data() +conf5.set('var', '@var2@') +conf5.set('var2', 'error') +configure_file( + input : 'config5.h.in', + output : '@BASENAME@', + configuration : conf5) +test('test5', executable('prog5', 'prog5.c')) + +# Test escaping +conf6 = configuration_data() +conf6.set('var1', 'foo') +conf6.set('var2', 'bar') +configure_file( + input : 'config6.h.in', + output : '@BASENAME@', + configuration : conf6) +test('test6', executable('prog6', 'prog6.c')) + +# test empty install dir string +cfile = configure_file(input : 'config.h.in', + output : 'do_not_get_installed.h', + install_dir : '', + configuration : conf) + +# test install_dir : false (deprecated) +cfile = configure_file(input : 'config.h.in', + output : 'do_not_get_installed_please.h', + install_dir : false, + configuration : conf) + +# test intsall_dir with install: false +cfile = configure_file(input : 'config.h.in', + output : 'do_not_get_installed_in_install_dir.h', + install : false, + install_dir : 'share/appdir', + configuration : conf) + +# Test escaping with cmake format +conf7 = configuration_data() +conf7.set('var1', 'foo') +conf7.set('var2', 'bar') +configure_file( + input : 'config7.h.in', + output : '@BASENAME@', + format : 'cmake', + configuration : conf7) +test('test7', executable('prog7', 'prog7.c')) + +# Test copying of an empty configuration data object +inf = 'invalid-utf8.bin.in' +outf = configure_file(input : inf, + output : 'invalid-utf8.bin', + copy: true) +ret = run_command(check_file, inf, outf, check: false) +if ret.returncode() != 0 + error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) +endif +# Now the same, but using a File object as an argument. +inf2 = files('invalid-utf8.bin.in')[0] +outf = configure_file(input : inf2, + output : 'invalid-utf8.bin', + copy: true) +ret = run_command(check_file, inf2, outf, check: false) +if ret.returncode() != 0 + error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) +endif + +# Test copy of a binary file +outf = configure_file(input : inf, + output : 'somebinary.bin', + copy : true) +ret = run_command(check_file, inf, outf, check: false) +if ret.returncode() != 0 + error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) +endif + +# Test the fs replacement +# Test copying of an empty configuration data object +inf = 'invalid-utf8.bin.in' +outf = fs.copyfile(inf, 'invalid-utf8-1.bin', + install: true, + install_dir: get_option('datadir') / meson.project_name(), + install_tag: 'copyfile', +) +test('fs.copyfile string', check_file, args: [files(inf), outf]) + +# Test with default outname of string +outf = fs.copyfile(inf) +test('fs.copyfile default name', check_file, args: [files(inf), outf]) + +# Now the same, but using a File object as an argument. +inf2 = files('invalid-utf8.bin.in')[0] +outf = fs.copyfile(inf2, 'invalid-utf8-2.bin') +test('fs.copyfile file', check_file, args: [inf2, outf]) + +# Test non isolatin1 encoded input file which fails to decode with utf-8 +conf8 = configuration_data() +conf8.set('var', 'foo') +configure_file( + input : 'config8.h.in', + output : '@BASENAME@', + encoding : 'koi8-r', + configuration : conf8) + +# Test that passing an empty configuration_data() object to a file with +# #mesondefine substitutions does not print the warning. +configure_file( + input: 'nosubst-nocopy1.txt.in', + output: 'nosubst-nocopy1.txt', + configuration : configuration_data()) + +# test that passing an empty configuration_data() object to a file with +# @foo@ substitutions does not print the warning. +configure_file( + input: 'nosubst-nocopy2.txt.in', + output: 'nosubst-nocopy2.txt', + configuration : configuration_data()) + +# test that passing a configured file object to test() works, and that passing +# an empty configuration_data() object to a file that leads to no substitutions +# prints a warning (see unit tests) +test_file = configure_file( + input: 'test.py.in', + output: 'test.py', + configuration: configuration_data()) + +# Test that overwriting an existing file creates a warning. +configure_file( + input: 'test.py.in', + output: 'double_output.txt', + configuration: conf) +configure_file( + input: 'test.py.in', + output: 'double_output.txt', + configuration: conf) + +# Test that the same file name in a different subdir will not create a warning +configure_file( + input: 'test.py.in', + output: 'no_write_conflict.txt', + configuration: conf) + +# Test that @BASENAME@ is substituted before checking and does not create a warning. +configure_file( + input: 'differentafterbasename1.in', + output: '@BASENAME@', + configuration: conf +) +configure_file( + input: 'differentafterbasename2.in', + output: '@BASENAME@', + configuration: conf +) + +# Test that @BASENAME@ is substituted before checking and does create a warning on conflict. +configure_file( + input: 'sameafterbasename.in', + output: '@BASENAME@', + configuration: conf +) +configure_file( + input: 'sameafterbasename.in2', + output: '@BASENAME@', + configuration: conf +) + +test('configure-file', test_file) + +# Dictionaries + +cdata = configuration_data({ + 'A_STRING' : '"foo"', + 'A_INT' : 42, + 'A_DEFINED' : true, + 'A_UNDEFINED' : false, +}) + +configure_file(output : 'config9a.h', + configuration : cdata, +) + +configure_file(output : 'config9b.h', + configuration : { + 'B_STRING' : '"foo"', + 'B_INT' : 42, + 'B_DEFINED' : true, + 'B_UNDEFINED' : false, + } +) + +test('test9', executable('prog9', 'prog9.c')) + +check_inputs = find_program('check_inputs.py') +configure_file(output : 'check_inputs.txt', + input : ['prog.c', files('prog2.c', 'prog4.c')], + command : [check_inputs, '@OUTPUT@', '@INPUT0@', '@INPUT@', files('prog5.c')] +) diff --git a/test cases/common/14 configure file/nosubst-nocopy1.txt.in b/test cases/common/14 configure file/nosubst-nocopy1.txt.in new file mode 100644 index 0000000..6e893a1 --- /dev/null +++ b/test cases/common/14 configure file/nosubst-nocopy1.txt.in @@ -0,0 +1 @@ +#mesondefine FOO_BAR diff --git a/test cases/common/14 configure file/nosubst-nocopy2.txt.in b/test cases/common/14 configure file/nosubst-nocopy2.txt.in new file mode 100644 index 0000000..a6a7cca --- /dev/null +++ b/test cases/common/14 configure file/nosubst-nocopy2.txt.in @@ -0,0 +1 @@ +@FOO_BAR@ diff --git a/test cases/common/14 configure file/prog.c b/test cases/common/14 configure file/prog.c new file mode 100644 index 0000000..85e66b9 --- /dev/null +++ b/test cases/common/14 configure file/prog.c @@ -0,0 +1,17 @@ +#include +/* config.h must not be in quotes: + * https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html + */ +#include + +#ifdef SHOULD_BE_UNDEF +#error "FAIL!" +#endif + +int main(void) { +#ifndef BE_TRUE + return 1; +#else + return strcmp(MESSAGE, "mystring"); +#endif +} diff --git a/test cases/common/14 configure file/prog2.c b/test cases/common/14 configure file/prog2.c new file mode 100644 index 0000000..8b90bfb --- /dev/null +++ b/test cases/common/14 configure file/prog2.c @@ -0,0 +1,5 @@ +#include + +int main(void) { + return ZERO_RESULT; +} diff --git a/test cases/common/14 configure file/prog4.c b/test cases/common/14 configure file/prog4.c new file mode 100644 index 0000000..1e32a31 --- /dev/null +++ b/test cases/common/14 configure file/prog4.c @@ -0,0 +1,6 @@ +#include +#include + +int main(void) { + return RESULTA + RESULTB; +} diff --git a/test cases/common/14 configure file/prog5.c b/test cases/common/14 configure file/prog5.c new file mode 100644 index 0000000..1a8f785 --- /dev/null +++ b/test cases/common/14 configure file/prog5.c @@ -0,0 +1,6 @@ +#include +#include + +int main(void) { + return strcmp(MESSAGE, "@var2@"); +} diff --git a/test cases/common/14 configure file/prog6.c b/test cases/common/14 configure file/prog6.c new file mode 100644 index 0000000..57f5586 --- /dev/null +++ b/test cases/common/14 configure file/prog6.c @@ -0,0 +1,11 @@ +#include +#include + +int main(void) { + return strcmp(MESSAGE1, "foo") + || strcmp(MESSAGE2, "@var1@") + || strcmp(MESSAGE3, "\\foo") + || strcmp(MESSAGE4, "\\@var1@") + || strcmp(MESSAGE5, "@var1bar") + || strcmp(MESSAGE6, "\\ @ @ \\@ \\@"); +} diff --git a/test cases/common/14 configure file/prog7.c b/test cases/common/14 configure file/prog7.c new file mode 100644 index 0000000..802bc46 --- /dev/null +++ b/test cases/common/14 configure file/prog7.c @@ -0,0 +1,10 @@ +#include +#include + +int main(void) { + return strcmp(MESSAGE1, "foo") + || strcmp(MESSAGE2, "${var1}") + || strcmp(MESSAGE3, "\\foo") + || strcmp(MESSAGE4, "\\${var1}") + || strcmp(MESSAGE5, "\\ ${ ${ \\${ \\${"); +} diff --git a/test cases/common/14 configure file/prog9.c b/test cases/common/14 configure file/prog9.c new file mode 100644 index 0000000..3f77601 --- /dev/null +++ b/test cases/common/14 configure file/prog9.c @@ -0,0 +1,18 @@ +#include +#include +#include + +#if defined(A_UNDEFINED) || defined(B_UNDEFINED) +#error "Should not be defined" +#endif + +#if !defined(A_DEFINED) || !defined(B_DEFINED) +#error "Should be defined" +#endif + +int main(void) { + return strcmp(A_STRING, "foo") + || strcmp(B_STRING, "foo") + || A_INT != 42 + || B_INT != 42; +} diff --git a/test cases/common/14 configure file/sameafterbasename.in b/test cases/common/14 configure file/sameafterbasename.in new file mode 100644 index 0000000..e69de29 diff --git a/test cases/common/14 configure file/sameafterbasename.in2 b/test cases/common/14 configure file/sameafterbasename.in2 new file mode 100644 index 0000000..e69de29 diff --git a/test cases/common/14 configure file/subdir/meson.build b/test cases/common/14 configure file/subdir/meson.build new file mode 100644 index 0000000..98b672c --- /dev/null +++ b/test cases/common/14 configure file/subdir/meson.build @@ -0,0 +1,38 @@ +# Configure in subdir with absolute paths for input and relative for output +configure_file(input : '../dummy.dat', + output : 'config2-1.h', + command : [genprog, scriptfile, ifile, 'config2-1.h'], + install_dir : 'share/appdireh') +run_command(check_file, join_paths(meson.current_build_dir(), 'config2-1.h'), check: true) + +# Configure in subdir with files() for input and relative for output +configure_file(input : '../dummy.dat', + output : 'config2-2.h', + command : [genprog, scriptfile, files('../dummy.dat'), 'config2-2.h'], + install_dir : 'share/appdirok') +run_command(check_file, join_paths(meson.current_build_dir(), 'config2-2.h'), check: true) + +# Configure in subdir with string templates for input and output +configure_file(input : '../dummy.dat', + output : 'config2-3.h', + command : [found_script, '@INPUT@', '@OUTPUT@']) +run_command(check_file, join_paths(meson.current_build_dir(), 'config2-3.h'), check: true) + +# Test that overwriting an existing file creates a warning. +configure_file( + input: '../test.py.in', + output: 'double_output2.txt', + configuration: conf +) +configure_file( + input: '../test.py.in', + output: 'double_output2.txt', + configuration: conf +) + +# Test that the same file name in a different subdir will not create a warning +configure_file( + input: '../test.py.in', + output: 'no_write_conflict.txt', + configuration: conf +) diff --git a/test cases/common/14 configure file/test.json b/test cases/common/14 configure file/test.json new file mode 100644 index 0000000..5a6ccd5 --- /dev/null +++ b/test cases/common/14 configure file/test.json @@ -0,0 +1,9 @@ +{ + "installed": [ + {"type": "file", "file": "usr/share/appdir/config2.h"}, + {"type": "file", "file": "usr/share/appdir/config2b.h"}, + {"type": "file", "file": "usr/share/appdireh/config2-1.h"}, + {"type": "file", "file": "usr/share/appdirok/config2-2.h"}, + {"type": "file", "file": "usr/share/configure file test/invalid-utf8-1.bin"} + ] +} diff --git a/test cases/common/14 configure file/test.py.in b/test cases/common/14 configure file/test.py.in new file mode 100644 index 0000000..15a61f5 --- /dev/null +++ b/test cases/common/14 configure file/test.py.in @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 + +import sys +sys.exit(0) diff --git a/test cases/common/14 configure file/touch.py b/test cases/common/14 configure file/touch.py new file mode 100644 index 0000000..b48f481 --- /dev/null +++ b/test cases/common/14 configure file/touch.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import sys +import argparse +from pathlib import Path + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('files', nargs='*', type=str) + args = parser.parse_args() + + for filepath in args.files: + Path(filepath).touch() + +if __name__ == '__main__': + sys.exit(main()) -- cgit v1.2.3