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.
Files changed (83) hide show
  1. spl_core/__init__.py +1 -1
  2. spl_core/__run.py +12 -0
  3. spl_core/common/command_line_executor.py +3 -1
  4. spl_core/kickstart/create.py +66 -0
  5. spl_core/kickstart/templates/application/.vscode/cmake-variants.json +20 -0
  6. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/application}/KConfig +2 -2
  7. spl_core/kickstart/templates/application/src/greeter/CMakeLists.txt +3 -0
  8. spl_core/kickstart/templates/application/src/greeter/doc/_images/screenshot.png +0 -0
  9. spl_core/kickstart/templates/application/src/greeter/doc/index.rst +26 -0
  10. spl_core/kickstart/templates/application/src/greeter/src/greeter.c +24 -0
  11. spl_core/kickstart/templates/application/src/greeter/src/greeter.h +6 -0
  12. spl_core/kickstart/templates/application/src/greeter/test/test_greeter.cc +27 -0
  13. 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
  14. spl_core/kickstart/templates/application/src/main/src/main.c +13 -0
  15. spl_core/kickstart/templates/application/test/EnglishVariant/test__EnglishVariant.py +16 -0
  16. spl_core/kickstart/templates/application/test/German/test__GermanVariant.py +16 -0
  17. spl_core/kickstart/templates/application/variants/EnglishVariant/parts.cmake +2 -0
  18. spl_core/kickstart/templates/application/variants/GermanVariant/config.cmake +1 -0
  19. spl_core/kickstart/templates/application/variants/GermanVariant/config.txt +13 -0
  20. spl_core/kickstart/templates/application/variants/GermanVariant/parts.cmake +2 -0
  21. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.gitignore +3 -0
  22. spl_core/kickstart/templates/project/.vscode/extensions.json +20 -0
  23. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/tasks.json +24 -4
  24. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/CMakeLists.txt +9 -1
  25. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/build.ps1 +47 -17
  26. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/conf.py +8 -6
  27. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/Doxyfile.in +2 -2
  28. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/common/index.rst +1 -1
  29. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/components/index.rst +2 -3
  30. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/doxygen-awesome/doxygen-awesome.css +16 -16
  31. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/test_report_template.txt +0 -2
  32. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/index.rst +1 -0
  33. spl_core/kickstart/templates/project/pipfile +6 -0
  34. spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/pytest.ini +2 -1
  35. spl_core/kickstart/templates/project/scoopfile.json +14 -0
  36. 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
  37. spl_core/main.py +44 -0
  38. spl_core/test_utils/base_variant_test_runner.py +17 -0
  39. spl_core/test_utils/spl_build.py +85 -0
  40. {spl_core-4.1.1.dist-info → spl_core-4.2.0.dist-info}/METADATA +14 -2
  41. spl_core-4.2.0.dist-info/RECORD +60 -0
  42. spl_core/common/cmake.py +0 -52
  43. spl_core/project_creator/creator.py +0 -133
  44. spl_core/project_creator/templates/project/cookiecutter.json +0 -14
  45. spl_core/project_creator/templates/project/{{cookiecutter.name}}/.flake8 +0 -2
  46. spl_core/project_creator/templates/project/{{cookiecutter.name}}/.vscode/cmake-variants.json +0 -18
  47. spl_core/project_creator/templates/project/{{cookiecutter.name}}/.vscode/extensions.json +0 -18
  48. spl_core/project_creator/templates/project/{{cookiecutter.name}}/LICENSE +0 -21
  49. spl_core/project_creator/templates/project/{{cookiecutter.name}}/Pipfile +0 -30
  50. spl_core/project_creator/templates/project/{{cookiecutter.name}}/README.md +0 -7
  51. spl_core/project_creator/templates/project/{{cookiecutter.name}}/install-mandatory.bat +0 -1
  52. spl_core/project_creator/templates/project/{{cookiecutter.name}}/scoopfile.json +0 -47
  53. spl_core/project_creator/templates/project/{{cookiecutter.name}}/test/test_build.py +0 -39
  54. spl_core/project_creator/templates/project/{{cookiecutter.name}}/test/test_unittests.py +0 -28
  55. spl_core/project_creator/templates/project/{{cookiecutter.name}}/test/utils.py +0 -26
  56. spl_core/project_creator/templates/project/{{cookiecutter.name}}/tools/setup/git-config.ps1 +0 -8
  57. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/CMakeLists.txt +0 -3
  58. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/_images/screenshot.png +0 -0
  59. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/design.rst +0 -25
  60. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/index.rst +0 -8
  61. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/src/component.c +0 -31
  62. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/src/component.h +0 -1
  63. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/test/test_component.cc +0 -60
  64. spl_core/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/src/main.c +0 -17
  65. spl_core/project_creator/templates/variant/cookiecutter.json +0 -4
  66. spl_core/project_creator/templates/variant/{{cookiecutter.flavor}}/{{cookiecutter.subsystem}}/config.txt +0 -1
  67. spl_core/project_creator/templates/variant/{{cookiecutter.flavor}}/{{cookiecutter.subsystem}}/parts.cmake +0 -2
  68. spl_core/project_creator/variant.py +0 -23
  69. spl_core/project_creator/workspace_artifacts.py +0 -36
  70. spl_core-4.1.1.dist-info/RECORD +0 -68
  71. /spl_core/{project_creator → kickstart}/__init__.py +0 -0
  72. /spl_core/{project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %} → kickstart/templates/application/src}/main/CMakeLists.txt +0 -0
  73. /spl_core/{project_creator/templates/variant/{{cookiecutter.flavor}}/{{cookiecutter.subsystem}} → kickstart/templates/application/variants/EnglishVariant}/config.cmake +0 -0
  74. /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/cmake-kits.json +0 -0
  75. /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/launch.json +0 -0
  76. /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/.vscode/settings.json +0 -0
  77. /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/build.bat +0 -0
  78. /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/doxygen-awesome/LICENSE +0 -0
  79. /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/software_architecture/index.rst +0 -0
  80. /spl_core/{project_creator/templates/project/{{cookiecutter.name}} → kickstart/templates/project}/doc/software_requirements/index.rst +0 -0
  81. /spl_core/{project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_tools -%} tools {%- endif %} → kickstart/templates/project/tools}/toolchains/gcc/toolchain.cmake +0 -0
  82. {spl_core-4.1.1.dist-info → spl_core-4.2.0.dist-info}/LICENSE +0 -0
  83. {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,
@@ -34,5 +34,6 @@ Variant Report
34
34
  {% if build_config.target == 'reports' %}
35
35
  {{ build_config.reports_output_dir }}/coverage
36
36
  {% endif %}
37
+ doc/results/index
37
38
 
38
39
  {% endif %}
@@ -0,0 +1,6 @@
1
+ [packages]
2
+ pytest = "8.1.1"
3
+ spl-core = "*"
4
+
5
+ [requires]
6
+ python_version = "3.11"
@@ -5,5 +5,6 @@ testpaths =
5
5
  test
6
6
  junit_logging = all
7
7
  addopts =
8
+ -vv
8
9
  --capture=tee-sys
9
- --verbose
10
+ --junitxml=build/test-report.xml
@@ -0,0 +1,14 @@
1
+ {
2
+ "buckets": [
3
+ {
4
+ "Name": "versions",
5
+ "Source": "https://github.com/ScoopInstaller/Versions"
6
+ }
7
+ ],
8
+ "apps": [
9
+ {
10
+ "Source": "versions",
11
+ "Name": "mingw-winlibs-llvm-ucrt"
12
+ }
13
+ ]
14
+ }
@@ -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), releated GCOVR issue: https://github.com/gcovr/gcovr/issues/331
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")
@@ -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.1.1
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 FLV1/SYS1 --out_dir C:\dev
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()
@@ -1,14 +0,0 @@
1
- {
2
- "name": "project",
3
- "touch_components": "True",
4
- "touch_tools": "True",
5
- "variants": {
6
- "1": {
7
- "flavor": "flavor",
8
- "subsystem": "subsystem"
9
- }
10
- },
11
- "_copy_without_render": [
12
- "*.rst"
13
- ]
14
- }
@@ -1,2 +0,0 @@
1
- [flake8]
2
- max-line-length = 240