5 from .util
import get_config, get_ignore_data, roscompile
7 SHOULD_ALPHABETIZE = [
'COMPONENTS',
'DEPENDENCIES',
'FILES',
'CATKIN_DEPENDS']
10 CATKIN_INSTALL_PYTHON_PRENAME =
'\n '
14 if len(dependencies) == 0:
16 if len(cmake.content_map[
'find_package']) == 0:
18 cmd.add_section(
'', [
'catkin'])
19 cmd.add_section(
'REQUIRED')
20 cmake.add_command(cmd)
22 for cmd
in cmake.content_map[
'find_package']:
23 tokens = cmd.get_tokens()
24 if tokens
and tokens[0] ==
'catkin' and cmd.get_section(
'REQUIRED'):
25 req_sec = cmd.get_section(
'REQUIRED')
26 section = cmd.get_section(
'COMPONENTS')
27 if section
is None and req_sec.values:
30 cmd.add_section(
'COMPONENTS', sorted(dependencies))
32 existing = cmake.resolve_variables(section.values)
33 needed_items = dependencies - set(existing)
35 section.add_values(needed_items)
38 cmake.section_check(dependencies,
'catkin_package',
'CATKIN_DEPENDS')
45 dependencies = package.get_dependencies_from_msgs()
46 dependencies.update(package.get_build_dependencies())
51 valid_targets = {search_target}
52 alt_target = cmake.resolve_variables(search_target)
53 if alt_target != search_target:
54 valid_targets.add(alt_target)
56 for cmd
in cmake.content_map[
'add_dependencies']:
57 target = cmd.first_token()
58 if target
in valid_targets:
60 resolved_target = cmake.resolve_variables(target)
61 if resolved_target
in valid_targets:
66 for gen
in package.get_all_generators():
67 if name == gen.base_name:
73 for rel_fn
in sources:
74 if rel_fn
not in package.source_code.sources:
76 src = package.source_code.sources[rel_fn]
77 for pkg, name
in src.search_lines_for_pattern(CPLUS):
78 if len(name) == 0
or name[-2:] !=
'.h':
80 name = name.replace(
'.h',
'')
81 if is_message(pkg, name)
or is_service(pkg, name):
85 if package.dynamic_reconfigs:
86 deps.add(package.name)
94 targets = package.cmake.get_target_build_rules()
95 for target, sources
in targets.items():
100 if package.name
in deps:
114 add_deps =
Command(
'add_dependencies')
117 if len(add_deps.sections) == 0:
118 add_deps.add_section(
'', [target])
119 add_deps.changed =
True
121 section = add_deps.sections[0]
122 if cat_depend
and '${catkin_EXPORTED_TARGETS}' not in section.values:
123 section.add(
'${catkin_EXPORTED_TARGETS}')
124 add_deps.changed =
True
126 tokens = [package.cmake.resolve_variables(s)
for s
in section.values]
127 key =
'${%s_EXPORTED_TARGETS}' % package.name
128 if key
not in tokens:
130 add_deps.changed =
True
133 package.cmake.add_command(add_deps)
137 prev_len = len(section.values)
138 section.values = [v
for v
in section.values
if pattern
not in v]
139 return prev_len != len(section.values)
144 if not package.cmake:
146 global_changed =
False
147 targets = package.cmake.get_target_build_rules()
148 for target
in targets:
150 if add_deps
is None or len(add_deps.sections) == 0:
153 section = add_deps.sections[0]
158 add_deps.changed =
True
159 global_changed =
True
166 if not package.cmake:
169 CATKIN =
'${catkin_LIBRARIES}'
170 targets = package.cmake.get_libraries() + package.cmake.get_executables()
171 for cmd
in package.cmake.content_map[
'target_link_libraries']:
172 tokens = cmd.get_tokens()
173 if tokens[0]
in targets:
174 if CATKIN
not in tokens:
175 print(
'\tAdding %s to target_link_libraries for %s' % (CATKIN, tokens[0]))
176 cmd.add_token(CATKIN)
177 targets.remove(tokens[0])
179 for target
in targets:
180 print(
'\tAdding target_link_libraries for %s' % target)
181 cmd =
Command(
'target_link_libraries')
182 cmd.add_section(
'', [target, CATKIN])
183 package.cmake.add_command(cmd)
188 if len(package.generators) == 0
or not package.cmake:
191 for gen_type, cmake_cmd
in [(
'msg',
'add_message_files'),
192 (
'srv',
'add_service_files'),
193 (
'action',
'add_action_files')]:
194 names = [gen.name
for gen
in package.generators[gen_type]]
195 package.cmake.section_check(names, cmake_cmd,
'FILES')
197 package.cmake.section_check([
'message_generation'],
'find_package',
'COMPONENTS')
198 package.cmake.section_check([
'message_runtime'],
'catkin_package',
'CATKIN_DEPENDS')
199 for cmd
in package.cmake.content_map[
'catkin_package']:
200 section = cmd.get_section(
'CATKIN_DEPENDS')
201 if 'message_generation' in section.values:
202 section.values.remove(
'message_generation')
205 msg_deps = package.get_dependencies_from_msgs()
207 package.cmake.section_check(msg_deps,
'generate_messages',
208 'DEPENDENCIES', zero_okay=
True)
210 package.cmake.section_check(msg_deps,
'generate_messages',
216 if not package.cmake
or not package.source_code.get_source_by_language(
'c++'):
220 if package.source_code.has_header_files():
221 package.cmake.section_check([
'include'],
'catkin_package',
'INCLUDE_DIRS')
222 package.cmake.section_check([
'include'],
'include_directories', alpha_order=
False)
225 if len(package.source_code.get_source_by_language(
'c++')) > 0:
226 package.cmake.section_check([
'${catkin_INCLUDE_DIRS}'],
'include_directories', alpha_order=
False)
229 if not has_includes
and 'include_directories' in package.cmake.content_map:
230 for cmd
in package.cmake.content_map[
'include_directories']:
231 package.cmake.remove_command(cmd)
236 if not package.cmake:
238 package.cmake.section_check(package.cmake.get_libraries(),
'catkin_package',
'LIBRARIES')
242 for content
in cmake.contents:
243 if content.__class__ == Command:
244 for section
in content.get_real_sections():
245 if section.name
in SHOULD_ALPHABETIZE:
246 sorted_values = sorted(section.values)
247 if sorted_values != section.values:
248 section.values = sorted_values
249 content.changed =
True
250 elif content.__class__ == CommandGroup:
256 if not package.cmake:
263 if not package.cmake:
265 for cmd
in package.cmake.content_map[
'catkin_package']:
266 for section
in cmd.get_real_sections():
267 section.style.prename = NEWLINE_PLUS_4
273 if not package.cmake:
275 acceptable_styles = [(NEWLINE_PLUS_8, NEWLINE_PLUS_8), (NEWLINE_PLUS_4, NEWLINE_PLUS_8)]
277 for cmd_name, section_name
in [(
'find_package',
'COMPONENTS'), (
'catkin_package',
'CATKIN_DEPENDS')]:
278 for cmd
in package.cmake.content_map[cmd_name]:
279 for section
in cmd.get_real_sections():
280 if section.name != section_name:
282 n = len(str(section))
284 key = section.style.name_val_sep, section.style.val_sep
285 if key
not in acceptable_styles:
286 section.style.name_val_sep = NEWLINE_PLUS_4
287 section.style.val_sep = NEWLINE_PLUS_8
293 if not package.cmake:
295 for cmd
in package.cmake.content_map[
'add_message_files'] + package.cmake.content_map[
'add_service_files']:
296 for section
in cmd.get_real_sections():
297 if len(section.values) > 1:
298 section.style.name_val_sep = NEWLINE_PLUS_4
299 section.style.val_sep = NEWLINE_PLUS_4
305 if not package.cmake:
307 for cmd
in package.cmake.content_map[
'install']:
309 cmd.sections = [s
for s
in cmd.sections
if type(s) != str]
311 for section
in cmd.sections[1:]:
312 if len(section.values) == 0:
313 section.style.prename = NEWLINE_PLUS_8
316 section.style.prename = NEWLINE_PLUS_8
318 section.style.prename =
''
320 for cmd
in package.cmake.content_map[
'catkin_install_python']:
321 section = cmd.sections[1]
322 if section.style.prename != CATKIN_INSTALL_PYTHON_PRENAME:
323 section.style.prename = CATKIN_INSTALL_PYTHON_PRENAME
328 return list(filter(
lambda x: x !=
'', a))
332 for i, section
in enumerate(command.sections):
333 if type(section) != str:
335 for ignorable
in ignorables:
336 while ignorable
in command.sections[i]:
337 command.changed =
True
338 command.sections[i] = command.sections[i].replace(ignorable, replacement)
341 if command.sections == [
'\n']:
342 command.sections = []
346 for i, content
in enumerate(cmake.contents):
347 if content.__class__ == Command:
349 elif content.__class__ == CommandGroup:
352 for ignorable
in ignorables:
353 while ignorable
in cmake.contents[i]:
354 cmake.contents[i] = cmake.contents[i].replace(ignorable, replacement)
360 if not package.cmake:
369 if not package.cmake:
371 for i, content
in enumerate(package.cmake.contents[:-2]):
372 if str(content)[-1] ==
'\n' and package.cmake.contents[i + 1] ==
'\n' and package.cmake.contents[i + 2] ==
'\n':
373 package.cmake.contents[i + 1] =
''
379 if not package.cmake:
383 default_style = config.get(
'cmake_style')
384 package.cmake.enforce_ordering(default_style)