Do not add custom target dir automatically when implicit false.

pull/8604/head
Jussi Pakkanen 4 years ago
parent 448b11cb7f
commit e80ff985fb
  1. 17
      docs/markdown/snippets/customimplicit.md
  2. 4
      mesonbuild/backend/ninjabackend.py
  3. 17
      run_unittests.py
  4. 7
      test cases/unit/94 custominc/easytogrepfor/genh.py
  5. 3
      test cases/unit/94 custominc/easytogrepfor/meson.build
  6. 5
      test cases/unit/94 custominc/helper.c
  7. 9
      test cases/unit/94 custominc/meson.build
  8. 9
      test cases/unit/94 custominc/prog.c
  9. 10
      test cases/unit/94 custominc/prog2.c

@ -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`.

@ -2377,9 +2377,7 @@ 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.
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.

@ -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):
'''

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

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

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

@ -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)

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

@ -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;
}
Loading…
Cancel
Save