[rtems-central commit] interface: Improve enabled-by for header files

Sebastian Huber sebh at rtems.org
Tue May 9 13:45:26 UTC 2023


Module:    rtems-central
Branch:    master
Commit:    79477ae61e625f0552a59b42aad34f463d571f04
Changeset: http://git.rtems.org/rtems-central/commit/?id=79477ae61e625f0552a59b42aad34f463d571f04

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri May  5 14:41:19 2023 +0200

interface: Improve enabled-by for header files

---

 rtemsspec/interface.py                             | 41 ++++++++++++++++++----
 rtemsspec/tests/spec-interface/h.yml               | 14 +++++++-
 rtemsspec/tests/spec-interface/h2.yml              |  3 +-
 rtemsspec/tests/spec-interface/h5.yml              | 13 +++++++
 rtemsspec/tests/spec-interface/h6.yml              | 13 +++++++
 rtemsspec/tests/spec-interface/h7.yml              | 13 +++++++
 rtemsspec/tests/spec-interface/h8.yml              | 13 +++++++
 rtemsspec/tests/spec-interface/multiprocessing.yml | 13 +++++++
 rtemsspec/tests/test_interface.py                  | 18 +++++++---
 9 files changed, 127 insertions(+), 14 deletions(-)

diff --git a/rtemsspec/interface.py b/rtemsspec/interface.py
index c1655c4c..d5ed395d 100644
--- a/rtemsspec/interface.py
+++ b/rtemsspec/interface.py
@@ -39,7 +39,7 @@ from rtemsspec.content import CContent, CInclude, enabled_by_to_exp, \
     get_value_forward_declaration, get_value_hash, get_value_header_file, \
     get_value_params, get_value_plural, get_value_unspecified_type, \
     to_camel_case
-from rtemsspec.items import Item, ItemCache, ItemGetValueMap, ItemMapper
+from rtemsspec.items import Item, ItemCache, ItemGetValueMap, ItemMapper, Link
 
 ItemMap = Dict[str, Item]
 Lines = Union[str, List[str]]
@@ -723,6 +723,28 @@ def _bubble_sort(nodes: List[Node]) -> List[Node]:
     return nodes
 
 
+def _merge_enabled_by(link: Link) -> Any:
+    enabled_by = link["enabled-by"]
+    enabled_by_2 = link.item["enabled-by"]
+    if enabled_by == enabled_by_2:
+        return enabled_by
+    if isinstance(enabled_by, bool):
+        if enabled_by:
+            return enabled_by_2
+        return False
+    if isinstance(enabled_by_2, bool):
+        if enabled_by_2:
+            return enabled_by
+        return False
+    return {"and": [enabled_by, enabled_by_2]}
+
+
+def _combine_enabled_by(item: Item, enabled_by: Any) -> Any:
+    if enabled_by == item["enabled-by"]:
+        return True
+    return enabled_by
+
+
 class _HeaderFile:
     """ A header file. """
 
@@ -817,13 +839,20 @@ class _HeaderFile:
             exp_mapper = _HeaderExpressionMapper(self._item,
                                                  self.enabled_by_defined)
             includes = [
-                CInclude(item["path"],
-                         enabled_by_to_exp(item["enabled-by"], exp_mapper))
-                for item in self._includes if item != self._item
+                CInclude(
+                    item["path"],
+                    enabled_by_to_exp(
+                        _combine_enabled_by(self._item, item["enabled-by"]),
+                        exp_mapper)) for item in self._includes
+                if item != self._item
             ]
             includes.extend([
-                CInclude(link.item["path"],
-                         enabled_by_to_exp(link["enabled-by"], exp_mapper))
+                CInclude(
+                    link.item["path"],
+                    enabled_by_to_exp(
+                        _combine_enabled_by(self._item,
+                                            _merge_enabled_by(link)),
+                        exp_mapper))
                 for link in self._item.links_to_parents("interface-include")
             ])
             self._content.add_includes(includes)
diff --git a/rtemsspec/tests/spec-interface/h.yml b/rtemsspec/tests/spec-interface/h.yml
index 5c85f17c..01118207 100644
--- a/rtemsspec/tests/spec-interface/h.yml
+++ b/rtemsspec/tests/spec-interface/h.yml
@@ -2,7 +2,7 @@ SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
 - Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
-enabled-by: []
+enabled-by: RTEMS_SMP
 index-entries: []
 interface-type: header-file
 links:
@@ -23,6 +23,18 @@ links:
   uid: h4
 - role: other
   uid: h4
