diff options
Diffstat (limited to 'meson/test cases/common/13 pch')
29 files changed, 227 insertions, 0 deletions
diff --git a/meson/test cases/common/13 pch/c/meson.build b/meson/test cases/common/13 pch/c/meson.build new file mode 100644 index 000000000..6fba15bf4 --- /dev/null +++ b/meson/test cases/common/13 pch/c/meson.build @@ -0,0 +1,14 @@ +cc = meson.get_compiler('c') +cc_id = cc.get_id() + +if cc_id == 'lcc' + error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') +endif + +# PGI compiler only supports PCH for C++ +if cc_id == 'pgi' + subdir_done() +endif + +exe = executable('prog', 'prog.c', +c_pch : 'pch/prog.h') diff --git a/meson/test cases/common/13 pch/c/pch/prog.h b/meson/test cases/common/13 pch/c/pch/prog.h new file mode 100644 index 000000000..c89890a77 --- /dev/null +++ b/meson/test cases/common/13 pch/c/pch/prog.h @@ -0,0 +1,6 @@ +#ifndef PROG_H +// Header guards for PCH confuse msvc in some situations. +// Using them here makes sure we handle this correctly. +#define PROG_H +#include<stdio.h> +#endif diff --git a/meson/test cases/common/13 pch/c/prog.c b/meson/test cases/common/13 pch/c/prog.c new file mode 100644 index 000000000..124bba063 --- /dev/null +++ b/meson/test cases/common/13 pch/c/prog.c @@ -0,0 +1,10 @@ +// No includes here, they need to come from the PCH + +void func(void) { + fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); +} + +int main(void) { + return 0; +} + diff --git a/meson/test cases/common/13 pch/cpp/meson.build b/meson/test cases/common/13 pch/cpp/meson.build new file mode 100644 index 000000000..b01cd58f3 --- /dev/null +++ b/meson/test cases/common/13 pch/cpp/meson.build @@ -0,0 +1 @@ +exe = executable('prog', 'prog.cc', cpp_pch : 'pch/prog.hh') diff --git a/meson/test cases/common/13 pch/cpp/pch/prog.hh b/meson/test cases/common/13 pch/cpp/pch/prog.hh new file mode 100644 index 000000000..751cc4a71 --- /dev/null +++ b/meson/test cases/common/13 pch/cpp/pch/prog.hh @@ -0,0 +1 @@ +#include<iostream> diff --git a/meson/test cases/common/13 pch/cpp/prog.cc b/meson/test cases/common/13 pch/cpp/prog.cc new file mode 100644 index 000000000..0ba8519dc --- /dev/null +++ b/meson/test cases/common/13 pch/cpp/prog.cc @@ -0,0 +1,11 @@ +// Note: if using PGI compilers, you will need to add #include "prog.hh" +// even though you're using precompiled headers. +void func(void) { + std::cout << "This is a function that fails to compile if iostream is not included." + << std::endl; +} + +int main(void) { + func(); + return 0; +} diff --git a/meson/test cases/common/13 pch/generated/gen_custom.py b/meson/test cases/common/13 pch/generated/gen_custom.py new file mode 100644 index 000000000..650e03c2b --- /dev/null +++ b/meson/test cases/common/13 pch/generated/gen_custom.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 +import sys + +with open(sys.argv[1], 'w') as f: + f.write("#define FOO 0") diff --git a/meson/test cases/common/13 pch/generated/gen_generator.py b/meson/test cases/common/13 pch/generated/gen_generator.py new file mode 100644 index 000000000..a245e7aef --- /dev/null +++ b/meson/test cases/common/13 pch/generated/gen_generator.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +import sys + +with open(sys.argv[1]) as f: + content = f.read() +with open(sys.argv[2], 'w') as f: + f.write(content) diff --git a/meson/test cases/common/13 pch/generated/generated_generator.in b/meson/test cases/common/13 pch/generated/generated_generator.in new file mode 100644 index 000000000..1a00ebd21 --- /dev/null +++ b/meson/test cases/common/13 pch/generated/generated_generator.in @@ -0,0 +1 @@ +#define BAR 0 diff --git a/meson/test cases/common/13 pch/generated/meson.build b/meson/test cases/common/13 pch/generated/meson.build new file mode 100644 index 000000000..ba06bcea8 --- /dev/null +++ b/meson/test cases/common/13 pch/generated/meson.build @@ -0,0 +1,22 @@ +cc = meson.get_compiler('c') +cc_id = cc.get_id() + +if cc_id == 'lcc' + error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') +endif + +# PGI compiler only supports PCH for C++ +if cc_id == 'pgi' + subdir_done() +endif + +generated_customTarget = custom_target('makeheader', + output: 'generated_customTarget.h', + command : [find_program('gen_custom.py'), '@OUTPUT0@']) + +generated_generator = generator(find_program('gen_generator.py'), + output: '@BASENAME@.h', + arguments: ['@INPUT@', '@OUTPUT@']) + +exe = executable('prog', 'prog.c', generated_customTarget, generated_generator.process('generated_generator.in'), + c_pch: 'pch/prog.h') diff --git a/meson/test cases/common/13 pch/generated/pch/prog.h b/meson/test cases/common/13 pch/generated/pch/prog.h new file mode 100644 index 000000000..15fec38ce --- /dev/null +++ b/meson/test cases/common/13 pch/generated/pch/prog.h @@ -0,0 +1,2 @@ +#include "generated_customTarget.h" +#include "generated_generator.h" diff --git a/meson/test cases/common/13 pch/generated/prog.c b/meson/test cases/common/13 pch/generated/prog.c new file mode 100644 index 000000000..6765ac102 --- /dev/null +++ b/meson/test cases/common/13 pch/generated/prog.c @@ -0,0 +1,6 @@ +// No includes here, they need to come from the PCH + +int main(void) { + return FOO + BAR; +} + diff --git a/meson/test cases/common/13 pch/meson.build b/meson/test cases/common/13 pch/meson.build new file mode 100644 index 000000000..5ca9ab1d8 --- /dev/null +++ b/meson/test cases/common/13 pch/meson.build @@ -0,0 +1,22 @@ +project('pch test', 'c', 'cpp', + meson_version: '>= 0.46.0') + +cc = meson.get_compiler('c') +cc_id = cc.get_id() + +if cc_id == 'pgi' + error('MESON_SKIP_TEST: PGI compiler does support PCH, however, PGI cannot tolerate spaces in the --pch_dir path and Meson run_project_tests.py uses spaces in temporary build path names. If this test is run individually with no spaces in build path, it will pass.') +endif + +subdir('c') +subdir('cpp') +subdir('generated') +subdir('userDefined') +subdir('withIncludeDirectories') +subdir('withIncludeFile') + +if meson.backend() == 'xcode' + warning('Xcode backend only supports one precompiled header per target. Skipping "mixed" which has various precompiled headers.') +else + subdir('mixed') +endif diff --git a/meson/test cases/common/13 pch/mixed/func.c b/meson/test cases/common/13 pch/mixed/func.c new file mode 100644 index 000000000..620eca133 --- /dev/null +++ b/meson/test cases/common/13 pch/mixed/func.c @@ -0,0 +1,7 @@ +void tmp_func(void) { + fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); +} + +int cfunc(void) { + return 0; +} diff --git a/meson/test cases/common/13 pch/mixed/main.cc b/meson/test cases/common/13 pch/mixed/main.cc new file mode 100644 index 000000000..432120329 --- /dev/null +++ b/meson/test cases/common/13 pch/mixed/main.cc @@ -0,0 +1,10 @@ +extern "C" int cfunc(); + +void func(void) { + std::cout << "This is a function that fails to compile if iostream is not included." + << std::endl; +} + +int main(void) { + return cfunc(); +} diff --git a/meson/test cases/common/13 pch/mixed/meson.build b/meson/test cases/common/13 pch/mixed/meson.build new file mode 100644 index 000000000..266e7a575 --- /dev/null +++ b/meson/test cases/common/13 pch/mixed/meson.build @@ -0,0 +1,14 @@ +cc = meson.get_compiler('c') +cc_id = cc.get_id() + +# PGI compiler only supports PCH for C++ +if cc_id == 'pgi' + subdir_done() +endif + +exe = executable( + 'prog', + files('main.cc', 'func.c'), + c_pch : ['pch/func.h'], + cpp_pch : ['pch/main.h'], +) diff --git a/meson/test cases/common/13 pch/mixed/pch/func.h b/meson/test cases/common/13 pch/mixed/pch/func.h new file mode 100644 index 000000000..354499acd --- /dev/null +++ b/meson/test cases/common/13 pch/mixed/pch/func.h @@ -0,0 +1 @@ +#include<stdio.h> diff --git a/meson/test cases/common/13 pch/mixed/pch/main.h b/meson/test cases/common/13 pch/mixed/pch/main.h new file mode 100644 index 000000000..751cc4a71 --- /dev/null +++ b/meson/test cases/common/13 pch/mixed/pch/main.h @@ -0,0 +1 @@ +#include<iostream> diff --git a/meson/test cases/common/13 pch/userDefined/meson.build b/meson/test cases/common/13 pch/userDefined/meson.build new file mode 100644 index 000000000..9b60572e6 --- /dev/null +++ b/meson/test cases/common/13 pch/userDefined/meson.build @@ -0,0 +1,10 @@ +cc = meson.get_compiler('c') +cc_id = cc.get_id() + +# User supplied PCH implementation should override the auto +# generated one. PCH implementations are only supported for +# msvc and generally should not be used at all. Support for +# them is only kept for backwards compatibility. +if cc_id == 'msvc' + exe = executable('prog', 'prog.c', c_pch : ['pch/pch.h', 'pch/pch.c']) +endif diff --git a/meson/test cases/common/13 pch/userDefined/pch/pch.c b/meson/test cases/common/13 pch/userDefined/pch/pch.c new file mode 100644 index 000000000..6a971404d --- /dev/null +++ b/meson/test cases/common/13 pch/userDefined/pch/pch.c @@ -0,0 +1,5 @@ +#include "pch.h" + +int foo(void) { + return 0; +} diff --git a/meson/test cases/common/13 pch/userDefined/pch/pch.h b/meson/test cases/common/13 pch/userDefined/pch/pch.h new file mode 100644 index 000000000..5d5f8f0c9 --- /dev/null +++ b/meson/test cases/common/13 pch/userDefined/pch/pch.h @@ -0,0 +1 @@ +int foo(); diff --git a/meson/test cases/common/13 pch/userDefined/prog.c b/meson/test cases/common/13 pch/userDefined/prog.c new file mode 100644 index 000000000..475131b35 --- /dev/null +++ b/meson/test cases/common/13 pch/userDefined/prog.c @@ -0,0 +1,8 @@ +// No includes here, they need to come from the PCH + +int main(void) { + // Method is implemented in pch.c. + // This makes sure that we can properly handle user defined + // pch implementation files and not only auto-generated ones. + return foo(); +} diff --git a/meson/test cases/common/13 pch/withIncludeDirectories/include/lib/lib.h b/meson/test cases/common/13 pch/withIncludeDirectories/include/lib/lib.h new file mode 100644 index 000000000..53c5fdf17 --- /dev/null +++ b/meson/test cases/common/13 pch/withIncludeDirectories/include/lib/lib.h @@ -0,0 +1 @@ +#include <stdio.h> diff --git a/meson/test cases/common/13 pch/withIncludeDirectories/meson.build b/meson/test cases/common/13 pch/withIncludeDirectories/meson.build new file mode 100644 index 000000000..95f7888d9 --- /dev/null +++ b/meson/test cases/common/13 pch/withIncludeDirectories/meson.build @@ -0,0 +1,15 @@ +cc = meson.get_compiler('c') +cc_id = cc.get_id() + +if cc_id == 'lcc' + error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') +endif + +# PGI compiler only supports PCH for C++ +if cc_id == 'pgi' + subdir_done() +endif + +exe = executable('prog', 'prog.c', + include_directories: 'include', + c_pch : 'pch/prog.h') diff --git a/meson/test cases/common/13 pch/withIncludeDirectories/pch/prog.h b/meson/test cases/common/13 pch/withIncludeDirectories/pch/prog.h new file mode 100644 index 000000000..383b2c513 --- /dev/null +++ b/meson/test cases/common/13 pch/withIncludeDirectories/pch/prog.h @@ -0,0 +1 @@ +#include<lib/lib.h> diff --git a/meson/test cases/common/13 pch/withIncludeDirectories/prog.c b/meson/test cases/common/13 pch/withIncludeDirectories/prog.c new file mode 100644 index 000000000..124bba063 --- /dev/null +++ b/meson/test cases/common/13 pch/withIncludeDirectories/prog.c @@ -0,0 +1,10 @@ +// No includes here, they need to come from the PCH + +void func(void) { + fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); +} + +int main(void) { + return 0; +} + diff --git a/meson/test cases/common/13 pch/withIncludeFile/meson.build b/meson/test cases/common/13 pch/withIncludeFile/meson.build new file mode 100644 index 000000000..4fd232251 --- /dev/null +++ b/meson/test cases/common/13 pch/withIncludeFile/meson.build @@ -0,0 +1,18 @@ +cc = meson.get_compiler('c') +cc_id = cc.get_id() + +if cc_id == 'lcc' + error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') +endif + +if cc.get_argument_syntax() == 'gcc' + c_args = ['-include', 'locale.h'] +elif cc.get_argument_syntax() == 'msvc' + c_args = ['/FI' + 'locale.h'] +else + subdir_done() +endif + +exe = executable('prog', 'prog.c', +c_args: c_args, +c_pch : 'pch/prog.h') diff --git a/meson/test cases/common/13 pch/withIncludeFile/pch/prog.h b/meson/test cases/common/13 pch/withIncludeFile/pch/prog.h new file mode 100644 index 000000000..c89890a77 --- /dev/null +++ b/meson/test cases/common/13 pch/withIncludeFile/pch/prog.h @@ -0,0 +1,6 @@ +#ifndef PROG_H +// Header guards for PCH confuse msvc in some situations. +// Using them here makes sure we handle this correctly. +#define PROG_H +#include<stdio.h> +#endif diff --git a/meson/test cases/common/13 pch/withIncludeFile/prog.c b/meson/test cases/common/13 pch/withIncludeFile/prog.c new file mode 100644 index 000000000..7a9a93c6a --- /dev/null +++ b/meson/test cases/common/13 pch/withIncludeFile/prog.c @@ -0,0 +1,11 @@ +// No includes here, they need to come from the PCH or explicit inclusion + +void func(void) { + fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); + setlocale(LC_ALL, ""); /* This will fail if locale.h is not included */ +} + +int main(void) { + return 0; +} + |