Do not add custom target dir automatically when implicit false.

This commit is contained in:
Jussi Pakkanen 2021-03-24 17:18:03 +02:00
parent 448b11cb7f
commit e80ff985fb
9 changed files with 79 additions and 4 deletions

View File

@ -0,0 +1,17 @@
## Do not add custom target dir to header path if `implicit_include_directories` is `false`
If you do the following:
```meson
# in some subdirectory
gen_h = custom_target(...)
# in some other directory
executable('foo', 'foo.c', gen_h)
```
then the output directory of the custom target is automatically added
to the header search path. This is convenient, but sometimes it can
lead to problems. Starting with this version, the directory will no
longer be put in the search path if the target has
`implicit_include_directories: false`. In these cases you need to set
up the path manually with `include_directories`.

View File

@ -2377,10 +2377,8 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
commands += self.generate_basic_compiler_args(target, compiler, no_warn_args)
# Add custom target dirs as includes automatically, but before
# target-specific include directories.
# XXX: Not sure if anyone actually uses this? It can cause problems in
# situations which increase the likelihood for a header name collision,
# such as in subprojects.
commands += self.get_custom_target_dir_include_args(target, compiler)
if target.implicit_include_directories:
commands += self.get_custom_target_dir_include_args(target, compiler)
# Add include dirs from the `include_directories:` kwarg on the target
# and from `include_directories:` of internal deps of the target.
#

View File

@ -5616,6 +5616,23 @@ class AllPlatformTests(BasePlatformTests):
self.assertEqual(0, output.count('File reformatted:'))
self.build('clang-format-check')
def test_custom_target_implicit_include(self):
testdir = os.path.join(self.unit_test_dir, '94 custominc')
self.init(testdir)
self.build()
compdb = self.get_compdb()
matches = 0
for c in compdb:
if 'prog.c' in c['file']:
self.assertNotIn('easytogrepfor', c['command'])
matches += 1
self.assertEqual(matches, 1)
matches = 0
for c in compdb:
if 'prog2.c' in c['file']:
self.assertIn('easytogrepfor', c['command'])
matches += 1
self.assertEqual(matches, 1)
class FailureTests(BasePlatformTests):
'''

View File

@ -0,0 +1,7 @@
#!/usr/bin/env python3
import sys
f = open(sys.argv[1], 'w')
f.write('#define RETURN_VALUE 0')
f.close()

View File

@ -0,0 +1,3 @@
genh = custom_target('header',
output: 'generated.h',
command: [find_program('genh.py'), '@OUTPUT@'])

View File

@ -0,0 +1,5 @@
#include<generated.h>
int func(void) {
return RETURN_VALUE;
}

View File

@ -0,0 +1,9 @@
project('implicit custom dirs', 'c')
subdir('easytogrepfor')
l = static_library('helper', 'helper.c', genh)
d = declare_dependency(link_with: l, sources: genh)
executable('prog', 'prog.c', dependencies: d, implicit_include_directories: false)
executable('prog2', 'prog2.c', dependencies: d)

View File

@ -0,0 +1,9 @@
#include<stdlib.h>
int func(void);
int main(int argc, char **argv) {
(void)argc;
(void)(argv);
return func();
}

View File

@ -0,0 +1,10 @@
#include<stdlib.h>
#include<generated.h>
int func(void);
int main(int argc, char **argv) {
(void)argc;
(void)(argv);
return func() + RETURN_VALUE;
}