Skip to content

Commit 14a65ef

Browse files
urutvarwalton-arm
authored andcommitted
config: Add support for requires config option
Support for a config option `requires` in `mbed_app.json` is added which enables application to choose required mbed libraries. if `requires` is mentioned in `mbed_app.json` then only those mbed libraries and other libraries those mbed libraries depend on will be selected. Other mbed libraries are ignored.
1 parent 14a25c9 commit 14a65ef

File tree

4 files changed

+99
-5
lines changed

4 files changed

+99
-5
lines changed

news/20201214165520.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add support for requires config option in mbed_app.json

src/mbed_tools/build/_internal/config/assemble_build_config.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from mbed_tools.build._internal.config.config import Config
1010
from mbed_tools.build._internal.config.cumulative_data import CumulativeData
1111
from mbed_tools.build._internal.config.source import Source
12-
from mbed_tools.build._internal.find_files import LabelFilter, filter_files, find_files
12+
from mbed_tools.lib.json_helpers import decode_json_file
13+
from mbed_tools.build._internal.find_files import LabelFilter, RequiresFilter, filter_files, find_files
1314

1415

1516
def assemble_config(target_attributes: dict, mbed_program_directory: Path, mbed_app_file: Optional[Path]) -> Config:
@@ -27,13 +28,23 @@ def _assemble_config_from_sources_and_lib_files(
2728
target_attributes: dict, mbed_lib_files: Iterable[Path], mbed_app_file: Optional[Path] = None
2829
) -> Config:
2930
previous_cumulative_data = None
31+
requires = list()
3032
target_source = Source.from_target(target_attributes)
3133
current_cumulative_data = CumulativeData.from_sources([target_source])
34+
if mbed_app_file:
35+
app_data = decode_json_file(mbed_app_file)
36+
requires = app_data["requires"] if "requires" in app_data else []
37+
3238
while previous_cumulative_data != current_cumulative_data:
3339
current_labels = current_cumulative_data.labels | current_cumulative_data.extra_labels
3440
filtered_files = _filter_files(
35-
mbed_lib_files, current_labels, current_cumulative_data.features, current_cumulative_data.components
41+
mbed_lib_files,
42+
current_labels,
43+
current_cumulative_data.features,
44+
current_cumulative_data.components,
45+
requires,
3646
)
47+
3748
mbed_lib_sources = [Source.from_mbed_lib(file, current_labels) for file in filtered_files]
3849
all_sources = [target_source] + mbed_lib_sources
3950
if mbed_app_file:
@@ -48,14 +59,24 @@ def _assemble_config_from_sources_and_lib_files(
4859

4960

5061
def _filter_files(
51-
files: Iterable[Path], labels: Iterable[str], features: Iterable[str], components: Iterable[str]
62+
files: Iterable[Path],
63+
labels: Iterable[str],
64+
features: Iterable[str],
65+
components: Iterable[str],
66+
requires: Iterable[str],
5267
) -> Iterable[Path]:
5368
filters = (
5469
LabelFilter("TARGET", labels),
5570
LabelFilter("FEATURE", features),
5671
LabelFilter("COMPONENT", components),
5772
)
58-
return filter_files(files, filters)
73+
filtered_files = filter_files(files, filters)
74+
75+
if not requires:
76+
return filtered_files
77+
else:
78+
requires_filter = RequiresFilter(requires)
79+
return requires_filter(filtered_files)
5980

6081

6182
def _update_target_attributes(target_attributes: dict, cumulative_data: CumulativeData) -> None:

src/mbed_tools/build/_internal/find_files.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
"""Find files in MbedOS program directory."""
66
from pathlib import Path
77
import fnmatch
8-
from typing import Callable, Iterable, Optional, List, Tuple
8+
from typing import Callable, Iterable, Optional, List, Tuple, Any, Set
9+
10+
from mbed_tools.lib.json_helpers import decode_json_file
911

1012

1113
def find_files(filename: str, directory: Path) -> List[Path]:
@@ -66,6 +68,56 @@ def filter_files(files: Iterable[Path], filters: Iterable[Callable]) -> Iterable
6668
return [file for file in files if all(f(file) for f in filters)]
6769

6870

71+
class RequiresFilter:
72+
"""Filter out mbed libraries not needed by application.
73+
74+
The 'requires' config option in mbed_app.json can specify list of mbed
75+
libraries (mbed_lib.json) that application requires. Apply 'requires'
76+
filter to remove mbed_lib.json files not required by application.
77+
"""
78+
79+
def __init__(self, requires: Iterable[str]):
80+
"""Initialise the filter attributes.
81+
82+
Args:
83+
requires: List of required mbed libraries.
84+
"""
85+
self._requires = requires
86+
87+
def __call__(self, files: Iterable[Path]) -> Iterable[Path]:
88+
"""Apply requires filter and remove mbed_lib.json files not required by application."""
89+
requires_filtered_files: Set[Path] = set()
90+
return self.apply_requires_filter(requires_filtered_files, files, self._requires)
91+
92+
@staticmethod
93+
def apply_requires_filter(
94+
requires_filtered_files: set, files: Iterable[Path], requires: Iterable[str]
95+
) -> Iterable[Path]:
96+
"""Remove mbed_lib.json files not required by application."""
97+
for required_mbed_lib in requires:
98+
for mbed_lib_path in files:
99+
lib_contents = decode_json_file(mbed_lib_path)
100+
101+
if required_mbed_lib == RequiresFilter.get_mbed_lib_name(lib_contents):
102+
requires_filtered_files.add(mbed_lib_path)
103+
104+
RequiresFilter.apply_requires_filter(
105+
requires_filtered_files, files, RequiresFilter.get_mbed_lib_requires(lib_contents)
106+
)
107+
108+
return requires_filtered_files
109+
110+
@staticmethod
111+
def get_mbed_lib_requires(lib_contents: Any) -> Any:
112+
"""Get list of mbed libraries required by appplication."""
113+
return lib_contents["requires"] if "requires" in lib_contents else []
114+
115+
@staticmethod
116+
def get_mbed_lib_name(lib_contents: Any) -> Any:
117+
"""Get mbed library name."""
118+
return lib_contents["name"]
119+
120+
69121
class LabelFilter:
70122
"""Filter out given paths using path labelling rules.
71123

tests/build/test_generate_config.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,3 +395,23 @@ def test_settings_from_multiple_libs_included(matching_target_and_filter, progra
395395

396396
assert "MBED_CONF_PLATFORM_STDIO_BAUD_RATE=9600" in config_text
397397
assert "MBED_LFS_READ_SIZE=64" in config_text
398+
399+
400+
def test_requires_config_option(program):
401+
create_mbed_app_json(program.root, requires=["bare-metal"])
402+
create_mbed_lib_json(program.mbed_os.root / "bare-metal" / "mbed_lib.json", "bare-metal", requires=["platform"])
403+
create_mbed_lib_json(
404+
program.mbed_os.root / "platform" / "mbed_lib.json", "platform", config={"stdio-baud-rate": {"value": 9600}},
405+
)
406+
create_mbed_lib_json(
407+
program.mbed_os.root / "storage" / "mbed_lib.json",
408+
"filesystem",
409+
config={"read_size": {"macro_name": "MBED_LFS_READ_SIZE", "value": 64}},
410+
)
411+
412+
generate_config("K64F", "GCC_ARM", program)
413+
414+
config_text = program.files.cmake_config_file.read_text()
415+
416+
assert "MBED_CONF_PLATFORM_STDIO_BAUD_RATE=9600" in config_text
417+
assert "MBED_LFS_READ_SIZE=64" not in config_text

0 commit comments

Comments
 (0)