spl-core 4.1.1__py3-none-any.whl → 4.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- spl_core/__init__.py +1 -1
- spl_core/__run.py +12 -0
- spl_core/common/command_line_executor.py +3 -1
- spl_core/kickstart/create.py +66 -0
- spl_core/kickstart/templates/application/.vscode/cmake-variants.json +20 -0
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/application}/KConfig +2 -2
- spl_core/kickstart/templates/application/src/greeter/CMakeLists.txt +3 -0
- spl_core/kickstart/templates/application/src/greeter/doc/_images/screenshot.png +0 -0
- spl_core/kickstart/templates/application/src/greeter/doc/index.rst +26 -0
- spl_core/kickstart/templates/application/src/greeter/src/greeter.c +24 -0
- spl_core/kickstart/templates/application/src/greeter/src/greeter.h +6 -0
- spl_core/kickstart/templates/application/src/greeter/test/test_greeter.cc +27 -0
- spl_core/{project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/doc/index.rst → kickstart/templates/application/src/main/doc/index.rst} +6 -2
- spl_core/kickstart/templates/application/src/main/src/main.c +13 -0
- spl_core/kickstart/templates/application/test/EnglishVariant/test__EnglishVariant.py +16 -0
- spl_core/kickstart/templates/application/test/German/test__GermanVariant.py +16 -0
- spl_core/kickstart/templates/application/variants/EnglishVariant/parts.cmake +2 -0
- spl_core/kickstart/templates/application/variants/GermanVariant/config.cmake +1 -0
- spl_core/kickstart/templates/application/variants/GermanVariant/config.txt +13 -0
- spl_core/kickstart/templates/application/variants/GermanVariant/parts.cmake +2 -0
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.gitignore +3 -0
- spl_core/kickstart/templates/project/.vscode/extensions.json +20 -0
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/tasks.json +24 -4
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/CMakeLists.txt +9 -1
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/build.ps1 +47 -17
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/conf.py +8 -6
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/Doxyfile.in +2 -2
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/common/index.rst +1 -1
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/components/index.rst +2 -3
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/doxygen-awesome/doxygen-awesome.css +16 -16
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/test_report_template.txt +0 -2
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/index.rst +1 -0
- spl_core/kickstart/templates/project/pipfile +6 -0
- spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/pytest.ini +2 -1
- spl_core/kickstart/templates/project/scoopfile.json +14 -0
- spl_core/{project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_tools -%} tools {%- endif %}/toolchains/clang/toolchain.cmake → kickstart/templates/project/tools/toolchains/clang/toolchain.cmake} +1 -1
- spl_core/main.py +44 -0
- spl_core/test_utils/base_variant_test_runner.py +17 -0
- spl_core/test_utils/spl_build.py +85 -0
- {spl_core-4.1.1.dist-info → spl_core-4.2.0.dist-info}/METADATA +14 -2
- spl_core-4.2.0.dist-info/RECORD +60 -0
- spl_core/common/cmake.py +0 -52
- spl_core/project_creator/creator.py +0 -133
- spl_core/project_creator/templates/project/cookiecutter.json +0 -14
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/.flake8 +0 -2
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/.vscode/cmake-variants.json +0 -18
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/.vscode/extensions.json +0 -18
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/LICENSE +0 -21
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/Pipfile +0 -30
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/README.md +0 -7
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/install-mandatory.bat +0 -1
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/scoopfile.json +0 -47
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/test/test_build.py +0 -39
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/test/test_unittests.py +0 -28
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/test/utils.py +0 -26
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/tools/setup/git-config.ps1 +0 -8
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/CMakeLists.txt +0 -3
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/_images/screenshot.png +0 -0
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/design.rst +0 -25
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/index.rst +0 -8
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/src/component.c +0 -31
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/src/component.h +0 -1
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/test/test_component.cc +0 -60
- spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/src/main.c +0 -17
- spl_core/project_creator/templates/variant/cookiecutter.json +0 -4
- spl_core/project_creator/templates/variant/{{cookiecutter.flavor}}/{{cookiecutter.subsystem}}/config.txt +0 -1
- spl_core/project_creator/templates/variant/{{cookiecutter.flavor}}/{{cookiecutter.subsystem}}/parts.cmake +0 -2
- spl_core/project_creator/variant.py +0 -23
- spl_core/project_creator/workspace_artifacts.py +0 -36
- spl_core-4.1.1.dist-info/RECORD +0 -68
- /spl_core/{project_creator → kickstart}/__init__.py +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %} → kickstart/templates/application/src}/main/CMakeLists.txt +0 -0
- /spl_core/{project_creator/templates/variant/{{cookiecutter.flavor}}/{{cookiecutter.subsystem}} → kickstart/templates/application/variants/EnglishVariant}/config.cmake +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/cmake-kits.json +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/launch.json +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/settings.json +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/build.bat +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/doxygen-awesome/LICENSE +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/software_architecture/index.rst +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/software_requirements/index.rst +0 -0
- /spl_core/{project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_tools -%} tools {%- endif %} → kickstart/templates/project/tools}/toolchains/gcc/toolchain.cmake +0 -0
- {spl_core-4.1.1.dist-info → spl_core-4.2.0.dist-info}/LICENSE +0 -0
- {spl_core-4.1.1.dist-info → spl_core-4.2.0.dist-info}/WHEEL +0 -0
|
@@ -204,7 +204,7 @@ html {
|
|
|
204
204
|
--code-background: #2a2c2f;
|
|
205
205
|
|
|
206
206
|
--tablehead-background: #2a2c2f;
|
|
207
|
-
|
|
207
|
+
|
|
208
208
|
--blockquote-background: #222325;
|
|
209
209
|
--blockquote-foreground: #7e8c92;
|
|
210
210
|
|
|
@@ -888,7 +888,7 @@ div.header {
|
|
|
888
888
|
flex-wrap: nowrap;
|
|
889
889
|
align-items: flex-start;
|
|
890
890
|
}
|
|
891
|
-
|
|
891
|
+
|
|
892
892
|
div.contents .textblock {
|
|
893
893
|
min-width: 200px;
|
|
894
894
|
flex-grow: 1;
|
|
@@ -980,21 +980,21 @@ html.dark-mode div.contents .dotgraph iframe
|
|
|
980
980
|
h2.groupheader {
|
|
981
981
|
border-bottom: 0px;
|
|
982
982
|
color: var(--page-foreground-color);
|
|
983
|
-
box-shadow:
|
|
984
|
-
100px 0 var(--page-background-color),
|
|
983
|
+
box-shadow:
|
|
984
|
+
100px 0 var(--page-background-color),
|
|
985
985
|
-100px 0 var(--page-background-color),
|
|
986
986
|
100px 0.75px var(--separator-color),
|
|
987
987
|
-100px 0.75px var(--separator-color),
|
|
988
|
-
500px 0 var(--page-background-color),
|
|
988
|
+
500px 0 var(--page-background-color),
|
|
989
989
|
-500px 0 var(--page-background-color),
|
|
990
990
|
500px 0.75px var(--separator-color),
|
|
991
991
|
-500px 0.75px var(--separator-color),
|
|
992
|
-
900px 0 var(--page-background-color),
|
|
992
|
+
900px 0 var(--page-background-color),
|
|
993
993
|
-900px 0 var(--page-background-color),
|
|
994
994
|
900px 0.75px var(--separator-color),
|
|
995
995
|
-900px 0.75px var(--separator-color),
|
|
996
996
|
1400px 0 var(--page-background-color),
|
|
997
|
-
-1400px 0 var(--page-background-color),
|
|
997
|
+
-1400px 0 var(--page-background-color),
|
|
998
998
|
1400px 0.75px var(--separator-color),
|
|
999
999
|
-1400px 0.75px var(--separator-color),
|
|
1000
1000
|
1900px 0 var(--page-background-color),
|
|
@@ -1165,8 +1165,8 @@ div.toc li a.aboveActive {
|
|
|
1165
1165
|
|
|
1166
1166
|
div.contents .toc.interactive > h3::before {
|
|
1167
1167
|
content: "";
|
|
1168
|
-
width: 0;
|
|
1169
|
-
height: 0;
|
|
1168
|
+
width: 0;
|
|
1169
|
+
height: 0;
|
|
1170
1170
|
border-left: 4px solid transparent;
|
|
1171
1171
|
border-right: 4px solid transparent;
|
|
1172
1172
|
border-top: 5px solid var(--primary-color);
|
|
@@ -1857,8 +1857,8 @@ table.memberdecls img[src="closed.png"],
|
|
|
1857
1857
|
table.memberdecls img[src="open.png"],
|
|
1858
1858
|
div.dynheader img[src="open.png"],
|
|
1859
1859
|
div.dynheader img[src="closed.png"] {
|
|
1860
|
-
width: 0;
|
|
1861
|
-
height: 0;
|
|
1860
|
+
width: 0;
|
|
1861
|
+
height: 0;
|
|
1862
1862
|
border-left: 4px solid transparent;
|
|
1863
1863
|
border-right: 4px solid transparent;
|
|
1864
1864
|
border-top: 5px solid var(--primary-color);
|
|
@@ -1876,7 +1876,7 @@ table.memberdecls img {
|
|
|
1876
1876
|
table.memberdecls img[src="closed.png"],
|
|
1877
1877
|
div.dynheader img[src="closed.png"] {
|
|
1878
1878
|
transform: rotate(-90deg);
|
|
1879
|
-
|
|
1879
|
+
|
|
1880
1880
|
}
|
|
1881
1881
|
|
|
1882
1882
|
.compoundTemplParams {
|
|
@@ -1919,7 +1919,7 @@ div.dynheader img[src="closed.png"] {
|
|
|
1919
1919
|
margin-bottom: calc(0px - var(--page-font-size));
|
|
1920
1920
|
}
|
|
1921
1921
|
|
|
1922
|
-
table.memberdecls .memItemRight,
|
|
1922
|
+
table.memberdecls .memItemRight,
|
|
1923
1923
|
table.memberdecls .mdescRight,
|
|
1924
1924
|
table.memberdecls .memTemplItemRight {
|
|
1925
1925
|
border-top: 0;
|
|
@@ -2105,8 +2105,8 @@ html.dark-mode .iconfopen, html.dark-mode .iconfclosed {
|
|
|
2105
2105
|
background-color: transparent;
|
|
2106
2106
|
}
|
|
2107
2107
|
|
|
2108
|
-
/*
|
|
2109
|
-
Class Index Doxygen 1.8
|
|
2108
|
+
/*
|
|
2109
|
+
Class Index Doxygen 1.8
|
|
2110
2110
|
*/
|
|
2111
2111
|
|
|
2112
2112
|
table.classindex {
|
|
@@ -2251,7 +2251,7 @@ div.contents .toc::-webkit-scrollbar-thumb,
|
|
|
2251
2251
|
background-color: transparent;
|
|
2252
2252
|
border: var(--webkit-scrollbar-padding) solid transparent;
|
|
2253
2253
|
border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding));
|
|
2254
|
-
background-clip: padding-box;
|
|
2254
|
+
background-clip: padding-box;
|
|
2255
2255
|
}
|
|
2256
2256
|
|
|
2257
2257
|
#nav-tree:hover::-webkit-scrollbar-thumb,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# TODO: caching required due to cmake tools extension issue: https://github.com/microsoft/vscode-cmake-tools/issues/1188
|
|
2
2
|
# TODO: get debugging running (lldb-mi not found in any current package, switching back to gcc)
|
|
3
3
|
set(CMAKE_C_COMPILER clang CACHE STRING "C Compiler")
|
|
4
|
-
# TODO: clarify why llvm-cov produces invalid gcov files (contain blank lines),
|
|
4
|
+
# TODO: clarify why llvm-cov produces invalid gcov files (contain blank lines), related GCOVR issue: https://github.com/gcovr/gcovr/issues/331
|
|
5
5
|
set(GCOVR_ADDITIONAL_OPTIONS --gcov-executable \"llvm-cov gcov\" --gcov-ignore-parse-errors --html-title \"Code Coverage Report \(tool suite: LLVM Clang\)\")
|
|
6
6
|
|
|
7
7
|
set(CMAKE_CXX_COMPILER clang++ CACHE STRING "CXX Compiler")
|
spl_core/main.py
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import typer
|
|
5
|
+
from py_app_dev.core.exceptions import UserNotificationException
|
|
6
|
+
from py_app_dev.core.logging import logger, setup_logger, time_it
|
|
7
|
+
|
|
8
|
+
from spl_core import __version__
|
|
9
|
+
from spl_core.kickstart.create import KickstartProject
|
|
10
|
+
|
|
11
|
+
package_name = "please"
|
|
12
|
+
|
|
13
|
+
app = typer.Typer(name=package_name, help="Software Product Line Support for CMake.", no_args_is_help=True, add_completion=False)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@app.callback(invoke_without_command=True)
|
|
17
|
+
def version(
|
|
18
|
+
version: bool = typer.Option(None, "--version", "-v", is_eager=True, help="Show version and exit."),
|
|
19
|
+
) -> None:
|
|
20
|
+
if version:
|
|
21
|
+
typer.echo(f"{package_name} {__version__}")
|
|
22
|
+
raise typer.Exit()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@app.command()
|
|
26
|
+
@time_it("init")
|
|
27
|
+
def init(
|
|
28
|
+
project_dir: Path = typer.Option(Path.cwd().absolute(), help="The project directory"), # noqa: B008
|
|
29
|
+
force: bool = typer.Option(False, help="Force the initialization of the project even if the directory is not empty."),
|
|
30
|
+
) -> None:
|
|
31
|
+
KickstartProject(project_dir, force).run()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def main() -> None:
|
|
35
|
+
try:
|
|
36
|
+
setup_logger()
|
|
37
|
+
app()
|
|
38
|
+
except UserNotificationException as e:
|
|
39
|
+
logger.error(f"{e}")
|
|
40
|
+
sys.exit(1)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
if __name__ == "__main__":
|
|
44
|
+
main()
|
|
@@ -39,6 +39,18 @@ class BaseVariantTestRunner(ABC):
|
|
|
39
39
|
Path("coverage/index.html"),
|
|
40
40
|
]
|
|
41
41
|
|
|
42
|
+
@property
|
|
43
|
+
def create_artifacts_archive(self) -> bool:
|
|
44
|
+
return True
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def create_artifacts_json(self) -> bool:
|
|
48
|
+
return True
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def expected_archive_artifacts(self) -> List[Path]:
|
|
52
|
+
return self.expected_build_artifacts
|
|
53
|
+
|
|
42
54
|
def assert_artifact_exists(self, dir: Path, artifact: Path) -> None:
|
|
43
55
|
if artifact.is_absolute():
|
|
44
56
|
assert artifact.exists(), f"Artifact {artifact} does not exist" # noqa: S101
|
|
@@ -50,6 +62,11 @@ class BaseVariantTestRunner(ABC):
|
|
|
50
62
|
assert 0 == spl_build.execute(target="all") # noqa: S101
|
|
51
63
|
for artifact in self.expected_build_artifacts:
|
|
52
64
|
self.assert_artifact_exists(dir=spl_build.build_dir, artifact=artifact)
|
|
65
|
+
if self.create_artifacts_archive:
|
|
66
|
+
# create artifacts archive
|
|
67
|
+
spl_build.create_artifacts_archive(self.expected_archive_artifacts)
|
|
68
|
+
if self.create_artifacts_json:
|
|
69
|
+
spl_build.create_artifacts_json(self.expected_archive_artifacts)
|
|
53
70
|
|
|
54
71
|
def test_unittest(self) -> None:
|
|
55
72
|
spl_build: SplBuild = SplBuild(variant=self.variant, build_kit="test")
|
spl_core/test_utils/spl_build.py
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import json
|
|
1
2
|
import time
|
|
3
|
+
import zipfile
|
|
4
|
+
from dataclasses import dataclass
|
|
2
5
|
from pathlib import Path
|
|
3
6
|
from typing import List, Optional
|
|
4
7
|
|
|
@@ -7,6 +10,34 @@ from py_app_dev.core.logging import time_it
|
|
|
7
10
|
from spl_core.common.command_line_executor import CommandLineExecutor
|
|
8
11
|
|
|
9
12
|
|
|
13
|
+
@dataclass
|
|
14
|
+
class ArchiveArtifact:
|
|
15
|
+
archive_path: Path
|
|
16
|
+
absolute_path: Path
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ArtifactsCollection:
|
|
20
|
+
def __init__(self, artifacts: List[Path], build_dir: Path):
|
|
21
|
+
self.archive_artifacts: List[ArchiveArtifact] = []
|
|
22
|
+
for artifact in artifacts:
|
|
23
|
+
if artifact.is_absolute():
|
|
24
|
+
artifact_path = artifact
|
|
25
|
+
else:
|
|
26
|
+
artifact_path = Path.joinpath(build_dir.absolute(), artifact)
|
|
27
|
+
if artifact_path.is_dir():
|
|
28
|
+
for artifact in artifact_path.glob("**/*"):
|
|
29
|
+
if artifact.is_file():
|
|
30
|
+
if artifact_path.is_relative_to(build_dir.absolute()):
|
|
31
|
+
self.archive_artifacts.append(ArchiveArtifact(archive_path=artifact.relative_to(build_dir.absolute()), absolute_path=artifact.absolute()))
|
|
32
|
+
else:
|
|
33
|
+
self.archive_artifacts.append(ArchiveArtifact(archive_path=Path(artifact.name), absolute_path=artifact.absolute()))
|
|
34
|
+
else:
|
|
35
|
+
if artifact_path.is_relative_to(build_dir.absolute()):
|
|
36
|
+
self.archive_artifacts.append(ArchiveArtifact(archive_path=artifact_path.relative_to(build_dir.absolute()), absolute_path=artifact_path.absolute()))
|
|
37
|
+
else:
|
|
38
|
+
self.archive_artifacts.append(ArchiveArtifact(archive_path=Path(artifact_path.name), absolute_path=artifact_path.absolute()))
|
|
39
|
+
|
|
40
|
+
|
|
10
41
|
class SplBuild:
|
|
11
42
|
"""Class for building an SPL repository."""
|
|
12
43
|
|
|
@@ -75,3 +106,57 @@ class SplBuild:
|
|
|
75
106
|
else:
|
|
76
107
|
break
|
|
77
108
|
return return_code
|
|
109
|
+
|
|
110
|
+
def create_artifacts_archive(self, expected_artifacts: List[Path]) -> Path:
|
|
111
|
+
"""
|
|
112
|
+
Create a zip file containing the collected artifacts.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
expected_artifacts: List of Path of artifacts which should be archived
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Path: The path to the created zip file.
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
Exception: If there is an error creating the zip file.
|
|
122
|
+
|
|
123
|
+
"""
|
|
124
|
+
zip_path = self.build_dir / "artifacts.zip"
|
|
125
|
+
|
|
126
|
+
# Delete the file if it already exists
|
|
127
|
+
if zip_path.exists():
|
|
128
|
+
zip_path.unlink()
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
with zipfile.ZipFile(zip_path, "w") as zip_file:
|
|
132
|
+
artifacts_collection = ArtifactsCollection(artifacts=expected_artifacts, build_dir=self.build_dir)
|
|
133
|
+
for artifact in artifacts_collection.archive_artifacts:
|
|
134
|
+
zip_file.write(artifact.absolute_path, arcname=artifact.archive_path)
|
|
135
|
+
print(f"Zip file created at: {zip_path}")
|
|
136
|
+
return zip_path
|
|
137
|
+
except Exception as e:
|
|
138
|
+
print(f"Error creating artifacts zip file: {e}")
|
|
139
|
+
raise e
|
|
140
|
+
|
|
141
|
+
def create_artifacts_json(self, expected_artifacts: List[Path]) -> Path:
|
|
142
|
+
"""
|
|
143
|
+
Create a JSON file listing the collected artifacts.
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
Path: The path to the created JSON file.
|
|
147
|
+
|
|
148
|
+
Raises:
|
|
149
|
+
Exception: If there is an error creating the JSON file.
|
|
150
|
+
|
|
151
|
+
"""
|
|
152
|
+
artifacts_collection = ArtifactsCollection(artifacts=expected_artifacts, build_dir=self.build_dir)
|
|
153
|
+
json_content = {
|
|
154
|
+
"variant": self.variant,
|
|
155
|
+
"build_kit": self.build_kit,
|
|
156
|
+
"artifacts": [str(artifact.archive_path.as_posix()) for artifact in artifacts_collection.archive_artifacts],
|
|
157
|
+
}
|
|
158
|
+
json_path = self.build_dir / "artifacts.json"
|
|
159
|
+
|
|
160
|
+
json_path.write_text(json.dumps(json_content, indent=4))
|
|
161
|
+
|
|
162
|
+
return json_path
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: spl-core
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.2.0
|
|
4
4
|
Summary: Software Product Line Support for CMake
|
|
5
5
|
Home-page: https://github.com/avengineers/spl-core
|
|
6
6
|
License: MIT
|
|
@@ -17,10 +17,22 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Classifier: Topic :: Software Development :: Libraries
|
|
19
19
|
Requires-Dist: cookiecutter (==2.1.1)
|
|
20
|
+
Requires-Dist: doxysphinx (>=3.3.7,<4.0.0)
|
|
20
21
|
Requires-Dist: gcovr
|
|
21
22
|
Requires-Dist: hammocking
|
|
22
23
|
Requires-Dist: kconfiglib
|
|
23
24
|
Requires-Dist: py-app-dev (>=2.1.0,<3.0.0)
|
|
25
|
+
Requires-Dist: sphinx (>=7.3.5,<8.0.0)
|
|
26
|
+
Requires-Dist: sphinx-copybutton (>=0.5.2,<0.6.0)
|
|
27
|
+
Requires-Dist: sphinx-needs (>=2.0.0,<3.0.0)
|
|
28
|
+
Requires-Dist: sphinx-new-tab-link (>=0.4.0,<0.5.0)
|
|
29
|
+
Requires-Dist: sphinx-rtd-size (>=0.2.0,<0.3.0)
|
|
30
|
+
Requires-Dist: sphinx-rtd-theme (>=2.0.0,<3.0.0)
|
|
31
|
+
Requires-Dist: sphinx-test-reports (>=1.0.2,<2.0.0)
|
|
32
|
+
Requires-Dist: sphinxcontrib-datatemplates (>=0.11.0,<0.12.0)
|
|
33
|
+
Requires-Dist: sphinxcontrib-mermaid (>=0.9.2,<0.10.0)
|
|
34
|
+
Requires-Dist: sphinxcontrib-plantuml (>=0.29,<0.30)
|
|
35
|
+
Requires-Dist: typer[all] (>=0.12.3,<0.13.0)
|
|
24
36
|
Project-URL: Bug Tracker, https://github.com/avengineers/spl-core/issues
|
|
25
37
|
Project-URL: Changelog, https://github.com/avengineers/spl-core/blob/develop/CHANGELOG.md
|
|
26
38
|
Project-URL: Documentation, https://spl-core.readthedocs.io
|
|
@@ -55,7 +67,7 @@ _SPL Core_ is our CMake module to support multiple projects as variants of one S
|
|
|
55
67
|
With the integrated project creator you can create a new SPL workspace, e.g.:
|
|
56
68
|
|
|
57
69
|
```powershell
|
|
58
|
-
pipenv run python src/project_creator/creator.py workspace --name MyProject --variant
|
|
70
|
+
pipenv run python src/project_creator/creator.py workspace --name MyProject --variant MyVariant --out_dir C:\dev
|
|
59
71
|
```
|
|
60
72
|
|
|
61
73
|
Note: one can use the `--variant` argument several times to create a project with multiple variants.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
spl_core/__init__.py,sha256=pU56ZDjCDnUbINe39hYuKXHy9UI9Tf4xjWgnxBlxEDk,22
|
|
2
|
+
spl_core/__run.py,sha256=DphnN7_Bjiw_mOOztsHxTDHS8snz1g2MMWAaJpZxPKM,361
|
|
3
|
+
spl_core/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
spl_core/common/command_line_executor.py,sha256=ID0Hw_ETduDoeHNDLJtbRPVPQTJPh_Zt7PdrBW2pAG4,2079
|
|
5
|
+
spl_core/common/path.py,sha256=sDujd3n4XP1XGjHc7ImXEdjihO6A8BOIDbKCf7HgQ0Y,462
|
|
6
|
+
spl_core/gcov_maid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
spl_core/gcov_maid/gcov_maid.py,sha256=5rPIeL9daQDm5ad9xzaIhlDf_0H5g6r2zHo8WN8T4-8,1455
|
|
8
|
+
spl_core/kconfig/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
+
spl_core/kconfig/kconfig.py,sha256=JLBSUvPnc5dEZNWHeuMTFgP9iBgtzEV6tnrhE4-5oCg,9795
|
|
10
|
+
spl_core/kickstart/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
+
spl_core/kickstart/create.py,sha256=Lv7-3nb71HKmclHBSCliLKiFdmAIOBl1VTvA39YboLQ,2741
|
|
12
|
+
spl_core/kickstart/templates/application/.vscode/cmake-variants.json,sha256=sF_dsbdrDwhfIo5EfGzvIgMZZcz5Z5k4Al0qrS8j7AY,553
|
|
13
|
+
spl_core/kickstart/templates/application/KConfig,sha256=tl_9L535AhJdCHBhi4xDez3sK_Yc78e0KBekg5e-48w,589
|
|
14
|
+
spl_core/kickstart/templates/application/src/greeter/CMakeLists.txt,sha256=MX7J58ZkxUNRshAUb1AdT_qO-XJABVO6vfpgEHeVp1g,117
|
|
15
|
+
spl_core/kickstart/templates/application/src/greeter/doc/_images/screenshot.png,sha256=LsjExuSbDPsy3BzpPrfYMsD2fwYdNZzKS56s6aSn8Rc,11090
|
|
16
|
+
spl_core/kickstart/templates/application/src/greeter/doc/index.rst,sha256=60b9gaeeCKp-J0nnB5f8Ndk8g18NbGQobuCj0WfPNsQ,500
|
|
17
|
+
spl_core/kickstart/templates/application/src/greeter/src/greeter.c,sha256=ikOfwUoSZekDHjVb9nnh_99cOQBmB8nNxgshl12cGc0,431
|
|
18
|
+
spl_core/kickstart/templates/application/src/greeter/src/greeter.h,sha256=CFvhZ41kcD9XC3T6sJtWntkRYxR6HI8xY5xGpvAy9Jk,99
|
|
19
|
+
spl_core/kickstart/templates/application/src/greeter/test/test_greeter.cc,sha256=Vg6u4Cn1Q6ntsdc3JlK1VTiPT3tDejvHD-280QKuAhc,482
|
|
20
|
+
spl_core/kickstart/templates/application/src/main/CMakeLists.txt,sha256=9gu3ydUv1cT3WjXw944lAvVK0MzJaCD1zKqvRZmTt_o,68
|
|
21
|
+
spl_core/kickstart/templates/application/src/main/doc/index.rst,sha256=vJah60GsBx70m-Q1d9sR34cSziwA7wMR-10jMSSlO6c,303
|
|
22
|
+
spl_core/kickstart/templates/application/src/main/src/main.c,sha256=vNj-JGFqD70h_AVpjFiHeB6pvbW2OpZeSF7munyY6tY,215
|
|
23
|
+
spl_core/kickstart/templates/application/test/EnglishVariant/test__EnglishVariant.py,sha256=P66U-6oCKTwLQ_tFFVPEyRbTvfQjKoREnqqWXou4OOc,437
|
|
24
|
+
spl_core/kickstart/templates/application/test/German/test__GermanVariant.py,sha256=v4O8mbDA7tAHNus2fQ4MJvXp6kBLyersBy7J-rgpoq4,436
|
|
25
|
+
spl_core/kickstart/templates/application/variants/EnglishVariant/config.cmake,sha256=SbFIGrclTicjW-TNH4QlUilaSs1CCmL882PBrlVau8g,94
|
|
26
|
+
spl_core/kickstart/templates/application/variants/EnglishVariant/parts.cmake,sha256=CnNxm2Cf2X_0vkS52xj5WNTLffVQP9CflkEaDEtlxXs,61
|
|
27
|
+
spl_core/kickstart/templates/application/variants/GermanVariant/config.cmake,sha256=SbFIGrclTicjW-TNH4QlUilaSs1CCmL882PBrlVau8g,94
|
|
28
|
+
spl_core/kickstart/templates/application/variants/GermanVariant/config.txt,sha256=6gfkKIlqKPOK2pI4TIGN58FG7VCRfgcFLzR9HPog4dg,188
|
|
29
|
+
spl_core/kickstart/templates/application/variants/GermanVariant/parts.cmake,sha256=CnNxm2Cf2X_0vkS52xj5WNTLffVQP9CflkEaDEtlxXs,61
|
|
30
|
+
spl_core/kickstart/templates/project/.gitignore,sha256=Ibd6YbqO2UPfauJzrdgY7z4ar0aPmEwYQ-ncDKzZrlg,638
|
|
31
|
+
spl_core/kickstart/templates/project/.vscode/cmake-kits.json,sha256=oLn_-InkXE3Th6OL5hlSxBZsx2dBaKShrHZVcyAcfFU,269
|
|
32
|
+
spl_core/kickstart/templates/project/.vscode/extensions.json,sha256=49RYati_P9i3zdiKuaTIkNQnA1uH1eIUd6DusIa9TT0,624
|
|
33
|
+
spl_core/kickstart/templates/project/.vscode/launch.json,sha256=30-tsNapUNNIvVDohdIf4SEnHrHh8qbWuTjLJjsMcEY,1103
|
|
34
|
+
spl_core/kickstart/templates/project/.vscode/settings.json,sha256=w2zAkNk4P0eZC5zDxiG7jKy35Jl37TyVDg38lXjq3hw,1369
|
|
35
|
+
spl_core/kickstart/templates/project/.vscode/tasks.json,sha256=fPaiY-vpI-3wMK0dpc3LZma4-YYyaI_xc6uQrEUf6sw,3434
|
|
36
|
+
spl_core/kickstart/templates/project/CMakeLists.txt,sha256=pufvVYIpu56BQv04JgJMBzi0DG_pLN0S7d0s4zU8WRg,1817
|
|
37
|
+
spl_core/kickstart/templates/project/build.bat,sha256=HlOqePYRoHTrp7v6oQ551dXI-qCymGCG0gQ9Au6bpos,73
|
|
38
|
+
spl_core/kickstart/templates/project/build.ps1,sha256=oQSCxUoleJSkBSRW3nTqg_23eANh9mfjlJPgTfH21Ak,11057
|
|
39
|
+
spl_core/kickstart/templates/project/conf.py,sha256=wGhSzSyUx5otw3kPeOzIEKFIxA-Z70K-foUuQWYBY64,6775
|
|
40
|
+
spl_core/kickstart/templates/project/doc/Doxyfile.in,sha256=NOj07VHEUeEfYIrETKg--G2ShBXMqFh61q1FdhfY-5U,123953
|
|
41
|
+
spl_core/kickstart/templates/project/doc/common/index.rst,sha256=tOqSYkFdxIJtBcllwMwWEkw9_cbbAsg9NPU2AanyJNc,91
|
|
42
|
+
spl_core/kickstart/templates/project/doc/components/index.rst,sha256=1n4qdJD38Q-sRaiqW3rF2rQK9ag3OchslA8uTzmarkM,590
|
|
43
|
+
spl_core/kickstart/templates/project/doc/doxygen-awesome/LICENSE,sha256=49p1TD9lfMeFlPouijKDZl94x0PfJIX6nkmKiXMFEZE,1072
|
|
44
|
+
spl_core/kickstart/templates/project/doc/doxygen-awesome/doxygen-awesome.css,sha256=bNr_9KABkHTxWMkHqXJcXXxEScP2nlnJ2eV9me1Vjmw,63045
|
|
45
|
+
spl_core/kickstart/templates/project/doc/software_architecture/index.rst,sha256=Oq602GCpTJmV-uQDfsvgcEChSLGNDPIjBecCXv5wEg0,44
|
|
46
|
+
spl_core/kickstart/templates/project/doc/software_requirements/index.rst,sha256=FmnMsx1Ih2qulGuLcch7vBW5Gxkv42P3BeAeih7c3Ro,95
|
|
47
|
+
spl_core/kickstart/templates/project/doc/test_report_template.txt,sha256=Pj9npGI1sVMDBrDQJ1jS_T_ysLgwvBzNO8T5FMjYsIE,1213
|
|
48
|
+
spl_core/kickstart/templates/project/index.rst,sha256=7HHmhxme_djB5iostqFc_7U8liKmTCNQZraC9nopEfg,1044
|
|
49
|
+
spl_core/kickstart/templates/project/pipfile,sha256=vV8woA8pI6kHXBf00_68802SW5o-wG44K-64apbv0wI,85
|
|
50
|
+
spl_core/kickstart/templates/project/pytest.ini,sha256=TB-kMa5upQAA6NgiPrTxVWCFaDTIoZN04ZnQL6byzjQ,159
|
|
51
|
+
spl_core/kickstart/templates/project/scoopfile.json,sha256=DcfZ8jYf9hmPHM-AWwnPKQJCzRG3fCuYtMeoY01nkag,219
|
|
52
|
+
spl_core/kickstart/templates/project/tools/toolchains/clang/toolchain.cmake,sha256=fDD-eb6DeqmAYkCbILL2V5PLnCPRdTu1Tpg0WfDC_dE,713
|
|
53
|
+
spl_core/kickstart/templates/project/tools/toolchains/gcc/toolchain.cmake,sha256=AmLzPyhTgfc_Dsre4AlsvSOkVGW6VswWvrEnUL8JLhA,183
|
|
54
|
+
spl_core/main.py,sha256=_hL4j155WZMXog_755bgAH1PeUwvTdJZvVdVw9EWhvo,1225
|
|
55
|
+
spl_core/test_utils/base_variant_test_runner.py,sha256=4ugideRMJqj1oaSboMSK7qZnAwg3O8Ysk23SdIi_t1o,3221
|
|
56
|
+
spl_core/test_utils/spl_build.py,sha256=TtYFTY94Fa9eXdtY9NavrCulx-NEONRm81GSLHGB_yQ,5599
|
|
57
|
+
spl_core-4.2.0.dist-info/LICENSE,sha256=UjjA0o8f5tT3wVm7qodTLAhPWLl6kgVyn9FPAd1VeYY,1099
|
|
58
|
+
spl_core-4.2.0.dist-info/METADATA,sha256=UkiI2qgKeYngvGmzv_dCUTc3PNVq6OxP791HfUb5idc,2590
|
|
59
|
+
spl_core-4.2.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
60
|
+
spl_core-4.2.0.dist-info/RECORD,,
|
spl_core/common/cmake.py
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import subprocess
|
|
3
|
-
from subprocess import CompletedProcess
|
|
4
|
-
|
|
5
|
-
from spl_core.project_creator.variant import Variant
|
|
6
|
-
from spl_core.project_creator.workspace_artifacts import WorkspaceArtifacts
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class CMake:
|
|
10
|
-
executable = "cmake"
|
|
11
|
-
|
|
12
|
-
def __init__(self, workspace_artifacts: WorkspaceArtifacts):
|
|
13
|
-
self.logger = logging.getLogger(__name__)
|
|
14
|
-
self.workspace_artifacts = workspace_artifacts
|
|
15
|
-
|
|
16
|
-
def run(self, variant: Variant, build_kit: str = "prod", target: str = "all") -> CompletedProcess[bytes]:
|
|
17
|
-
ret_status = self.configure(variant, build_kit)
|
|
18
|
-
if ret_status.returncode == 0:
|
|
19
|
-
ret_status = self.build(variant, build_kit, target)
|
|
20
|
-
return ret_status
|
|
21
|
-
|
|
22
|
-
def configure(self, variant: Variant, build_kit: str = "prod") -> CompletedProcess[bytes]:
|
|
23
|
-
arguments = (
|
|
24
|
-
f" --log-level=DEBUG"
|
|
25
|
-
f" -S{self.workspace_artifacts.root_dir}"
|
|
26
|
-
f" -B{self.workspace_artifacts.get_build_dir(variant, build_kit)}"
|
|
27
|
-
f" -G Ninja "
|
|
28
|
-
f" -DBUILD_KIT:STRING={build_kit}"
|
|
29
|
-
f" -DVARIANT:STRING={variant.to_string()}"
|
|
30
|
-
f" -DCMAKE_BUILD_TYPE:STRING={variant.to_string('_')}"
|
|
31
|
-
)
|
|
32
|
-
if build_kit == "test":
|
|
33
|
-
toolchain = self.workspace_artifacts.root_dir.joinpath(
|
|
34
|
-
"tools\\toolchains\\gcc\\toolchain.cmake"
|
|
35
|
-
)
|
|
36
|
-
arguments += f" -DCMAKE_TOOLCHAIN_FILE={toolchain}"
|
|
37
|
-
return self.run_cmake(arguments)
|
|
38
|
-
|
|
39
|
-
def build(
|
|
40
|
-
self, variant: Variant, build_kit: str = "prod", target: str = "all"
|
|
41
|
-
) -> CompletedProcess[bytes]:
|
|
42
|
-
arguments = (
|
|
43
|
-
f" --build {self.workspace_artifacts.get_build_dir(variant, build_kit)}"
|
|
44
|
-
f" --config {variant.to_string('_')}"
|
|
45
|
-
f" --target {target} -- "
|
|
46
|
-
)
|
|
47
|
-
return self.run_cmake(arguments)
|
|
48
|
-
|
|
49
|
-
def run_cmake(self, arguments: str) -> CompletedProcess[bytes]:
|
|
50
|
-
command = self.executable + " " + arguments
|
|
51
|
-
print(f"Running {command}")
|
|
52
|
-
return subprocess.run(command.split())
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import logging
|
|
3
|
-
import shutil
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from typing import Any, Dict, List
|
|
6
|
-
|
|
7
|
-
from cookiecutter.main import cookiecutter
|
|
8
|
-
|
|
9
|
-
from spl_core.common.path import existing_path
|
|
10
|
-
from spl_core.project_creator.variant import Variant
|
|
11
|
-
from spl_core.project_creator.workspace_artifacts import WorkspaceArtifacts
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Creator:
|
|
15
|
-
def __init__(self, project_name: str, out_dir: Path):
|
|
16
|
-
self.logger = logging.getLogger(__name__)
|
|
17
|
-
self.project_name = project_name
|
|
18
|
-
self.out_dir = out_dir.absolute()
|
|
19
|
-
self.project_root_dir = self.out_dir.joinpath(self.project_name)
|
|
20
|
-
self.project_artifacts = WorkspaceArtifacts(self.project_root_dir)
|
|
21
|
-
|
|
22
|
-
@classmethod
|
|
23
|
-
def from_folder(cls, project_dir: Path) -> "Creator":
|
|
24
|
-
return cls(project_dir.name, project_dir.parent)
|
|
25
|
-
|
|
26
|
-
@staticmethod
|
|
27
|
-
def create_project_description(name: str, variants: List[Variant], touch_only_variants_data: bool = False) -> Dict[str, Any]:
|
|
28
|
-
project_description = {"name": name, "variants": {}, "touch_components": not touch_only_variants_data, "touch_tools": not touch_only_variants_data}
|
|
29
|
-
variants.sort()
|
|
30
|
-
for index, variant in enumerate(variants):
|
|
31
|
-
project_description["variants"] = {str(index): vars(variant) for index, variant in enumerate(variants)}
|
|
32
|
-
return project_description
|
|
33
|
-
|
|
34
|
-
@property
|
|
35
|
-
def project_template_path(self) -> Path:
|
|
36
|
-
return Path(__file__).parent.joinpath("templates/project")
|
|
37
|
-
|
|
38
|
-
@property
|
|
39
|
-
def variant_template_path(self) -> Path:
|
|
40
|
-
return Path(__file__).parent.joinpath("templates/variant")
|
|
41
|
-
|
|
42
|
-
def materialize(self, variants: List[Variant]) -> Path:
|
|
43
|
-
result_path = self.materialize_workspace(variants)
|
|
44
|
-
self.materialize_variants(variants)
|
|
45
|
-
self.logger.info(f"Project created under: {result_path}")
|
|
46
|
-
return Path(result_path)
|
|
47
|
-
|
|
48
|
-
def materialize_workspace(self, variants: List[Variant], touch_only_variants_data: bool = False) -> Path:
|
|
49
|
-
project_description = self.create_project_description(self.project_name, variants, touch_only_variants_data)
|
|
50
|
-
result_path = cookiecutter(str(self.project_template_path), output_dir=f"{self.out_dir}", no_input=True, extra_context=project_description, overwrite_if_exists=True)
|
|
51
|
-
return result_path
|
|
52
|
-
|
|
53
|
-
def materialize_variants(self, variants: List[Variant]) -> None:
|
|
54
|
-
for variant in variants:
|
|
55
|
-
self.materialize_variant(vars(variant), self.project_artifacts.variants_dir)
|
|
56
|
-
|
|
57
|
-
def materialize_variant(self, variant_description: Dict[str, Any], out_dir: Path) -> Path:
|
|
58
|
-
result_path = cookiecutter(str(self.variant_template_path), output_dir=f"{out_dir}", no_input=True, extra_context=variant_description, overwrite_if_exists=True)
|
|
59
|
-
self.logger.info(f"Variant created under: {result_path}")
|
|
60
|
-
return Path(result_path)
|
|
61
|
-
|
|
62
|
-
def add_variants(self, variants: List[Variant]) -> None:
|
|
63
|
-
existing_variants = self.collect_project_variants()
|
|
64
|
-
new_variants = [variant for variant in variants if variant not in existing_variants]
|
|
65
|
-
if len(new_variants):
|
|
66
|
-
self.materialize_workspace(new_variants + existing_variants, touch_only_variants_data=True)
|
|
67
|
-
self.materialize_variants(variants)
|
|
68
|
-
if len(new_variants) != len(variants):
|
|
69
|
-
self.logger.warning(f"Skip adding variants" f" ({', '.join([str(v) for v in variants if v not in new_variants])})" f" because they already exist in {self.project_root_dir}.")
|
|
70
|
-
else:
|
|
71
|
-
self.logger.warning(f"Nothing to add. All the provided variants" f" ({', '.join([str(v) for v in variants])}) already exist in {self.project_root_dir}.")
|
|
72
|
-
|
|
73
|
-
def delete_variants(self, variants: List[Variant]) -> None:
|
|
74
|
-
existing_variants = self.collect_project_variants()
|
|
75
|
-
variants_to_be_deleted = [variant for variant in variants if variant in existing_variants]
|
|
76
|
-
if len(variants_to_be_deleted):
|
|
77
|
-
remaining_variants = list(set(existing_variants) - set(variants_to_be_deleted))
|
|
78
|
-
self.materialize_workspace(remaining_variants, touch_only_variants_data=True)
|
|
79
|
-
for variant in variants_to_be_deleted:
|
|
80
|
-
self.delete_variant_dir(variant)
|
|
81
|
-
if len(variants_to_be_deleted) != len(variants):
|
|
82
|
-
self.logger.warning(f"Skip deleting variants" f" ({', '.join([str(v) for v in variants if v not in variants_to_be_deleted])})" f" because they do not exist in {self.project_root_dir}.")
|
|
83
|
-
else:
|
|
84
|
-
self.logger.warning(f"Nothing to delete. None of the provided variants" f" ({', '.join([str(v) for v in variants])}) exists in {self.project_root_dir}.")
|
|
85
|
-
|
|
86
|
-
def delete_variant_dir(self, variant: Variant) -> None:
|
|
87
|
-
variant_dir = self.project_artifacts.variants_dir.joinpath(f"{variant}")
|
|
88
|
-
if variant_dir.exists():
|
|
89
|
-
shutil.rmtree(variant_dir)
|
|
90
|
-
|
|
91
|
-
def collect_project_variants(self) -> List[Variant]:
|
|
92
|
-
variants = []
|
|
93
|
-
variant_dirs = self.project_artifacts.variants_dir.glob("*/*/")
|
|
94
|
-
for variant_dir in variant_dirs:
|
|
95
|
-
variants.append(Variant(variant_dir.parent.name, variant_dir.name))
|
|
96
|
-
return variants
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def main(command_arguments: Any = None) -> None:
|
|
100
|
-
arguments = parse_arguments(command_arguments)
|
|
101
|
-
if arguments.command_scope == "workspace":
|
|
102
|
-
Creator(arguments.name, arguments.out_dir).materialize(arguments.variant)
|
|
103
|
-
else: # scope is variant
|
|
104
|
-
creator = Creator.from_folder(arguments.workspace_dir)
|
|
105
|
-
if arguments.add:
|
|
106
|
-
creator.add_variants(arguments.add)
|
|
107
|
-
else:
|
|
108
|
-
creator.delete_variants(arguments.delete)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def parse_arguments(command_arguments: Any = None) -> argparse.Namespace:
|
|
112
|
-
parser = argparse.ArgumentParser(description="Workspace creator")
|
|
113
|
-
subparsers = parser.add_subparsers(dest="command_scope")
|
|
114
|
-
|
|
115
|
-
parser_workspace = subparsers.add_parser("workspace", help="Create a workspace")
|
|
116
|
-
parser_workspace.add_argument("--name", required=True, type=str, help="Workspace name. A directory with this name will be created in the <out_dir>.")
|
|
117
|
-
parser_workspace.add_argument("--variant", required=True, action="append", type=Variant.from_string, help="Variant name as <flavor>/<subsystem>. E.g. FLV1/SYS1. " "This option can be used multiple times.")
|
|
118
|
-
parser_workspace.add_argument("--out_dir", required=True, type=existing_path, help="Target directory where the workspace folder will be created.")
|
|
119
|
-
|
|
120
|
-
parser_variant = subparsers.add_parser("variant", help="Add/delete variant to existing workspace")
|
|
121
|
-
command_group = parser_variant.add_mutually_exclusive_group(required=True)
|
|
122
|
-
command_group.add_argument(
|
|
123
|
-
"--add", action="append", type=Variant.from_string, metavar="VARIANT", help="Add a variant to a workspace. Variant name as <flavor>/<subsystem>." " E.g. FLV1/SYS1. This option can be used multiple times."
|
|
124
|
-
)
|
|
125
|
-
command_group.add_argument(
|
|
126
|
-
"--delete", action="append", type=Variant.from_string, metavar="VARIANT", help="Delete a variant from a workspace. Variant name as <flavor>/<subsystem>." " E.g. FLV1/SYS1. This option can be used multiple times."
|
|
127
|
-
)
|
|
128
|
-
parser_variant.add_argument("--workspace_dir", required=True, type=existing_path, help="Workspace root directory.")
|
|
129
|
-
return parser.parse_args(command_arguments)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if __name__ == "__main__":
|
|
133
|
-
main()
|