mirror of
https://github.com/platformio/platformio-core.git
synced 2025-07-31 10:37:13 +02:00
Added ability to override a tool version using the "platform_packages" option // Resolve #3798
This commit is contained in:
@ -30,7 +30,13 @@ PlatformIO Core 5
|
|||||||
- Dropped automatic updates of global libraries and development platforms (`issue #4179 <https://github.com/platformio/platformio-core/issues/4179>`_)
|
- Dropped automatic updates of global libraries and development platforms (`issue #4179 <https://github.com/platformio/platformio-core/issues/4179>`_)
|
||||||
- Dropped support for "pythonPackages" field in "platform.json" manifest in favor of `Extra Python Dependencies <https://docs.platformio.org/en/latest/scripting/examples/extra_python_packages.html>`__
|
- Dropped support for "pythonPackages" field in "platform.json" manifest in favor of `Extra Python Dependencies <https://docs.platformio.org/en/latest/scripting/examples/extra_python_packages.html>`__
|
||||||
|
|
||||||
* Added support for the custom `Clang-Tidy <https://docs.platformio.org/en/latest/plus/check-tools/clang-tidy.html>`__ configuration file (`issue #4186 <https://github.com/platformio/platformio-core/issues/4186>`_)
|
* **Static Code Analysis**
|
||||||
|
|
||||||
|
- Added support for the custom `Clang-Tidy <https://docs.platformio.org/en/latest/plus/check-tools/clang-tidy.html>`__ configuration file (`issue #4186 <https://github.com/platformio/platformio-core/issues/4186>`_)
|
||||||
|
- Added ability to override a tool version using the `platform_packages <https://docs.platformio.org/en/latest/projectconf/section_env_platform.html#platform-packages>`__ option (`issue #3798 <https://github.com/platformio/platformio-core/issues/3798>`_)
|
||||||
|
|
||||||
|
* **Miscellaneous**
|
||||||
|
|
||||||
* Improved PIO Remote setup on credit-card sized computers (Raspberry Pi, BeagleBon, etc) (`issue #3865 <https://github.com/platformio/platformio-core/issues/3865>`_)
|
* Improved PIO Remote setup on credit-card sized computers (Raspberry Pi, BeagleBon, etc) (`issue #3865 <https://github.com/platformio/platformio-core/issues/3865>`_)
|
||||||
* Better handling of the failed tests using `Unit Testing <https://docs.platformio.org/en/latest/plus/unit-testing.html>`__ solution
|
* Better handling of the failed tests using `Unit Testing <https://docs.platformio.org/en/latest/plus/unit-testing.html>`__ solution
|
||||||
|
|
||||||
|
2
docs
2
docs
Submodule docs updated: d754678ca2...b953caefb7
@ -118,6 +118,7 @@ def cli(
|
|||||||
if silent
|
if silent
|
||||||
else severity or config.get("env:" + envname, "check_severity"),
|
else severity or config.get("env:" + envname, "check_severity"),
|
||||||
skip_packages=skip_packages or env_options.get("check_skip_packages"),
|
skip_packages=skip_packages or env_options.get("check_skip_packages"),
|
||||||
|
platform_packages=env_options.get("platform_packages"),
|
||||||
)
|
)
|
||||||
|
|
||||||
for tool in config.get("env:" + envname, "check_tool"):
|
for tool in config.get("env:" + envname, "check_tool"):
|
||||||
@ -166,7 +167,7 @@ def cli(
|
|||||||
if json_output:
|
if json_output:
|
||||||
click.echo(json.dumps(results_to_json(results)))
|
click.echo(json.dumps(results_to_json(results)))
|
||||||
elif not silent:
|
elif not silent:
|
||||||
print_check_summary(results)
|
print_check_summary(results, verbose=verbose)
|
||||||
|
|
||||||
# Reset custom project config
|
# Reset custom project config
|
||||||
app.set_session_var("custom_project_conf", None)
|
app.set_session_var("custom_project_conf", None)
|
||||||
@ -270,7 +271,7 @@ def print_defects_stats(results):
|
|||||||
click.echo()
|
click.echo()
|
||||||
|
|
||||||
|
|
||||||
def print_check_summary(results):
|
def print_check_summary(results, verbose=False):
|
||||||
click.echo()
|
click.echo()
|
||||||
|
|
||||||
tabular_data = []
|
tabular_data = []
|
||||||
@ -287,6 +288,8 @@ def print_check_summary(results):
|
|||||||
status_str = click.style("FAILED", fg="red")
|
status_str = click.style("FAILED", fg="red")
|
||||||
elif result.get("succeeded") is None:
|
elif result.get("succeeded") is None:
|
||||||
status_str = "IGNORED"
|
status_str = "IGNORED"
|
||||||
|
if not verbose:
|
||||||
|
continue
|
||||||
else:
|
else:
|
||||||
succeeded_nums += 1
|
succeeded_nums += 1
|
||||||
status_str = click.style("PASSED", fg="green")
|
status_str = click.style("PASSED", fg="green")
|
||||||
|
@ -20,6 +20,8 @@ import click
|
|||||||
|
|
||||||
from platformio import fs, proc
|
from platformio import fs, proc
|
||||||
from platformio.commands.check.defect import DefectItem
|
from platformio.commands.check.defect import DefectItem
|
||||||
|
from platformio.package.manager.core import get_core_package_dir
|
||||||
|
from platformio.package.meta import PackageSpec
|
||||||
from platformio.project.helpers import load_project_ide_data
|
from platformio.project.helpers import load_project_ide_data
|
||||||
|
|
||||||
|
|
||||||
@ -66,6 +68,13 @@ class CheckToolBase(object): # pylint: disable=too-many-instance-attributes
|
|||||||
self.cxx_path = data.get("cxx_path")
|
self.cxx_path = data.get("cxx_path")
|
||||||
self.toolchain_defines = self._get_toolchain_defines()
|
self.toolchain_defines = self._get_toolchain_defines()
|
||||||
|
|
||||||
|
def get_tool_dir(self, pkg_name):
|
||||||
|
for spec in self.options["platform_packages"] or []:
|
||||||
|
spec = PackageSpec(spec)
|
||||||
|
if spec.name == pkg_name:
|
||||||
|
return get_core_package_dir(pkg_name, spec=spec)
|
||||||
|
return get_core_package_dir(pkg_name)
|
||||||
|
|
||||||
def get_flags(self, tool):
|
def get_flags(self, tool):
|
||||||
result = []
|
result = []
|
||||||
flags = self.options.get("flags") or []
|
flags = self.options.get("flags") or []
|
||||||
|
@ -17,7 +17,6 @@ from os.path import join
|
|||||||
|
|
||||||
from platformio.commands.check.defect import DefectItem
|
from platformio.commands.check.defect import DefectItem
|
||||||
from platformio.commands.check.tools.base import CheckToolBase
|
from platformio.commands.check.tools.base import CheckToolBase
|
||||||
from platformio.package.manager.core import get_core_package_dir
|
|
||||||
|
|
||||||
|
|
||||||
class ClangtidyCheckTool(CheckToolBase):
|
class ClangtidyCheckTool(CheckToolBase):
|
||||||
@ -56,7 +55,7 @@ class ClangtidyCheckTool(CheckToolBase):
|
|||||||
return cmd_result["returncode"] < 2
|
return cmd_result["returncode"] < 2
|
||||||
|
|
||||||
def configure_command(self):
|
def configure_command(self):
|
||||||
tool_path = join(get_core_package_dir("tool-clangtidy"), "clang-tidy")
|
tool_path = join(self.get_tool_dir("tool-clangtidy"), "clang-tidy")
|
||||||
|
|
||||||
cmd = [tool_path, "--quiet"]
|
cmd = [tool_path, "--quiet"]
|
||||||
flags = self.get_flags("clangtidy")
|
flags = self.get_flags("clangtidy")
|
||||||
|
@ -19,11 +19,11 @@ import click
|
|||||||
from platformio import proc
|
from platformio import proc
|
||||||
from platformio.commands.check.defect import DefectItem
|
from platformio.commands.check.defect import DefectItem
|
||||||
from platformio.commands.check.tools.base import CheckToolBase
|
from platformio.commands.check.tools.base import CheckToolBase
|
||||||
from platformio.package.manager.core import get_core_package_dir
|
|
||||||
|
|
||||||
|
|
||||||
class CppcheckCheckTool(CheckToolBase):
|
class CppcheckCheckTool(CheckToolBase):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(CppcheckCheckTool, self).__init__(*args, **kwargs)
|
||||||
self._field_delimiter = "<&PIO&>"
|
self._field_delimiter = "<&PIO&>"
|
||||||
self._buffer = ""
|
self._buffer = ""
|
||||||
self.defect_fields = [
|
self.defect_fields = [
|
||||||
@ -36,7 +36,6 @@ class CppcheckCheckTool(CheckToolBase):
|
|||||||
"cwe",
|
"cwe",
|
||||||
"id",
|
"id",
|
||||||
]
|
]
|
||||||
super(CppcheckCheckTool, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def tool_output_filter(self, line): # pylint: disable=arguments-differ
|
def tool_output_filter(self, line): # pylint: disable=arguments-differ
|
||||||
if (
|
if (
|
||||||
@ -103,7 +102,7 @@ class CppcheckCheckTool(CheckToolBase):
|
|||||||
return DefectItem(**args)
|
return DefectItem(**args)
|
||||||
|
|
||||||
def configure_command(self, language, src_file): # pylint: disable=arguments-differ
|
def configure_command(self, language, src_file): # pylint: disable=arguments-differ
|
||||||
tool_path = os.path.join(get_core_package_dir("tool-cppcheck"), "cppcheck")
|
tool_path = os.path.join(self.get_tool_dir("tool-cppcheck"), "cppcheck")
|
||||||
|
|
||||||
cmd = [
|
cmd = [
|
||||||
tool_path,
|
tool_path,
|
||||||
|
@ -23,22 +23,21 @@ from platformio import proc
|
|||||||
from platformio.commands.check.defect import DefectItem
|
from platformio.commands.check.defect import DefectItem
|
||||||
from platformio.commands.check.tools.base import CheckToolBase
|
from platformio.commands.check.tools.base import CheckToolBase
|
||||||
from platformio.compat import IS_WINDOWS
|
from platformio.compat import IS_WINDOWS
|
||||||
from platformio.package.manager.core import get_core_package_dir
|
|
||||||
|
|
||||||
|
|
||||||
class PvsStudioCheckTool(CheckToolBase): # pylint: disable=too-many-instance-attributes
|
class PvsStudioCheckTool(CheckToolBase): # pylint: disable=too-many-instance-attributes
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(PvsStudioCheckTool, self).__init__(*args, **kwargs)
|
||||||
self._tmp_dir = tempfile.mkdtemp(prefix="piocheck")
|
self._tmp_dir = tempfile.mkdtemp(prefix="piocheck")
|
||||||
self._tmp_preprocessed_file = self._generate_tmp_file_path() + ".i"
|
self._tmp_preprocessed_file = self._generate_tmp_file_path() + ".i"
|
||||||
self._tmp_output_file = self._generate_tmp_file_path() + ".pvs"
|
self._tmp_output_file = self._generate_tmp_file_path() + ".pvs"
|
||||||
self._tmp_cfg_file = self._generate_tmp_file_path() + ".cfg"
|
self._tmp_cfg_file = self._generate_tmp_file_path() + ".cfg"
|
||||||
self._tmp_cmd_file = self._generate_tmp_file_path() + ".cmd"
|
self._tmp_cmd_file = self._generate_tmp_file_path() + ".cmd"
|
||||||
self.tool_path = os.path.join(
|
self.tool_path = os.path.join(
|
||||||
get_core_package_dir("tool-pvs-studio"),
|
self.get_tool_dir("tool-pvs-studio"),
|
||||||
"x64" if IS_WINDOWS else "bin",
|
"x64" if IS_WINDOWS else "bin",
|
||||||
"pvs-studio",
|
"pvs-studio",
|
||||||
)
|
)
|
||||||
super(PvsStudioCheckTool, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
with open(self._tmp_cfg_file, mode="w", encoding="utf8") as fp:
|
with open(self._tmp_cfg_file, mode="w", encoding="utf8") as fp:
|
||||||
fp.write(
|
fp.write(
|
||||||
@ -70,7 +69,7 @@ class PvsStudioCheckTool(CheckToolBase): # pylint: disable=too-many-instance-at
|
|||||||
|
|
||||||
def _demangle_report(self, output_file):
|
def _demangle_report(self, output_file):
|
||||||
converter_tool = os.path.join(
|
converter_tool = os.path.join(
|
||||||
get_core_package_dir("tool-pvs-studio"),
|
self.get_tool_dir("tool-pvs-studio"),
|
||||||
"HtmlGenerator" if IS_WINDOWS else os.path.join("bin", "plog-converter"),
|
"HtmlGenerator" if IS_WINDOWS else os.path.join("bin", "plog-converter"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,11 +38,11 @@ def get_installed_core_packages():
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def get_core_package_dir(name, auto_install=True):
|
def get_core_package_dir(name, spec=None, auto_install=True):
|
||||||
if name not in __core_packages__:
|
if name not in __core_packages__:
|
||||||
raise exception.PlatformioException("Please upgrade PlatformIO Core")
|
raise exception.PlatformioException("Please upgrade PlatformIO Core")
|
||||||
pm = ToolPackageManager()
|
pm = ToolPackageManager()
|
||||||
spec = PackageSpec(
|
spec = spec or PackageSpec(
|
||||||
owner="platformio", name=name, requirements=__core_packages__[name]
|
owner="platformio", name=name, requirements=__core_packages__[name]
|
||||||
)
|
)
|
||||||
pkg = pm.get_package(spec)
|
pkg = pm.get_package(spec)
|
||||||
|
Reference in New Issue
Block a user