cmake: Handle CMake system include dirs (closes #6079)

pull/6199/head
Daniel Mensinger 6 years ago
parent 1f751dacba
commit 3e1435a968
No known key found for this signature in database
GPG Key ID: 54DD94C131E277D4
  1. 5
      mesonbuild/cmake/common.py
  2. 4
      mesonbuild/cmake/fileapi.py
  3. 15
      mesonbuild/cmake/interpreter.py
  4. 2
      test cases/cmake/13 system includes/meson.build

@ -73,9 +73,10 @@ class CMakeFileGroup:
tmp = []
for i in self.includes:
if isinstance(i, dict) and 'path' in i:
tmp += [i['path']]
elif isinstance(i, str):
i['isSystem'] = i.get('isSystem', False)
tmp += [i]
elif isinstance(i, str):
tmp += [{'path': i, 'isSystem': False}]
self.includes = tmp
def log(self) -> None:

@ -186,9 +186,7 @@ class CMakeFileAPI:
'language': cg.get('language', 'C'),
'isGenerated': None, # Set later, flag is stored per source file
'sources': [],
# TODO handle isSystem
'includePath': [x.get('path', '') for x in cg.get('includes', [])],
'includePath': cg.get('includes', []),
}
normal_src, generated_src, src_idx = parse_sources(cg, tgt)

@ -157,6 +157,7 @@ class ConverterTarget:
self.sources = []
self.generated = []
self.includes = []
self.sys_includes = []
self.link_with = []
self.object_libs = []
self.compile_opts = {}
@ -180,7 +181,8 @@ class ConverterTarget:
self.compile_opts[lang] += [x for x in args if x not in self.compile_opts[lang]]
# Handle include directories
self.includes += [x for x in i.includes if x not in self.includes]
self.includes += [x['path'] for x in i.includes if x not in self.includes and not x['isSystem']]
self.sys_includes += [x['path'] for x in i.includes if x not in self.sys_includes and x['isSystem']]
# Add sources to the right array
if i.is_generated:
@ -295,6 +297,7 @@ class ConverterTarget:
build_dir_rel = os.path.relpath(self.build_dir, os.path.join(self.env.get_build_dir(), subdir))
self.includes = list(set([rel_path(x, True, False) for x in set(self.includes)] + [build_dir_rel]))
self.sys_includes = list(set([rel_path(x, True, False) for x in set(self.sys_includes)]))
self.sources = [rel_path(x, False, False) for x in self.sources]
self.generated = [rel_path(x, False, True) for x in self.generated]
@ -303,6 +306,7 @@ class ConverterTarget:
# Remove delete entries
self.includes = [x for x in self.includes if x is not None]
self.sys_includes = [x for x in self.sys_includes if x is not None]
self.sources = [x for x in self.sources if x is not None]
self.generated = [x for x in self.generated if x is not None]
@ -359,6 +363,7 @@ class ConverterTarget:
mlog.log(' -- link_flags: ', mlog.bold(str(self.link_flags)))
mlog.log(' -- languages: ', mlog.bold(str(self.languages)))
mlog.log(' -- includes: ', mlog.bold(str(self.includes)))
mlog.log(' -- sys_includes: ', mlog.bold(str(self.sys_includes)))
mlog.log(' -- sources: ', mlog.bold(str(self.sources)))
mlog.log(' -- generated: ', mlog.bold(str(self.generated)))
mlog.log(' -- pie: ', mlog.bold('true' if self.pie else 'false'))
@ -845,6 +850,8 @@ class CMakeInterpreter:
base_name = str(tgt.name)
base_name = base_name.replace('-', '_')
inc_var = '{}_inc'.format(base_name)
dir_var = '{}_dir'.format(base_name)
sys_var = '{}_sys'.format(base_name)
src_var = '{}_src'.format(base_name)
dep_var = '{}_dep'.format(base_name)
tgt_var = base_name
@ -879,8 +886,10 @@ class CMakeInterpreter:
}
# Generate the function nodes
inc_node = assign(inc_var, function('include_directories', tgt.includes))
node_list = [inc_node]
dir_node = assign(dir_var, function('include_directories', tgt.includes))
sys_node = assign(sys_var, function('include_directories', tgt.sys_includes, {'is_system': True}))
inc_node = assign(inc_var, array([id_node(dir_var), id_node(sys_var)]))
node_list = [dir_node, sys_node, inc_node]
if tgt_func == 'header_only':
del dep_kwargs['link_with']
dep_node = assign(dep_var, function('declare_dependency', kwargs=dep_kwargs))

@ -2,7 +2,7 @@ project(
'meson_cmake_system_include_bug', ['c', 'cpp'],
default_options: [
'warning_level=3',
#'werror=true', # TODO implement system includes
'werror=true',
],
)

Loading…
Cancel
Save