+- enabled-by: true
+  role: interface-include
+  uid: h5
+- enabled-by: false
+  role: interface-include
+  uid: h6
+- enabled-by: ASM
+  role: interface-include
+  uid: h7
+- enabled-by: ASM
+  role: interface-include
+  uid: h8
 - role: interface-placement
   uid: domain-abc
 - role: interface-ingroup
diff --git a/rtemsspec/tests/spec-interface/h2.yml b/rtemsspec/tests/spec-interface/h2.yml
index ee0baedb..1310cc06 100644
--- a/rtemsspec/tests/spec-interface/h2.yml
+++ b/rtemsspec/tests/spec-interface/h2.yml
@@ -2,8 +2,7 @@ SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
 - Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
-enabled-by:
-  not: ASM
+enabled-by: RTEMS_SMP
 index-entries: []
 interface-type: header-file
 links:
diff --git a/rtemsspec/tests/spec-interface/h5.yml b/rtemsspec/tests/spec-interface/h5.yml
new file mode 100644
index 00000000..570397df
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/h5.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: Not enabled.
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: false
+index-entries: []
+interface-type: header-file
+links:
+- role: interface-placement
+  uid: domain-abc
+path: h5.h
+prefix: include
+type: interface
diff --git a/rtemsspec/tests/spec-interface/h6.yml b/rtemsspec/tests/spec-interface/h6.yml
new file mode 100644
index 00000000..fa42a2d6
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/h6.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: Always enabled.
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+index-entries: []
+interface-type: header-file
+links:
+- role: interface-placement
+  uid: domain-abc
+path: h6.h
+prefix: include
+type: interface
diff --git a/rtemsspec/tests/spec-interface/h7.yml b/rtemsspec/tests/spec-interface/h7.yml
new file mode 100644
index 00000000..70dd952e
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/h7.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: Not enabled.
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: false
+index-entries: []
+interface-type: header-file
+links:
+- role: interface-placement
+  uid: domain-abc
+path: h7.h
+prefix: include
+type: interface
diff --git a/rtemsspec/tests/spec-interface/h8.yml b/rtemsspec/tests/spec-interface/h8.yml
new file mode 100644
index 00000000..40d0aafb
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/h8.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: Multiprocessing.
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: RTEMS_MULTIPROCESSING
+index-entries: []
+interface-type: header-file
+links:
+- role: interface-placement
+  uid: domain-abc
+path: h8.h
+prefix: include
+type: interface
diff --git a/rtemsspec/tests/spec-interface/multiprocessing.yml b/rtemsspec/tests/spec-interface/multiprocessing.yml
new file mode 100644
index 00000000..83750c07
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/multiprocessing.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+index-entries: []
+interface-type: unspecified-define
+links:
+- role: interface-placement
+  uid: domain-command-line
+- role: interface-ingroup
+  uid: command-line
+name: RTEMS_MULTIPROCESSING
+type: interface
diff --git a/rtemsspec/tests/test_interface.py b/rtemsspec/tests/test_interface.py
index bdd9fbfa..5a4d972e 100644
--- a/rtemsspec/tests/test_interface.py
+++ b/rtemsspec/tests/test_interface.py
@@ -28,7 +28,7 @@ import os
 import pytest
 
 from rtemsspec.interface import generate
-from rtemsspec.items import EmptyItemCache, ItemCache
+from rtemsspec.items import EmptyItemCache, ItemCache, item_is_enabled
 from rtemsspec.tests.util import create_item_cache_config_and_copy_spec
 
 
@@ -46,7 +46,8 @@ def test_interface(tmpdir):
 
     item_cache_config = create_item_cache_config_and_copy_spec(
         tmpdir, "spec-interface", with_spec_types=True)
-    generate(interface_config, ItemCache(item_cache_config))
+    generate(interface_config,
+             ItemCache(item_cache_config, is_item_enabled=item_is_enabled))
 
     with open(os.path.join(base_directory, "include", "h.h"), "r") as src:
         content = """/* SPDX-License-Identifier: BSD-2-Clause */
@@ -108,18 +109,25 @@ def test_interface(tmpdir):
 #ifndef _H_H
 #define _H_H
 
+#include <h2.h>
 #include <h3.h>
 #include <math.h>
 #include <stdint.h>
 
-#if !defined(ASM) && defined(RTEMS_SMP)
-  #include <h2.h>
+#if 0
+  #include <h5.h>
+  #include <h6.h>
+  #include <h7.h>
 #endif
 
-#if defined(ASM) && defined(RTEMS_SMP)
+#if defined(ASM)
   #include <h4.h>
 #endif
 
+#if defined(ASM) && defined(RTEMS_MULTIPROCESSING)
+  #include <h8.h>
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif



More information about the vc mailing list