| 
									
										
										
										
											2017-06-05 16:02:39 +03:00
										 |  |  | # Copyright (c) 2014-present PlatformIO <contact@platformio.org> | 
					
						
							| 
									
										
										
										
											2015-11-18 17:16:17 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  | # you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | # You may obtain a copy of the License at | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #    http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | # distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | # See the License for the specific language governing permissions and | 
					
						
							|  |  |  | # limitations under the License. | 
					
						
							| 
									
										
										
										
											2014-06-12 21:17:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-13 20:39:04 +03:00
										 |  |  | # pylint: disable=too-many-arguments,too-many-locals, too-many-branches | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2014-06-12 21:17:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 18:14:18 +02:00
										 |  |  | import click | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  | from tabulate import tabulate | 
					
						
							| 
									
										
										
										
											2014-06-12 21:17:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 19:44:37 +03:00
										 |  |  | from platformio import exception, fs | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  | from platformio.commands.platform import platform_install as cli_platform_install | 
					
						
							| 
									
										
										
										
											2015-04-24 14:43:13 +01:00
										 |  |  | from platformio.ide.projectgenerator import ProjectGenerator | 
					
						
							| 
									
										
										
										
											2016-05-26 19:43:36 +03:00
										 |  |  | from platformio.managers.platform import PlatformManager | 
					
						
							| 
									
										
										
										
											2019-05-07 17:51:50 +03:00
										 |  |  | from platformio.project.config import ProjectConfig | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  | from platformio.project.exception import NotPlatformIOProjectError | 
					
						
							| 
									
										
										
										
											2019-09-27 14:13:53 +03:00
										 |  |  | from platformio.project.helpers import is_platformio_project | 
					
						
							| 
									
										
										
										
											2014-06-12 21:17:45 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  | @click.group(short_help="Project Manager") | 
					
						
							|  |  |  | def cli(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @cli.command("config", short_help="Show computed configuration") | 
					
						
							|  |  |  | @click.option( | 
					
						
							|  |  |  |     "-d", | 
					
						
							|  |  |  |     "--project-dir", | 
					
						
							|  |  |  |     default=os.getcwd, | 
					
						
							|  |  |  |     type=click.Path( | 
					
						
							|  |  |  |         exists=True, file_okay=True, dir_okay=True, writable=True, resolve_path=True | 
					
						
							|  |  |  |     ), | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | @click.option("--json-output", is_flag=True) | 
					
						
							|  |  |  | def project_config(project_dir, json_output): | 
					
						
							|  |  |  |     if not is_platformio_project(project_dir): | 
					
						
							|  |  |  |         raise NotPlatformIOProjectError(project_dir) | 
					
						
							|  |  |  |     with fs.cd(project_dir): | 
					
						
							|  |  |  |         config = ProjectConfig.get_instance() | 
					
						
							|  |  |  |     if json_output: | 
					
						
							|  |  |  |         return click.echo(config.to_json()) | 
					
						
							|  |  |  |     click.echo( | 
					
						
							|  |  |  |         "Computed project configuration for %s" % click.style(project_dir, fg="cyan") | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     for section, options in config.as_tuple(): | 
					
						
							|  |  |  |         click.echo() | 
					
						
							|  |  |  |         click.secho(section, fg="cyan") | 
					
						
							|  |  |  |         click.echo("-" * len(section)) | 
					
						
							|  |  |  |         click.echo( | 
					
						
							|  |  |  |             tabulate( | 
					
						
							|  |  |  |                 [ | 
					
						
							|  |  |  |                     (name, "=", "\n".join(value) if isinstance(value, list) else value) | 
					
						
							|  |  |  |                     for name, value in options | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 tablefmt="plain", | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-22 14:58:42 +01:00
										 |  |  | def validate_boards(ctx, param, value):  # pylint: disable=W0613 | 
					
						
							| 
									
										
										
										
											2016-05-26 19:43:36 +03:00
										 |  |  |     pm = PlatformManager() | 
					
						
							| 
									
										
										
										
											2016-09-14 14:46:10 +03:00
										 |  |  |     for id_ in value: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             pm.board_config(id_) | 
					
						
							|  |  |  |         except exception.UnknownBoard: | 
					
						
							|  |  |  |             raise click.BadParameter( | 
					
						
							|  |  |  |                 "`%s`. Please search for board ID using `platformio boards` " | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |                 "command" % id_ | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2016-09-14 14:46:10 +03:00
										 |  |  |     return value | 
					
						
							| 
									
										
										
										
											2015-04-20 19:55:18 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  | @cli.command("init", short_help="Initialize a project or update existing") | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  | @click.option( | 
					
						
							|  |  |  |     "--project-dir", | 
					
						
							|  |  |  |     "-d", | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  |     default=os.getcwd, | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     type=click.Path( | 
					
						
							|  |  |  |         exists=True, file_okay=False, dir_okay=True, writable=True, resolve_path=True | 
					
						
							|  |  |  |     ), | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | @click.option("-b", "--board", multiple=True, metavar="ID", callback=validate_boards) | 
					
						
							|  |  |  | @click.option("--ide", type=click.Choice(ProjectGenerator.get_supported_ides())) | 
					
						
							| 
									
										
										
										
											2016-09-01 15:14:38 +03:00
										 |  |  | @click.option("-O", "--project-option", multiple=True) | 
					
						
							| 
									
										
										
										
											2015-05-06 11:28:56 +01:00
										 |  |  | @click.option("--env-prefix", default="") | 
					
						
							| 
									
										
										
										
											2016-12-08 14:15:13 +02:00
										 |  |  | @click.option("-s", "--silent", is_flag=True) | 
					
						
							| 
									
										
										
										
											2015-09-06 18:16:09 +03:00
										 |  |  | @click.pass_context | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  | def project_init( | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     ctx,  # pylint: disable=R0913 | 
					
						
							|  |  |  |     project_dir, | 
					
						
							|  |  |  |     board, | 
					
						
							|  |  |  |     ide, | 
					
						
							|  |  |  |     project_option, | 
					
						
							|  |  |  |     env_prefix, | 
					
						
							|  |  |  |     silent, | 
					
						
							|  |  |  | ): | 
					
						
							| 
									
										
										
										
											2016-12-08 14:15:13 +02:00
										 |  |  |     if not silent: | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  |         if project_dir == os.getcwd(): | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |             click.secho("\nThe current working directory", fg="yellow", nl=False) | 
					
						
							| 
									
										
										
										
											2016-12-08 14:15:13 +02:00
										 |  |  |             click.secho(" %s " % project_dir, fg="cyan", nl=False) | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |             click.secho("will be used for the project.", fg="yellow") | 
					
						
							| 
									
										
										
										
											2016-12-08 14:15:13 +02:00
										 |  |  |             click.echo("") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |         click.echo( | 
					
						
							|  |  |  |             "The next files/directories have been created in %s" | 
					
						
							|  |  |  |             % click.style(project_dir, fg="cyan") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         click.echo( | 
					
						
							|  |  |  |             "%s - Put project header files here" % click.style("include", fg="cyan") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         click.echo( | 
					
						
							|  |  |  |             "%s - Put here project specific (private) libraries" | 
					
						
							|  |  |  |             % click.style("lib", fg="cyan") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         click.echo("%s - Put project source files here" % click.style("src", fg="cyan")) | 
					
						
							|  |  |  |         click.echo( | 
					
						
							|  |  |  |             "%s - Project Configuration File" % click.style("platformio.ini", fg="cyan") | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2014-11-30 18:14:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-07 22:13:21 +03:00
										 |  |  |     is_new_project = not is_platformio_project(project_dir) | 
					
						
							| 
									
										
										
										
											2019-05-07 19:57:24 +03:00
										 |  |  |     if is_new_project: | 
					
						
							|  |  |  |         init_base_project(project_dir) | 
					
						
							| 
									
										
										
										
											2015-04-23 12:40:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if board: | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |         fill_project_envs( | 
					
						
							|  |  |  |             ctx, project_dir, board, project_option, env_prefix, ide is not None | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2015-04-23 12:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-24 14:43:13 +01:00
										 |  |  |     if ide: | 
					
						
							| 
									
										
										
										
											2019-08-18 11:06:52 +03:00
										 |  |  |         pg = ProjectGenerator(project_dir, ide, board) | 
					
						
							| 
									
										
										
										
											2015-04-24 14:43:13 +01:00
										 |  |  |         pg.generate() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 14:02:29 +02:00
										 |  |  |     if is_new_project: | 
					
						
							|  |  |  |         init_ci_conf(project_dir) | 
					
						
							|  |  |  |         init_cvs_ignore(project_dir) | 
					
						
							| 
									
										
										
										
											2018-10-27 14:20:33 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |     if silent: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ide: | 
					
						
							|  |  |  |         click.secho( | 
					
						
							|  |  |  |             "\nProject has been successfully %s including configuration files " | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |             "for `%s` IDE." % ("initialized" if is_new_project else "updated", ide), | 
					
						
							|  |  |  |             fg="green", | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2016-12-08 14:15:13 +02:00
										 |  |  |         click.secho( | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |             "\nProject has been successfully %s! Useful commands:\n" | 
					
						
							|  |  |  |             "`pio run` - process/build project from the current directory\n" | 
					
						
							|  |  |  |             "`pio run --target upload` or `pio run -t upload` " | 
					
						
							|  |  |  |             "- upload firmware to a target\n" | 
					
						
							|  |  |  |             "`pio run --target clean` - clean project (remove compiled files)" | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |             "\n`pio run --help` - additional information" | 
					
						
							|  |  |  |             % ("initialized" if is_new_project else "updated"), | 
					
						
							|  |  |  |             fg="green", | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2015-04-23 12:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-29 20:22:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  | def init_base_project(project_dir): | 
					
						
							| 
									
										
										
										
											2019-08-12 19:44:37 +03:00
										 |  |  |     with fs.cd(project_dir): | 
					
						
							| 
									
										
										
										
											2019-09-27 14:13:53 +03:00
										 |  |  |         config = ProjectConfig() | 
					
						
							|  |  |  |         config.save() | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |         dir_to_readme = [ | 
					
						
							| 
									
										
										
										
											2019-09-27 14:13:53 +03:00
										 |  |  |             (config.get_optional_dir("src"), None), | 
					
						
							|  |  |  |             (config.get_optional_dir("include"), init_include_readme), | 
					
						
							|  |  |  |             (config.get_optional_dir("lib"), init_lib_readme), | 
					
						
							|  |  |  |             (config.get_optional_dir("test"), init_test_readme), | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |         ] | 
					
						
							|  |  |  |         for (path, cb) in dir_to_readme: | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  |             if os.path.isdir(path): | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  |             os.makedirs(path) | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  |             if cb: | 
					
						
							|  |  |  |                 cb(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def init_include_readme(include_dir): | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |     with open(os.path.join(include_dir, "README"), "w") as fp: | 
					
						
							|  |  |  |         fp.write( | 
					
						
							|  |  |  |             """
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | This directory is intended for project header files. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A header file is a file containing C declarations and macro definitions | 
					
						
							|  |  |  | to be shared between several project source files. You request the use of a | 
					
						
							|  |  |  | header file in your project source file (C, C++, etc) located in `src` folder | 
					
						
							|  |  |  | by including it, with the C preprocessing directive `#include'. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```src/main.c | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "header.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |  ... | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2015-09-06 18:16:09 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | Including a header file produces the same results as copying the header file | 
					
						
							|  |  |  | into each source file that needs it. Such copying would be time-consuming | 
					
						
							|  |  |  | and error-prone. With a header file, the related declarations appear | 
					
						
							|  |  |  | in only one place. If they need to be changed, they can be changed in one | 
					
						
							|  |  |  | place, and programs that include the header file will automatically use the | 
					
						
							|  |  |  | new version when next recompiled. The header file eliminates the labor of | 
					
						
							|  |  |  | finding and changing all the copies as well as the risk that a failure to | 
					
						
							|  |  |  | find one copy will result in inconsistencies within a program. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In C, the usual convention is to give header files names that end with `.h'. | 
					
						
							|  |  |  | It is most portable to use only letters, digits, dashes, and underscores in | 
					
						
							|  |  |  | header file names, and at most one dot. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Read more about using header files in official GCC documentation: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * Include Syntax | 
					
						
							|  |  |  | * Include Operation | 
					
						
							|  |  |  | * Once-Only Headers | 
					
						
							|  |  |  | * Computed Includes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html | 
					
						
							| 
									
										
										
										
											2019-10-17 18:48:59 +03:00
										 |  |  | """,
 | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def init_lib_readme(lib_dir): | 
					
						
							| 
									
										
										
										
											2019-10-17 18:48:59 +03:00
										 |  |  |     # pylint: disable=line-too-long | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |     with open(os.path.join(lib_dir, "README"), "w") as fp: | 
					
						
							|  |  |  |         fp.write( | 
					
						
							|  |  |  |             """
 | 
					
						
							| 
									
										
										
										
											2018-08-30 19:22:36 +02:00
										 |  |  | This directory is intended for project specific (private) libraries. | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | PlatformIO will compile them to static libraries and link into executable file. | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | The source code of each library should be placed in a an own separate directory | 
					
						
							|  |  |  | ("lib/your_library_name/[here are source files]"). | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | For example, see a structure of the following two libraries `Foo` and `Bar`: | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | |--lib | 
					
						
							| 
									
										
										
										
											2018-04-15 06:28:02 +03:00
										 |  |  | |  | | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | |  |--Bar | 
					
						
							|  |  |  | |  |  |--docs | 
					
						
							|  |  |  | |  |  |--examples | 
					
						
							|  |  |  | |  |  |--src | 
					
						
							|  |  |  | |  |     |- Bar.c | 
					
						
							|  |  |  | |  |     |- Bar.h | 
					
						
							| 
									
										
										
										
											2018-08-15 19:44:02 +03:00
										 |  |  | |  |  |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html | 
					
						
							| 
									
										
										
										
											2018-04-15 06:28:02 +03:00
										 |  |  | |  | | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | |  |--Foo | 
					
						
							|  |  |  | |  |  |- Foo.c | 
					
						
							|  |  |  | |  |  |- Foo.h | 
					
						
							| 
									
										
										
										
											2018-04-15 06:28:02 +03:00
										 |  |  | |  | | 
					
						
							| 
									
										
										
										
											2018-10-17 19:58:38 +03:00
										 |  |  | |  |- README --> THIS FILE | 
					
						
							| 
									
										
										
										
											2018-04-15 06:28:02 +03:00
										 |  |  | | | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | |- platformio.ini | 
					
						
							|  |  |  | |--src | 
					
						
							|  |  |  |    |- main.c | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | and a contents of `src/main.c`: | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | #include <Foo.h> | 
					
						
							|  |  |  | #include <Bar.h> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | int main (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   ... | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 21:49:02 +03:00
										 |  |  | PlatformIO Library Dependency Finder will find automatically dependent | 
					
						
							|  |  |  | libraries scanning project source files. | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-08 19:44:31 +03:00
										 |  |  | More information about PlatformIO Library Dependency Finder | 
					
						
							| 
									
										
										
										
											2018-08-15 19:44:02 +03:00
										 |  |  | - https://docs.platformio.org/page/librarymanager/ldf.html | 
					
						
							| 
									
										
										
										
											2019-10-17 18:48:59 +03:00
										 |  |  | """,
 | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-17 21:16:09 +03:00
										 |  |  | def init_test_readme(test_dir): | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |     with open(os.path.join(test_dir, "README"), "w") as fp: | 
					
						
							|  |  |  |         fp.write( | 
					
						
							|  |  |  |             """
 | 
					
						
							| 
									
										
										
										
											2018-10-17 21:16:09 +03:00
										 |  |  | This directory is intended for PIO Unit Testing and project tests. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Unit Testing is a software testing method by which individual units of | 
					
						
							|  |  |  | source code, sets of one or more MCU program modules together with associated | 
					
						
							|  |  |  | control data, usage procedures, and operating procedures, are tested to | 
					
						
							|  |  |  | determine whether they are fit for use. Unit testing finds problems early | 
					
						
							|  |  |  | in the development cycle. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | More information about PIO Unit Testing: | 
					
						
							|  |  |  | - https://docs.platformio.org/page/plus/unit-testing.html | 
					
						
							| 
									
										
										
										
											2019-10-17 18:48:59 +03:00
										 |  |  | """,
 | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-17 21:16:09 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | def init_ci_conf(project_dir): | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  |     conf_path = os.path.join(project_dir, ".travis.yml") | 
					
						
							|  |  |  |     if os.path.isfile(conf_path): | 
					
						
							| 
									
										
										
										
											2018-10-27 14:20:33 +03:00
										 |  |  |         return | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |     with open(conf_path, "w") as fp: | 
					
						
							|  |  |  |         fp.write( | 
					
						
							|  |  |  |             """# Continuous Integration (CI) is the practice, in software
 | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | # engineering, of merging all developer working copies with a shared mainline | 
					
						
							| 
									
										
										
										
											2018-08-15 19:44:02 +03:00
										 |  |  | # several times a day < https://docs.platformio.org/page/ci/index.html > | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # Documentation: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # * Travis CI Embedded Builds with PlatformIO | 
					
						
							|  |  |  | #   < https://docs.travis-ci.com/user/integration/platformio/ > | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # * PlatformIO integration with Travis CI | 
					
						
							| 
									
										
										
										
											2018-08-15 19:44:02 +03:00
										 |  |  | #   < https://docs.platformio.org/page/ci/travis.html > | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # * User Guide for `platformio ci` command | 
					
						
							| 
									
										
										
										
											2018-08-15 19:44:02 +03:00
										 |  |  | #   < https://docs.platformio.org/page/userguide/cmd_ci.html > | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2018-08-30 19:22:36 +02:00
										 |  |  | # Please choose one of the following templates (proposed below) and uncomment | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # it (remove "# " before each line) or use own configuration according to the | 
					
						
							|  |  |  | # Travis CI documentation (see above). | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # Template #1: General project. Test it using existing `platformio.ini`. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # language: python | 
					
						
							|  |  |  | # python: | 
					
						
							|  |  |  | #     - "2.7" | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2018-02-20 14:29:20 +02:00
										 |  |  | # sudo: false | 
					
						
							|  |  |  | # cache: | 
					
						
							|  |  |  | #     directories: | 
					
						
							|  |  |  | #         - "~/.platformio" | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # install: | 
					
						
							|  |  |  | #     - pip install -U platformio | 
					
						
							| 
									
										
										
										
											2018-02-20 14:29:20 +02:00
										 |  |  | #     - platformio update | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # script: | 
					
						
							|  |  |  | #     - platformio run | 
					
						
							| 
									
										
										
										
											2015-12-04 15:18:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2018-08-30 19:22:36 +02:00
										 |  |  | # Template #2: The project is intended to be used as a library with examples. | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # language: python | 
					
						
							|  |  |  | # python: | 
					
						
							|  |  |  | #     - "2.7" | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2018-02-20 14:29:20 +02:00
										 |  |  | # sudo: false | 
					
						
							|  |  |  | # cache: | 
					
						
							|  |  |  | #     directories: | 
					
						
							|  |  |  | #         - "~/.platformio" | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # env: | 
					
						
							|  |  |  | #     - PLATFORMIO_CI_SRC=path/to/test/file.c | 
					
						
							|  |  |  | #     - PLATFORMIO_CI_SRC=examples/file.ino | 
					
						
							|  |  |  | #     - PLATFORMIO_CI_SRC=path/to/test/directory | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # install: | 
					
						
							|  |  |  | #     - pip install -U platformio | 
					
						
							| 
									
										
										
										
											2018-02-20 14:29:20 +02:00
										 |  |  | #     - platformio update | 
					
						
							| 
									
										
										
										
											2015-12-07 22:23:20 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # script: | 
					
						
							| 
									
										
										
										
											2016-05-26 19:43:36 +03:00
										 |  |  | #     - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N | 
					
						
							| 
									
										
										
										
											2019-10-17 18:48:59 +03:00
										 |  |  | """,
 | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2015-12-05 23:34:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def init_cvs_ignore(project_dir): | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  |     conf_path = os.path.join(project_dir, ".gitignore") | 
					
						
							|  |  |  |     if os.path.isfile(conf_path): | 
					
						
							| 
									
										
										
										
											2016-12-07 00:58:22 +02:00
										 |  |  |         return | 
					
						
							| 
									
										
										
										
											2020-03-05 23:52:13 +02:00
										 |  |  |     with open(conf_path, "w") as fp: | 
					
						
							|  |  |  |         fp.write(".pio\n") | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  | def fill_project_envs( | 
					
						
							|  |  |  |     ctx, project_dir, board_ids, project_option, env_prefix, force_download | 
					
						
							|  |  |  | ): | 
					
						
							| 
									
										
										
										
											2020-02-06 23:32:43 +02:00
										 |  |  |     config = ProjectConfig( | 
					
						
							|  |  |  |         os.path.join(project_dir, "platformio.ini"), parse_extra=False | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-03-19 00:13:51 +02:00
										 |  |  |     used_boards = [] | 
					
						
							|  |  |  |     for section in config.sections(): | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |         cond = [section.startswith("env:"), config.has_option(section, "board")] | 
					
						
							| 
									
										
										
										
											2016-10-31 20:05:34 +02:00
										 |  |  |         if all(cond): | 
					
						
							|  |  |  |             used_boards.append(config.get(section, "board")) | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-14 14:46:10 +03:00
										 |  |  |     pm = PlatformManager() | 
					
						
							| 
									
										
										
										
											2019-05-07 19:57:24 +03:00
										 |  |  |     used_platforms = [] | 
					
						
							|  |  |  |     modified = False | 
					
						
							| 
									
										
										
										
											2016-05-26 19:43:36 +03:00
										 |  |  |     for id_ in board_ids: | 
					
						
							| 
									
										
										
										
											2016-09-14 14:46:10 +03:00
										 |  |  |         board_config = pm.board_config(id_) | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |         used_platforms.append(board_config["platform"]) | 
					
						
							| 
									
										
										
										
											2016-05-26 19:43:36 +03:00
										 |  |  |         if id_ in used_boards: | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2016-08-10 21:58:12 +03:00
										 |  |  |         used_boards.append(id_) | 
					
						
							| 
									
										
										
										
											2019-05-07 19:57:24 +03:00
										 |  |  |         modified = True | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |         envopts = {"platform": board_config["platform"], "board": id_} | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  |         # find default framework for board | 
					
						
							| 
									
										
										
										
											2016-09-14 14:46:10 +03:00
										 |  |  |         frameworks = board_config.get("frameworks") | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  |         if frameworks: | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |             envopts["framework"] = frameworks[0] | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-13 19:22:19 +03:00
										 |  |  |         for item in project_option: | 
					
						
							|  |  |  |             if "=" not in item: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             _name, _value = item.split("=", 1) | 
					
						
							|  |  |  |             envopts[_name.strip()] = _value.strip() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-07 19:57:24 +03:00
										 |  |  |         section = "env:%s%s" % (env_prefix, id_) | 
					
						
							|  |  |  |         config.add_section(section) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for option, value in envopts.items(): | 
					
						
							|  |  |  |             config.set(section, option, value) | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if force_download and used_platforms: | 
					
						
							|  |  |  |         _install_dependent_platforms(ctx, used_platforms) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-07 19:57:24 +03:00
										 |  |  |     if modified: | 
					
						
							|  |  |  |         config.save() | 
					
						
							| 
									
										
										
										
											2019-05-07 17:51:50 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _install_dependent_platforms(ctx, platforms): | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     installed_platforms = [p["name"] for p in PlatformManager().get_installed()] | 
					
						
							| 
									
										
										
										
											2016-03-07 17:42:15 +02:00
										 |  |  |     if set(platforms) <= set(installed_platforms): | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     ctx.invoke( | 
					
						
							|  |  |  |         cli_platform_install, platforms=list(set(platforms) - set(installed_platforms)) | 
					
						
							|  |  |  |     ) |