diff --git a/HISTORY.rst b/HISTORY.rst index 880e1d32..cded83ea 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -32,6 +32,7 @@ PlatformIO 2.0 * Updated Microchip PIC32 Arduino framework to v1.2.1 * Documented `uploading of EEPROM data `__ (from EEMEM directive) +* Added ``Rebuild C/C++ Project Index`` target to CLion and Eclipse IDEs * Improved project generator for `CLion IDE `__ * Auto-remove project cache when PlatformIO is upgraded * Keep user changes for ``.gitignore`` file when re-generate/update project data diff --git a/docs/articles.rst b/docs/articles.rst index 3dbe604c..3ceb7fce 100644 --- a/docs/articles.rst +++ b/docs/articles.rst @@ -23,6 +23,9 @@ Here are recent articles about PlatformIO: 2016 ^^^^ +* Jul 5, 2016 - **Ivan Kravets, Ph.D.** - `Explore the new development instruments for Arduino with PlatformIO ecosystem `_ +* Jul 5, 2016 - **Belinda** - `Monte Bianco Arduino Developer Summit `_ +* Jul 1, 2016 - **Tam Hanna** - `Mikrocontroller-Gipfel in den Alpen: Arduino Developer Summit, Tag eins (Microcontroller peaks in the Alps: Arduino Developer Summit, Day One, German) `_ * Jun 14, 2016 - **Glyn Hudson** - `OpenEnergyMonitor Part 2/3: Firmware Continuous Test & Build `_ * Jun 13, 2016 - **Daniel Eichhorn** - `New Weather Station Demo on Github `_ * Jun 12, 2016 - **Glyn Hudson** - `OpenEnergyMonitor Part 1/3: PlatformIO open-source embedded development ecosystem `_ diff --git a/docs/ide/clion.rst b/docs/ide/clion.rst index 89ad7cfa..bbd6584a 100644 --- a/docs/ide/clion.rst +++ b/docs/ide/clion.rst @@ -53,16 +53,20 @@ There are 6 predefined targets for building (*NOT FOR RUNNING*, see marks on the screenshot below): * ``PLATFORMIO_BUILD`` - Build project without auto-uploading -* ``PLATFORMIO_UPLOAD`` - Build and upload (if no errors). -* ``PLATFORMIO_CLEAN`` - Clean compiled objects. -* ``PLATFORMIO_PROGRAM`` - Build and upload using external programmer (if no errors), see :ref:`atmelavr_upload_via_programmer`. -* ``PLATFORMIO_UPLOADFS`` - Upload files to file system SPIFFS, see :ref:`platform_espressif_uploadfs`. -* ``PLATFORMIO_UPDATE`` - Update installed platforms and libraries via :ref:`cmd_update`. +* ``PLATFORMIO_UPLOAD`` - Build and upload (if no errors) +* ``PLATFORMIO_CLEAN`` - Clean compiled objects +* ``PLATFORMIO_PROGRAM`` - Build and upload using external programmer + (if no errors), see :ref:`atmelavr_upload_via_programmer` +* ``PLATFORMIO_UPLOADFS`` - Upload files to file system SPIFFS, + see :ref:`platform_espressif_uploadfs` +* ``PLATFORMIO_UPDATE`` - Update installed platforms and libraries via :ref:`cmd_update` +* ``PLATFORMIO_REBUILD_PROJECT_INDEX`` - Rebuild C/C++ Index for the Project. + Allows to fix code completion and code linting issues. .. warning:: The libraries which are added, installed or used in the project - after generating process wont be reflected in IDE. To fix it you - need to reinitialize project using :ref:`cmd_init` (repeat it). + after generating process wont be reflected in IDE. To fix it please run + ``PLATFORMIO_REBUILD_PROJECT_INDEX`` target. Articles / Manuals ------------------ diff --git a/docs/ide/eclipse.rst b/docs/ide/eclipse.rst index 230de1f9..2ef869f8 100644 --- a/docs/ide/eclipse.rst +++ b/docs/ide/eclipse.rst @@ -51,7 +51,7 @@ Then: ``Menu: File > Import... > General > Existing Projects into Workspace > Next`` and specify root directory where is located :ref:`projectconf` 2. Open source file from ``src`` directory (``*.c, *.cpp, *.ino, etc.``) -3. Build project using ``Menu: Project > Build Project`` or preconfigured +3. Build project using ``Menu: Project > Build Project`` or pre-configured Make Targets (see screenshot below): + ``PlatformIO: Build`` - Build project without auto-uploading @@ -59,17 +59,24 @@ Then: + ``PlatformIO: Upload`` - Build and upload (if no errors) + ``PlatformIO: Upload using Programmer`` see :ref:`atmelavr_upload_via_programmer` + ``PlatformIO: Upload SPIFFS image`` see :ref:`platform_espressif_uploadfs` - + ``PlatformIO: Update platforms and libraries`` - Update installed platforms and libraries via :ref:`cmd_update`. + + ``PlatformIO: Update platforms and libraries`` - Update installed + platforms and libraries via :ref:`cmd_update` + + ``PlatformIO: Rebuild C/C++ Project Index`` - Rebuild C/C++ Index for the Project. + Allows to fix code completion and code linting issues. If you have some problems with unresolved includes, defines, etc., then -* Restart Eclipse IDE -* Rebuild index using ``Menu: Project > C/C++ Index > Rebuild``. +1. Rebuild PlatformIO Project Index: + ``PlatformIO: Rebuild C/C++ Project Index`` target +2. Rebuild Eclipse Project Index: ``Menu: Project > C/C++ Index > Rebuild`` +3. Refresh Project, right click on the project ``Project > Refresh`` (F5) or + restart Eclipse IDE. .. warning:: The libraries which are added, installed or used in the project - after generating process wont be reflected in IDE. To fix it you - need to reinitialize project using :ref:`cmd_init` (repeat it). + after generating process wont be reflected in IDE. To fix it please run + ``PlatformIO: Rebuild C/C++ Project Index`` target and right click on the + project and ``Project > Refresh`` (F5). Live Integration ---------------- diff --git a/docs/projectconf.rst b/docs/projectconf.rst index 77d72526..f3700743 100644 --- a/docs/projectconf.rst +++ b/docs/projectconf.rst @@ -389,6 +389,10 @@ Example: [env:specific_ld_script] build_flags = -Wl,-T/path/to/ld_script.ld + [env:exec_command] + # get VCS revision "on-the-fly" + build_flags = !echo "-DPIO_SRC_REV="$(git rev-parse HEAD) + For more detailed information about available flags/options go to: diff --git a/platformio/builder/tools/devplatform.py b/platformio/builder/tools/devplatform.py index 4c78a6d5..4c7921dd 100644 --- a/platformio/builder/tools/devplatform.py +++ b/platformio/builder/tools/devplatform.py @@ -61,7 +61,7 @@ def LoadDevPlatform(env, variables): installed_packages = p.get_installed_packages() # Add toolchains and uploaders to $PATH - for name in installed_packages.keys(): + for name in installed_packages: type_ = p.get_package_type(name) if type_ not in ("toolchain", "uploader"): continue @@ -78,7 +78,7 @@ def LoadDevPlatform(env, variables): return board_config = env.BoardConfig() - for k in variables.keys(): + for k in variables: if (k in env or not any([k.startswith("BOARD_"), k.startswith("UPLOAD_")])): continue diff --git a/platformio/builder/tools/piomisc.py b/platformio/builder/tools/piomisc.py index 9b657e68..4f2e59d4 100644 --- a/platformio/builder/tools/piomisc.py +++ b/platformio/builder/tools/piomisc.py @@ -163,7 +163,7 @@ def DumpIDEData(env): # includes from toolchains p = env.DevPlatform() - for name in p.get_installed_packages().keys(): + for name in p.get_installed_packages(): if p.get_package_type(name) != "toolchain": continue toolchain_dir = p.get_package_dir(name) @@ -179,7 +179,9 @@ def DumpIDEData(env): def get_defines(env_): defines = [] # global symbols - for item in env.Flatten(env_.get("CPPDEFINES", [])): + for item in env_.get("CPPDEFINES", []): + if isinstance(item, list) or isinstance(item, tuple): + item = "=".join(item) defines.append(env_.subst(item).replace('\\"', '"')) # special symbol for Atmel AVR MCU @@ -200,13 +202,17 @@ def DumpIDEData(env): "includes": get_includes(env_), "cc_flags": env_.subst(LINTCCOM), "cxx_flags": env_.subst(LINTCXXCOM), + "cc_path": util.where_is_program( + env_.subst("$CC"), env_.subst("${ENV['PATH']}")), "cxx_path": util.where_is_program( env_.subst("$CXX"), env_.subst("${ENV['PATH']}")) } # https://github.com/platformio/platformio-atom-ide/issues/34 _new_defines = [] - for item in env.Flatten(env_.get("CPPDEFINES", [])): + for item in env_.get("CPPDEFINES", []): + if isinstance(item, list) or isinstance(item, tuple): + item = "=".join(item) item = item.replace('\\"', '"') if " " in item: _new_defines.append(item.replace(" ", "\\\\ ")) diff --git a/platformio/builder/tools/piotest.py b/platformio/builder/tools/piotest.py index 6d2ceb18..db1e1886 100644 --- a/platformio/builder/tools/piotest.py +++ b/platformio/builder/tools/piotest.py @@ -123,7 +123,7 @@ void output_complete(void) "Please remove it manually." % file_) framework = env.subst("$FRAMEWORK").lower() - if framework not in FRAMEWORK_PARAMETERS.keys(): + if framework not in FRAMEWORK_PARAMETERS: env.Exit( "Error: %s framework doesn't support testing feature!" % framework) else: diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index fa556e30..b96c47a6 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -153,7 +153,7 @@ def ProcessUnFlags(env, flags): all_flags.extend(items) all_flags = set(all_flags) - for key in parsed_flags.keys(): + for key in parsed_flags: cur_flags = set(env.get(key, [])) for item in cur_flags & all_flags: while item in env[key]: diff --git a/platformio/commands/init.py b/platformio/commands/init.py index c0837fad..3cdec20c 100644 --- a/platformio/commands/init.py +++ b/platformio/commands/init.py @@ -89,6 +89,10 @@ def cli(ctx, project_dir, board, ide, # pylint: disable=R0913 ) if ide: + if not board: + board = get_first_board(project_dir) + if board: + board = [board] if not board: raise exception.BoardNotDefined() if len(board) > 1: @@ -100,8 +104,7 @@ def cli(ctx, project_dir, board, ide, # pylint: disable=R0913 "your list '%s'." % (board[0], ", ".join(board)), fg="yellow" ) - pg = ProjectGenerator( - project_dir, ide, board[0]) + pg = ProjectGenerator(project_dir, ide, board[0]) pg.generate() click.secho( @@ -117,6 +120,17 @@ def cli(ctx, project_dir, board, ide, # pylint: disable=R0913 ) +def get_first_board(project_dir): + with util.cd(project_dir): + config = util.get_project_config() + for section in config.sections(): + if not section.startswith("env:"): + continue + elif config.has_option(section, "board"): + return config.get(section, "board") + return None + + def init_base_project(project_dir): platformio_ini = join(project_dir, "platformio.ini") if not isfile(platformio_ini): diff --git a/platformio/commands/lib.py b/platformio/commands/lib.py index f2bd73e5..bbf8bb09 100644 --- a/platformio/commands/lib.py +++ b/platformio/commands/lib.py @@ -153,7 +153,7 @@ def lib_install(ctx, libid, version): def lib_install_dependency(ctx, data): assert isinstance(data, dict) query = [] - for key in data.keys(): + for key in data: if key in ("authors", "frameworks", "platforms", "keywords"): values = data[key] if not isinstance(values, list): diff --git a/platformio/ide/projectgenerator.py b/platformio/ide/projectgenerator.py index 102f7878..4c0a4365 100644 --- a/platformio/ide/projectgenerator.py +++ b/platformio/ide/projectgenerator.py @@ -32,6 +32,9 @@ class ProjectGenerator(object): self.board = board self._tplvars = {} + with util.cd(self.project_dir): + self.project_src_dir = util.get_projectsrc_dir() + self._gather_tplvars() @staticmethod @@ -94,7 +97,7 @@ class ProjectGenerator(object): def get_src_files(self): result = [] with util.cd(self.project_dir): - for root, _, files in os.walk(util.get_projectsrc_dir()): + for root, _, files in os.walk(self.project_src_dir): for f in files: result.append(relpath(join(root, f))) return result @@ -157,6 +160,7 @@ class ProjectGenerator(object): "src_files": self.get_src_files(), "user_home_dir": abspath(expanduser("~")), "project_dir": self.project_dir, + "project_src_dir": self.project_src_dir, "systype": util.get_systype(), "platformio_path": self._fix_os_path( util.where_is_program("platformio")), diff --git a/platformio/ide/tpls/clion/.idea/workspace.xml.tpl b/platformio/ide/tpls/clion/.idea/workspace.xml.tpl index 582177fb..59426c43 100644 --- a/platformio/ide/tpls/clion/.idea/workspace.xml.tpl +++ b/platformio/ide/tpls/clion/.idea/workspace.xml.tpl @@ -10,6 +10,7 @@ + @@ -39,28 +40,14 @@ - - - - - - - - - + + % for file in src_files: - - - - - - - - - + + - % end + % end @@ -113,6 +100,8 @@ + + @@ -120,13 +109,13 @@ @@ -201,7 +190,11 @@ - + + + + + @@ -209,6 +202,7 @@ + @@ -225,27 +219,10 @@ - + - - - - - - - - - - - - - - - - - - + @@ -280,4 +257,4 @@ - \ No newline at end of file + diff --git a/platformio/ide/tpls/clion/CMakeLists.txt.tpl b/platformio/ide/tpls/clion/CMakeLists.txt.tpl index 9b56290c..a31664d0 100644 --- a/platformio/ide/tpls/clion/CMakeLists.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeLists.txt.tpl @@ -3,10 +3,6 @@ project({{project_name}}) include(CMakeListsPrivate.txt) -% for define in defines: -add_definitions(-D{{!define}}) -% end - add_custom_target( PLATFORMIO_BUILD ALL COMMAND ${PLATFORMIO_CMD} -f -c clion run @@ -43,5 +39,10 @@ add_custom_target( WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) -aux_source_directory(src SRC_LIST) +add_custom_target( + PLATFORMIO_REBUILD_PROJECT_INDEX ALL + COMMAND ${PLATFORMIO_CMD} -f -c clion init --ide clion + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + add_executable(${PROJECT_NAME} ${SRC_LIST}) diff --git a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl index ef859843..40414aa8 100644 --- a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl @@ -1,6 +1,15 @@ set(ENV{PATH} "{{env_path}}") set(PLATFORMIO_CMD "{{platformio_path}}") +SET(CMAKE_C_COMPILER "{{cc_path}}") +SET(CMAKE_CXX_COMPILER "{{cxx_path}}") +SET(CMAKE_CXX_FLAGS_DISTRIBUTION "{{cxx_flags}}") +SET(CMAKE_C_FLAGS_DISTRIBUTION "{{cc_flags}}") + +% for define in defines: +add_definitions(-D{{!define}}) +% end + % for include in includes: % if include.startswith(user_home_dir): % if "windows" in systype: @@ -11,4 +20,6 @@ include_directories("$ENV{HOME}{{include.replace(user_home_dir, '').replace("\\" % else: include_directories("{{include.replace("\\", "/")}}") % end -% end \ No newline at end of file +% end + +aux_source_directory({{project_src_dir}} SRC_LIST) diff --git a/platformio/ide/tpls/eclipse/.cproject.tpl b/platformio/ide/tpls/eclipse/.cproject.tpl index b21e2aa5..fb03c356 100644 --- a/platformio/ide/tpls/eclipse/.cproject.tpl +++ b/platformio/ide/tpls/eclipse/.cproject.tpl @@ -166,6 +166,14 @@ true false + + platformio + -f -c eclipse + init --ide eclipse + true + true + false + diff --git a/platformio/managers/platform.py b/platformio/managers/platform.py index 4c148b50..ebff72c8 100644 --- a/platformio/managers/platform.py +++ b/platformio/managers/platform.py @@ -200,7 +200,7 @@ class PlatformPackagesMixin(object): return True def update_packages(self): - for name in self.get_installed_packages().keys(): + for name in self.get_installed_packages(): self.pm.update(name, self.packages[name]['version']) def are_outdated_packages(self):