4 from util
import get_ignore_data, roscompile
6 SHOULD_ALPHABETIZE = [
'COMPONENTS',
'DEPENDENCIES',
'FILES',
'CATKIN_DEPENDS']
12 if len(dependencies) == 0:
14 if len(cmake.content_map[
'find_package']) == 0:
16 cmd.add_section(
'', [
'catkin'])
17 cmd.add_section(
'REQUIRED')
18 cmake.add_command(cmd)
20 for cmd
in cmake.content_map[
'find_package']:
21 tokens = cmd.get_tokens()
22 if tokens
and tokens[0] ==
'catkin' and cmd.get_section(
'REQUIRED'):
23 req_sec = cmd.get_section(
'REQUIRED')
24 section = cmd.get_section(
'COMPONENTS')
25 if section
is None and req_sec.values:
28 cmd.add_section(
'COMPONENTS', sorted(dependencies))
30 existing = cmake.resolve_variables(section.values)
31 needed_items = dependencies - set(existing)
32 if len(needed_items) > 0:
33 section.values += list(sorted(needed_items))
36 cmake.section_check(dependencies,
'catkin_package',
'CATKIN_DEPENDS')
41 dependencies = package.get_dependencies_from_msgs()
42 dependencies.update(package.get_build_dependencies())
47 valid_targets = set([search_target])
48 alt_target = cmake.resolve_variables(search_target)
49 if alt_target != search_target:
50 valid_targets.add(alt_target)
52 for cmd
in cmake.content_map[
'add_dependencies']:
53 target = cmd.first_token()
54 if target
in valid_targets:
56 resolved_target = cmake.resolve_variables(target)
57 if resolved_target
in valid_targets:
62 for gen
in package.get_all_generators():
63 if name == gen.base_name:
69 for rel_fn
in sources:
70 if rel_fn
not in package.source_code.sources:
72 src = package.source_code.sources[rel_fn]
73 for pkg, name
in src.search_lines_for_pattern(CPLUS):
74 if len(name) == 0
or name[-2:] !=
'.h':
76 name = name.replace(
'.h',
'')
77 if is_message(pkg, name)
or is_service(pkg, name):
81 if package.dynamic_reconfigs:
82 deps.add(package.name)
83 return sorted(list(deps))
88 targets = package.cmake.get_target_build_rules()
89 for target, sources
in targets.iteritems():
94 if package.name
in deps:
108 add_deps =
Command(
'add_dependencies')
111 if len(add_deps.sections) == 0:
112 add_deps.add_section(
'', [target])
113 add_deps.changed =
True 115 section = add_deps.sections[0]
116 if cat_depend
and '${catkin_EXPORTED_TARGETS}' not in section.values:
117 section.add(
'${catkin_EXPORTED_TARGETS}')
118 add_deps.changed =
True 120 tokens = [package.cmake.resolve_variables(s)
for s
in section.values]
121 key =
'${%s_EXPORTED_TARGETS}' % package.name
122 if key
not in tokens:
124 add_deps.changed =
True 127 package.cmake.add_command(add_deps)
131 prev_len = len(section.values)
132 section.values = [v
for v
in section.values
if pattern
not in v]
133 return prev_len != len(section.values)
138 global_changed =
False 139 targets = package.cmake.get_target_build_rules()
140 for target, sources
in targets.iteritems():
142 if add_deps
is None or len(add_deps.sections) == 0:
145 section = add_deps.sections[0]
150 add_deps.changed =
True 151 global_changed =
True 158 CATKIN =
'${catkin_LIBRARIES}' 159 targets = package.cmake.get_libraries() + package.cmake.get_executables()
160 for cmd
in package.cmake.content_map[
'target_link_libraries']:
161 tokens = cmd.get_tokens()
162 if tokens[0]
in targets:
163 if CATKIN
not in tokens:
164 print(
'\tAdding %s to target_link_libraries for %s' % (CATKIN, tokens[0]))
165 cmd.add_token(CATKIN)
166 targets.remove(tokens[0])
168 for target
in targets:
169 print(
'\tAdding target_link_libraries for %s' % target)
170 cmd =
Command(
'target_link_libraries')
171 cmd.add_section(
'', [target, CATKIN])
172 package.cmake.add_command(cmd)
177 if len(package.generators) == 0:
180 for gen_type, cmake_cmd
in [(
'msg',
'add_message_files'),
181 (
'srv',
'add_service_files'),
182 (
'action',
'add_action_files')]:
183 names = [gen.name
for gen
in package.generators[gen_type]]
184 package.cmake.section_check(names, cmake_cmd,
'FILES')
186 package.cmake.section_check([
'message_generation'],
'find_package',
'COMPONENTS')
187 package.cmake.section_check([
'message_runtime'],
'catkin_package',
'CATKIN_DEPENDS')
188 for cmd
in package.cmake.content_map[
'catkin_package']:
189 section = cmd.get_section(
'CATKIN_DEPENDS')
190 if 'message_generation' in section.values:
191 section.values.remove(
'message_generation')
194 msg_deps = package.get_dependencies_from_msgs()
196 package.cmake.section_check(msg_deps,
'generate_messages',
197 'DEPENDENCIES', zero_okay=
True)
199 package.cmake.section_check(msg_deps,
'generate_messages',
206 if package.source_code.has_header_files():
207 package.cmake.section_check([
'include'],
'catkin_package',
'INCLUDE_DIRS')
208 package.cmake.section_check([
'include'],
'include_directories')
211 if len(package.source_code.get_source_by_language(
'c++')) > 0:
212 package.cmake.section_check([
'${catkin_INCLUDE_DIRS}'],
'include_directories')
215 if not has_includes
and 'include_directories' in package.cmake.content_map:
216 for cmd
in package.cmake.content_map[
'include_directories']:
217 package.cmake.remove_command(cmd)
222 package.cmake.section_check(package.cmake.get_libraries(),
'catkin_package',
'LIBRARIES')
226 for content
in cmake.contents:
227 if content.__class__ == Command:
228 for section
in content.get_real_sections():
229 if section.name
in SHOULD_ALPHABETIZE:
230 sorted_values = list(sorted(section.values))
231 if sorted_values != section.values:
232 section.values = sorted_values
233 content.changed =
True 234 elif content.__class__ == CommandGroup:
245 for cmd
in package.cmake.content_map[
'catkin_package']:
246 for section
in cmd.get_real_sections():
247 section.style.prename = NEWLINE_PLUS_4
253 acceptable_styles = [(NEWLINE_PLUS_8, NEWLINE_PLUS_8), (NEWLINE_PLUS_4, NEWLINE_PLUS_8)]
255 for cmd_name, section_name
in [(
'find_package',
'COMPONENTS'), (
'catkin_package',
'CATKIN_DEPENDS')]:
256 for cmd
in package.cmake.content_map[cmd_name]:
257 for section
in cmd.get_real_sections():
258 if section.name != section_name:
260 n = len(str(section))
262 key = section.style.name_val_sep, section.style.val_sep
263 if key
not in acceptable_styles:
264 section.style.name_val_sep = NEWLINE_PLUS_4
265 section.style.val_sep = NEWLINE_PLUS_8
271 for cmd
in package.cmake.content_map[
'add_message_files'] + package.cmake.content_map[
'add_service_files']:
272 for section
in cmd.get_real_sections():
273 if len(section.values) > 1:
274 section.style.name_val_sep = NEWLINE_PLUS_4
275 section.style.val_sep = NEWLINE_PLUS_4
281 for cmd
in package.cmake.content_map[
'install']:
283 cmd.sections = [s
for s
in cmd.sections
if type(s) != str]
285 for section
in cmd.sections[1:]:
286 if len(section.values) == 0:
287 section.style.prename = NEWLINE_PLUS_8
290 section.style.prename = NEWLINE_PLUS_8
292 section.style.prename =
'' 296 return filter(
lambda x: x !=
'', a)
300 for i, section
in enumerate(command.sections):
301 if type(section) != str:
303 for ignorable
in ignorables:
304 while ignorable
in command.sections[i]:
305 command.changed =
True 306 command.sections[i] = command.sections[i].replace(ignorable, replacement)
309 if command.sections == [
'\n']:
310 command.sections = []
314 for i, content
in enumerate(cmake.contents):
315 if content.__class__ == Command:
317 elif content.__class__ == CommandGroup:
320 for ignorable
in ignorables:
321 while ignorable
in cmake.contents[i]:
322 cmake.contents[i] = cmake.contents[i].replace(ignorable, replacement)
335 for i, content
in enumerate(package.cmake.contents[:-2]):
336 if str(content)[-1] ==
'\n' and package.cmake.contents[i + 1] ==
'\n' and package.cmake.contents[i + 2] ==
'\n':
337 package.cmake.contents[i + 1] =
'' 342 anchors = cmake.get_ordered_build_targets()
345 for content
in cmake.contents:
346 current.append(content)
347 if type(content) == str:
349 key = get_sort_key(content, anchors)
350 clusters.append((key, current))
353 clusters.append((get_sort_key(
None, anchors), current))
355 return sorted(clusters, key=
lambda kv: kv[0])
361 for key, contents
in clusters:
362 cmake.contents += contents
368 for group
in package.cmake.content_map[
'group']:
def check_cmake_dependencies(package)
def remove_empty_strings(a)
def check_includes(package)
def check_generators(package)
def remove_old_style_cpp_dependencies(package)
def prettify_msgs_srvs(package)
def prettify_package_lists(package)
def get_ignore_data(name, variables=None, add_newline=True)
def remove_boilerplate_cmake_comments(package)
def check_cmake_dependencies_helper(cmake, dependencies, check_catkin_pkg=True)
def prettify_catkin_package_cmd(package)
def remove_empty_cmake_lines(package)
def get_matching_add_depends(cmake, search_target)
def enforce_cmake_ordering(package)
def remove_cmake_comments_helper(cmake, ignorables, replacement='')
def target_catkin_libraries(package)
def get_cmake_clusters(cmake)
def enforce_cmake_ordering_helper(cmake)
def alphabetize_sections(package)
def alphabetize_sections_helper(cmake)
def remove_pattern(section, pattern)
def get_msg_dependencies_from_source(package, sources)
def match_generator_name(package, name)
def check_library_setup(package)
def prettify_installs(package)
def check_exported_dependencies(package)
def remove_cmake_command_comments_helper(command, ignorables, replacement='')