cmake: trace: add support for some target_* functions

pull/5638/head
Daniel Mensinger 5 years ago
parent 1a4fae28ad
commit 50bbeaf859
No known key found for this signature in database
GPG Key ID: 54DD94C131E277D4
  1. 68
      mesonbuild/cmake/traceparser.py

@ -81,7 +81,11 @@ class CMakeTraceParser:
'add_custom_command': self._cmake_add_custom_command,
'add_custom_target': self._cmake_add_custom_target,
'set_property': self._cmake_set_property,
'set_target_properties': self._cmake_set_target_properties
'set_target_properties': self._cmake_set_target_properties,
'target_compile_definitions': self._cmake_target_compile_definitions,
'target_compile_options': self._cmake_target_compile_options,
'target_include_directories': self._cmake_target_include_directories,
'target_link_options': self._cmake_target_link_options,
}
# Primary pass -- parse everything
@ -380,6 +384,66 @@ class CMakeTraceParser:
self.targets[i].properies[name] = value
def _cmake_target_compile_definitions(self, tline: CMakeTraceLine) -> None:
# DOC: https://cmake.org/cmake/help/latest/command/target_compile_definitions.html
self._parse_common_target_options('target_compile_definitions', 'COMPILE_DEFINITIONS', 'INTERFACE_COMPILE_DEFINITIONS', tline)
def _cmake_target_compile_options(self, tline: CMakeTraceLine) -> None:
# DOC: https://cmake.org/cmake/help/latest/command/target_compile_options.html
self._parse_common_target_options('target_compile_options', 'COMPILE_OPTIONS', 'INTERFACE_COMPILE_OPTIONS', tline)
def _cmake_target_include_directories(self, tline: CMakeTraceLine) -> None:
# DOC: https://cmake.org/cmake/help/latest/command/target_include_directories.html
self._parse_common_target_options('target_include_directories', 'INCLUDE_DIRECTORIES', 'INTERFACE_INCLUDE_DIRECTORIES', tline, ignore=['SYSTEM', 'BEFORE'], paths=True)
def _cmake_target_link_options(self, tline: CMakeTraceLine) -> None:
# DOC: https://cmake.org/cmake/help/latest/command/target_link_options.html
self._parse_common_target_options('target_link_options', 'LINK_OPTIONS', 'INTERFACE_LINK_OPTIONS', tline)
def _parse_common_target_options(self, func: str, private_prop: str, interface_prop: str, tline: CMakeTraceLine, ignore: Optional[List[str]] = None, paths: bool = False):
if ignore is None:
ignore = ['BEFORE']
args = list(tline.args)
if len(args) < 1:
return self._gen_exception(func, 'requires at least one argument', tline)
target = args[0]
if target not in self.targets:
return self._gen_exception(func, 'TARGET {} not found'.format(target), tline)
interface = []
private = []
mode = 'PUBLIC'
for i in args[1:]:
if i in ignore:
continue
if i in ['INTERFACE', 'PUBLIC', 'PRIVATE']:
mode = i
continue
if mode in ['INTERFACE', 'PUBLIC']:
interface += [i]
if mode in ['PUBLIC', 'PRIVATE']:
private += [i]
if paths:
interface = self._guess_files(interface)
private = self._guess_files(private)
interface = [x for x in interface if x]
private = [x for x in private if x]
for i in [(private_prop, private), (interface_prop, interface)]:
if not i[0] in self.targets[target].properies:
self.targets[target].properies[i[0]] = []
self.targets[target].properies[i[0]] += i[1]
def _lex_trace(self, trace):
# The trace format is: '<file>(<line>): <func>(<args -- can contain \n> )\n'
reg_tline = re.compile(r'\s*(.*\.(cmake|txt))\(([0-9]+)\):\s*(\w+)\(([\s\S]*?) ?\)\s*\n', re.MULTILINE)
@ -428,7 +492,7 @@ class CMakeTraceParser:
# Abort concatination if curr_str no longer matches the regex
fixed_list += [curr_str]
curr_str = i
elif reg_end.match(i):
elif reg_end.match(i) or os.path.exists('{} {}'.format(curr_str, i)):
# File detected
curr_str = '{} {}'.format(curr_str, i)
fixed_list += [curr_str]

Loading…
Cancel
Save