|
1 | 1 | import os
|
2 | 2 | import json
|
| 3 | +import yaml |
3 | 4 | import shutil
|
4 | 5 | import xml.etree.ElementTree as xml_parser
|
5 | 6 |
|
@@ -127,8 +128,9 @@ class Build:
|
127 | 128 | 'galactic': ['rcl_logging_log4cxx', 'rcl_logging_spdlog', 'rcl_yaml_param_parser', 'rclc_examples']
|
128 | 129 | }
|
129 | 130 |
|
130 |
| - def __init__(self, library_folder, distro = 'galactic'): |
| 131 | + def __init__(self, library_folder, packages_folder, distro = 'galactic'): |
131 | 132 | self.library_folder = library_folder
|
| 133 | + self.packages_folder = packages_folder |
132 | 134 | self.build_folder = library_folder + "/build"
|
133 | 135 | self.distro = distro
|
134 | 136 |
|
@@ -195,6 +197,56 @@ def download_mcu_environment(self):
|
195 | 197 |
|
196 | 198 | print('\t - Downloaded {}{}'.format(package.name, " (ignored)" if package.ignored else ""))
|
197 | 199 |
|
| 200 | + self.download_extra_packages() |
| 201 | + |
| 202 | + def download_extra_packages(self): |
| 203 | + if not os.path.exists(self.packages_folder): |
| 204 | + print("\t - Extra packages folder not found, skipping...") |
| 205 | + return |
| 206 | + |
| 207 | + print("Checking extra packages") |
| 208 | + |
| 209 | + # Load and clone repositories from extra_packages.repos file |
| 210 | + extra_repos = self.get_repositories_from_yaml("{}/extra_packages.repos".format(self.packages_folder)) |
| 211 | + for repo_name in extra_repos: |
| 212 | + repo_values = extra_repos[repo_name] |
| 213 | + version = repo_values['version'] if 'version' in repo_values else None |
| 214 | + Repository(repo_name, repo_values['url'], self.distro, version).clone(self.mcu_src_folder) |
| 215 | + print("\t - Downloaded {}".format(repo_name)) |
| 216 | + |
| 217 | + extra_folders = os.listdir(self.packages_folder) |
| 218 | + if 'extra_packages.repos' in extra_folders: |
| 219 | + extra_folders.remove('extra_packages.repos') |
| 220 | + |
| 221 | + for folder in extra_folders: |
| 222 | + print("\t - Adding {}".format(folder)) |
| 223 | + |
| 224 | + shutil.copytree(self.packages_folder, self.mcu_src_folder, ignore=shutil.ignore_patterns('extra_packages.repos'), dirs_exist_ok=True) |
| 225 | + |
| 226 | + def get_repositories_from_yaml(self, yaml_file): |
| 227 | + repos = {} |
| 228 | + try: |
| 229 | + with open(yaml_file, 'r') as repos_file: |
| 230 | + root = yaml.safe_load(repos_file) |
| 231 | + repositories = root['repositories'] |
| 232 | + |
| 233 | + if repositories: |
| 234 | + for path in repositories: |
| 235 | + repo = {} |
| 236 | + attributes = repositories[path] |
| 237 | + try: |
| 238 | + repo['type'] = attributes['type'] |
| 239 | + repo['url'] = attributes['url'] |
| 240 | + if 'version' in attributes: |
| 241 | + repo['version'] = attributes['version'] |
| 242 | + except KeyError as e: |
| 243 | + continue |
| 244 | + repos[path] = repo |
| 245 | + except (yaml.YAMLError, KeyError, TypeError) as e: |
| 246 | + print("Error on {}: {}".format(yaml_file, e)) |
| 247 | + finally: |
| 248 | + return repos |
| 249 | + |
198 | 250 | def build_mcu_environment(self, meta_file, toolchain_file, user_meta = ""):
|
199 | 251 | if os.path.exists(self.mcu_folder + '/build'):
|
200 | 252 | print("micro-ROS already built")
|
|
0 commit comments