From 8955f16e4ee482003f63e184fa8cb5ec12cace77 Mon Sep 17 00:00:00 2001
From: Leandro Belli <leandro.belli@arm.com>
Date: Thu, 8 Jul 2021 10:21:00 +0100
Subject: [PATCH 1/7] ci_cmake: Add multithread build capabilities

This patch adds multithread capabilities to the run the ci_cmake
script.

Signed-off-by: Leandro Belli <leandro.belli@arm.com>
Change-Id: I766e07d9939c16aa576381b328a1df4650344225
---
 tools/ci_cmake.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/ci_cmake.py b/tools/ci_cmake.py
index 9e08a91b9..93f4a7e31 100755
--- a/tools/ci_cmake.py
+++ b/tools/ci_cmake.py
@@ -115,6 +115,8 @@ def main():
                 cmd += 'PRODUCT={} TOOLCHAIN={} MODE={}'.format(product,
                                                                 toolchain,
                                                                 build_type)
+                cmd += ' -j$(nproc)'
+
                 if product in platform_variant:
                     for variant in platform_variant[product]:
                         cmd_variant = cmd + ' ' + prod_variant(variant)
-- 
GitLab


From a9a4f4461cbef56c34bdc942319dc11880ce3969 Mon Sep 17 00:00:00 2001
From: Leandro Belli <leandro.belli@arm.com>
Date: Fri, 9 Jul 2021 13:41:56 +0100
Subject: [PATCH 2/7] check_framework: create and separate framework check file

This patch creates and separates frameworks checks into a
different file to improve readability and scalability.
Framework checks were done inside ci script. Moving it
to a different script allows to have the same interface
as the rest of the checks.

Signed-off-by: Leandro Belli <leandro.belli@arm.com>
Change-Id: I89723bc15b5d7f34df8e3e71237c16467a28d863
---
 tools/check_framework.py | 44 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100755 tools/check_framework.py

diff --git a/tools/check_framework.py b/tools/check_framework.py
new file mode 100755
index 000000000..60a730ac4
--- /dev/null
+++ b/tools/check_framework.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python3
+#
+# Arm SCP/MCP Software
+# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+"""
+Build and check framework
+This script runs "CC=gcc make clean test" and performs all frameworks tests.
+"""
+
+import sys
+import subprocess
+
+
+def banner(text):
+    columns = 80
+    title = " {} ".format(text)
+    print("\n\n{}".format(title.center(columns, "*")))
+
+
+def main():
+    banner("Build and run framework tests")
+
+    result = subprocess.Popen(
+        "CC=gcc make clean test",
+        shell=True,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE)
+
+    (stdout, stderr) = result.communicate()
+
+    print(stdout.decode())
+
+    if stderr:
+        print(stderr.decode())
+        return 1
+
+    return 0
+
+
+if __name__ == '__main__':
+    sys.exit(main())
-- 
GitLab


From 10de72dbea8dd067add63662a3fb3882af6c01cc Mon Sep 17 00:00:00 2001
From: Leandro Belli <leandro.belli@arm.com>
Date: Thu, 8 Jul 2021 14:44:12 +0100
Subject: [PATCH 3/7] ci_cmake: add support for parallel build

This change adds support for executing builds in parallel.
It includes a series of modification to improve readability
and scalabillity.

Signed-off-by: Leandro Belli <leandro.belli@arm.com>
Change-Id: I26219a8b65a2ad0d620dab46477984993ad9b12e
---
 tools/ci_cmake.py | 157 +++++++++++++++++++++++++++++-----------------
 1 file changed, 101 insertions(+), 56 deletions(-)

diff --git a/tools/ci_cmake.py b/tools/ci_cmake.py
index 93f4a7e31..19e9e653a 100755
--- a/tools/ci_cmake.py
+++ b/tools/ci_cmake.py
@@ -10,6 +10,7 @@ import check_copyright
 import check_doc
 import check_spacing
 import check_tabs
+import check_framework
 import docker
 import os
 import signal
@@ -19,6 +20,48 @@ import sys
 from docker.errors import DockerException
 
 
+code_validations = [
+    check_copyright,
+    check_spacing,
+    check_tabs,
+    check_doc,
+    check_framework,
+]
+
+build_types = [
+    'debug',
+    'release',
+]
+
+toolchains = [
+    'GNU',
+    'ArmClang',
+]
+
+products = [
+    'host',
+    'juno',
+    'morello',
+    'n1sdp',
+    'rdv1',
+    'rdv1mc',
+    'rdn1e1',
+    'sgi575',
+    'sgm775',
+    'sgm776',
+    'synquacer',
+    'tc0',
+    'rcar',
+    'rdn2',
+]
+
+platform_variant = {
+    'rdn2': [
+        '0'
+    ],
+}
+
+
 def prod_variant(variant):
     return 'EXTRA_CONFIG_ARGS+=-DSCP_PLATFORM_VARIANT={}'.format(variant)
 
@@ -56,9 +99,51 @@ def dockerize(client):
     signal.signal(signal.SIGINT, sigint_handler)
 
 
-def main():
-    results = []
+def generate_build_info():
+    build_info = []
+    for product in products:
+        for toolchain in toolchains:
+            if product == 'rcar' and toolchain == 'ArmClang':
+                continue
+            for build_type in build_types:
 
+                cmd = 'make -f Makefile.cmake '
+                cmd += 'PRODUCT={} TOOLCHAIN={} MODE={}'.format(product,
+                                                                toolchain,
+                                                                build_type)
+                cmd += ' -j$(nproc)'
+
+                if product in platform_variant:
+                    for variant in platform_variant[product]:
+                        cmd += ' ' + prod_variant(variant)
+                        desc = "Product {}.{} build ({})".format(
+                            product,
+                            variant,
+                            toolchain)
+                        build_info.append((product, desc, cmd))
+                else:
+                    desc = "Product {} build ({})".format(
+                            product,
+                            toolchain)
+                    build_info.append((product, desc, cmd))
+    return build_info
+
+
+def start_build(build_info):
+    build_status = []
+    for product, desc, cmd in build_info:
+        build = subprocess.Popen(
+                                cmd,
+                                shell=True,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE)
+        build_status.append((product, desc, build))
+    return build_status
+
+
+def main():
+    # This code is only applicable if there is valid docker instance
+    # On CI there is no docker instance at the moment
     try:
         client = docker.from_env()
 
@@ -73,64 +158,24 @@ def main():
     except DockerException:
         pass
 
-    banner("Code validation")
-
-    result = check_copyright.main()
-    results.append(("Check copyright", result))
-
-    result = check_spacing.main()
-    results.append(("Check spacing", result))
-
-    result = check_tabs.main()
-    results.append(("Check tabs", result))
-
-    result = check_doc.main()
-    results.append(("Check doc", result))
-
-    banner("Build and run framework tests")
-
-    result = subprocess.call("CC=gcc make clean test", shell=True)
-    results.append(("Framework tests", result))
-
-    banner("Test building host product")
-
-    products = ['host', 'juno', 'morello', 'n1sdp', 'rdv1', 'rdv1mc',
-                'rdn1e1', 'sgi575', 'sgm775', 'sgm776', 'tc0',
-                'rdn2']
-    platform_variant = {
-        'rdn2': ['0']
-    }
+    results = []
 
-    build_types = ['debug', 'release']
-    toolchains = ['GNU', 'ArmClang']
+    banner('Code validation')
 
-    for product in products:
-        banner("Test building {} product".format(product))
-        for toolchain in toolchains:
-            if product == 'rcar' and toolchain == 'ArmClang':
-                continue
-            for build_type in build_types:
+    for code_validation in code_validations:
+        result = code_validation.main()
+        test_name = code_validation.__name__.split('_')[-1]
+        results.append(('Check {}'.format(test_name), result))
 
-                cmd = 'make -f Makefile.cmake '
-                cmd += 'PRODUCT={} TOOLCHAIN={} MODE={}'.format(product,
-                                                                toolchain,
-                                                                build_type)
-                cmd += ' -j$(nproc)'
+    build_status = start_build(generate_build_info())
 
-                if product in platform_variant:
-                    for variant in platform_variant[product]:
-                        cmd_variant = cmd + ' ' + prod_variant(variant)
-                        result = subprocess.call(cmd_variant, shell=True)
-                        results.append(("Product {} build ({})".format(
-                            product,
-                            toolchain),
-                            result))
-                else:
-                    result = subprocess.call(cmd, shell=True)
-                    results.append(("Product {} build ({})".format(
-                        product,
-                        toolchain),
-                        result))
+    for product, desc, build in build_status:
+        banner('Test building {} product'.format(product))
+        (stdout, stderr) = build.communicate()
+        print(stdout.decode())
+        print(stderr.decode())
+        result = build.wait()
+        results.append((desc, result))
 
     banner('Tests summary')
 
-- 
GitLab


From e851f82a9cbec75cb7741aa4ba92a0e3010a42ed Mon Sep 17 00:00:00 2001
From: Leandro Belli <leandro.belli@arm.com>
Date: Fri, 16 Jul 2021 14:36:27 +0100
Subject: [PATCH 4/7] cmake: Add cppcheck disable flag

This patch adds a cppcheck disable flag. This allows to have it
enabled by default but it can be optionally disabled.

Signed-off-by: Leandro Belli <leandro.belli@arm.com>
Change-Id: I04d5b83941369dfe727284f7facc7b8623099b5c
---
 CMakeLists.txt | 43 ++++++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 21 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 705f0b434..cc5ee2082 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -151,35 +151,36 @@ cmake_dependent_option(
 set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
 
 #
-# Set up Cppcheck if it's available.
+# Set up Cppcheck if it's available and enabled.
 #
+if (NOT DISABLE_CPPCHECK)
+    find_program(CMAKE_C_CPPCHECK NAMES "cppcheck")
 
-find_program(CMAKE_C_CPPCHECK NAMES "cppcheck")
+    if(NOT CMAKE_C_CPPCHECK)
+        unset(CMAKE_C_CPPCHECK CACHE)
+    endif()
 
-if(NOT CMAKE_C_CPPCHECK)
-    unset(CMAKE_C_CPPCHECK CACHE)
-endif()
+    if(CMAKE_C_CPPCHECK)
+        # cmake-format: off
 
-if(CMAKE_C_CPPCHECK)
-    # cmake-format: off
+        list(APPEND CMAKE_C_CPPCHECK "--quiet")
+        list(APPEND CMAKE_C_CPPCHECK "--suppressions-list=${CMAKE_CURRENT_SOURCE_DIR}/tools/cppcheck_suppress_list.txt")
+        list(APPEND CMAKE_C_CPPCHECK "--enable=all")
+        list(APPEND CMAKE_C_CPPCHECK "--inconclusive")
+        list(APPEND CMAKE_C_CPPCHECK "--inline-suppr")
 
-    list(APPEND CMAKE_C_CPPCHECK "--quiet")
-    list(APPEND CMAKE_C_CPPCHECK "--suppressions-list=${CMAKE_CURRENT_SOURCE_DIR}/tools/cppcheck_suppress_list.txt")
-    list(APPEND CMAKE_C_CPPCHECK "--enable=all")
-    list(APPEND CMAKE_C_CPPCHECK "--inconclusive")
-    list(APPEND CMAKE_C_CPPCHECK "--inline-suppr")
+        if(SCP_ARCHITECTURE STREQUAL "armv7-m")
+            list(APPEND CMAKE_C_CPPCHECK "--library=${CMAKE_CURRENT_SOURCE_DIR}/.armv7m.cppcheck.cfg")
+        endif()
 
-    if(SCP_ARCHITECTURE STREQUAL "armv7-m")
-        list(APPEND CMAKE_C_CPPCHECK "--library=${CMAKE_CURRENT_SOURCE_DIR}/.armv7m.cppcheck.cfg")
-    endif()
+        if(CMAKE_C_COMPILER_ID STREQUAL "ARMClang")
+            list(APPEND CMAKE_C_CPPCHECK "--library=${CMAKE_CURRENT_SOURCE_DIR}/.armclang.cppcheck.cfg")
+        else()
+            list(APPEND CMAKE_C_CPPCHECK "--library=${CMAKE_CURRENT_SOURCE_DIR}/.gnu.cppcheck.cfg")
+        endif()
 
-    if(CMAKE_C_COMPILER_ID STREQUAL "ARMClang")
-        list(APPEND CMAKE_C_CPPCHECK "--library=${CMAKE_CURRENT_SOURCE_DIR}/.armclang.cppcheck.cfg")
-    else()
-        list(APPEND CMAKE_C_CPPCHECK "--library=${CMAKE_CURRENT_SOURCE_DIR}/.gnu.cppcheck.cfg")
+        # cmake-format: on
     endif()
-
-    # cmake-format: on
 endif()
 
 #
-- 
GitLab


From 143497fb347b07214ed2a8a977b07a82edf2faa0 Mon Sep 17 00:00:00 2001
From: Leandro Belli <leandro.belli@arm.com>
Date: Fri, 16 Jul 2021 14:39:49 +0100
Subject: [PATCH 5/7] ci_cmake: disable cppcheck

This patch removes cppcheck from CI.

Signed-off-by: Leandro Belli <leandro.belli@arm.com>
Change-Id: I3d29b96e1057cde9e097e7c4bbc707236ee1f806
---
 tools/ci_cmake.py | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tools/ci_cmake.py b/tools/ci_cmake.py
index 19e9e653a..2c4f0e064 100755
--- a/tools/ci_cmake.py
+++ b/tools/ci_cmake.py
@@ -66,6 +66,10 @@ def prod_variant(variant):
     return 'EXTRA_CONFIG_ARGS+=-DSCP_PLATFORM_VARIANT={}'.format(variant)
 
 
+def disable_cppcheck():
+    return 'EXTRA_CONFIG_ARGS+=-DDISABLE_CPPCHECK=true '
+
+
 def banner(text):
     columns = 80
     title = " {} ".format(text)
@@ -111,7 +115,8 @@ def generate_build_info():
                 cmd += 'PRODUCT={} TOOLCHAIN={} MODE={}'.format(product,
                                                                 toolchain,
                                                                 build_type)
-                cmd += ' -j$(nproc)'
+                cmd += ' -j$(nproc) '
+                cmd += disable_cppcheck()
 
                 if product in platform_variant:
                     for variant in platform_variant[product]:
-- 
GitLab


From 8fee63b2902960e6fab344ad81e94f49928e3f08 Mon Sep 17 00:00:00 2001
From: Leandro Belli <leandro.belli@arm.com>
Date: Thu, 22 Jul 2021 17:32:01 +0100
Subject: [PATCH 6/7] cmake: skip doc generation when dependencies are not
 found

This patch includes a guard to skip doc generation when dependencies
are not found. It also set doc to EXCLUDE_FROM_ALL to be enabled
when needed.

Signed-off-by: Leandro Belli <leandro.belli@arm.com>
Change-Id: I05d45fcae541ea8a942162414b4a3c71f1222320
---
 CMakeLists.txt     | 3 +--
 doc/CMakeLists.txt | 3 +++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index cc5ee2082..8d30982b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -514,8 +514,7 @@ if(SCP_FIRMWARE)
     #
     # Load in the documentation generation.
     #
-
-    add_subdirectory("doc")
+    add_subdirectory("doc" EXCLUDE_FROM_ALL)
 endif()
 
 #
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 4c8ec3f7c..c1e5c52a9 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -9,6 +9,9 @@
 
 find_package(Doxygen OPTIONAL_COMPONENTS dot mscgen dia)
 
+if(NOT DOXYGEN_FOUND OR DOXYGEN_VERSION VERSION_LESS 1.8.13)
+    return()
+endif()
 #
 # This fairly monstrous block of code actually does a deceptively simple
 # operation: it collects all the sources, include directories and definitions
-- 
GitLab


From 3cbfb4ae8517e98bf37263e455be3a5ebbefc8f0 Mon Sep 17 00:00:00 2001
From: Leandro Belli <leandro.belli@arm.com>
Date: Wed, 4 Aug 2021 18:06:46 +0100
Subject: [PATCH 7/7] cmake/sensor: fix sensor events notifications flag
 definition

This patch fixes `SCP_ENABLE_SCMI_SENSOR_EVENTS` flag definition.
It also includes cmake documentation about the ussage of this
feature.

Signed-off-by: Leandro Belli <leandro.belli@arm.com>
Change-Id: If0a7d75a699f9cc17084da6904e1f8e14a1bb494
---
 CMakeLists.txt           | 5 +++++
 doc/cmake_readme.md      | 2 ++
 framework/CMakeLists.txt | 2 +-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8d30982b1..973ad5a74 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -335,6 +335,11 @@ cmake_dependent_option(
     "${SCP_ENABLE_SCMI_NOTIFICATIONS_INIT}" "DEFINED SCP_ENABLE_SCMI_NOTIFICATIONS_INIT"
     "${SCP_ENABLE_SCMI_NOTIFICATIONS}")
 
+cmake_dependent_option(
+    SCP_ENABLE_SCMI_SENSOR_EVENTS "Enable the SCMI sensor events?"
+    "${SCP_ENABLE_SCMI_SENSOR_EVENTS_INIT}" "DEFINED SCP_ENABLE_SCMI_SENSOR_EVENTS_INIT"
+    "${SCP_ENABLE_SCMI_SENSOR_EVENTS}")
+
 # Include firmware specific build options
     include("${SCP_FIRMWARE_SOURCE_DIR}/Buildoptions.cmake" OPTIONAL)
 
diff --git a/doc/cmake_readme.md b/doc/cmake_readme.md
index 54e321995..70d89f74c 100644
--- a/doc/cmake_readme.md
+++ b/doc/cmake_readme.md
@@ -115,6 +115,8 @@ few common options can be configured.
 It can be also used to provide some platform specific settings.
 e.g. For ARM Juno platform. See below
 
+- SCP_ENABLE_SCMI_SENSOR_EVENTS_INIT: Enable/disable SCMI sensor events.
+
 - SCP_ENABLE_FAST_CHANNELS_INIT: Enable/disable Juno Fast channels.
 
 - SCP_ENABLE_DEBUG_UNIT_INIT: Enable/disable Juno debug unit.
diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt
index 3b3e5b835..5dac94482 100644
--- a/framework/CMakeLists.txt
+++ b/framework/CMakeLists.txt
@@ -60,7 +60,7 @@ endif()
 if(SCP_ENABLE_SCMI_NOTIFICATIONS)
     target_compile_definitions(framework PUBLIC "BUILD_HAS_SCMI_NOTIFICATIONS")
     if(SCP_ENABLE_SCMI_SENSOR_EVENTS)
-        target_compiler_definitions(framework PUBLIC "BUILD_HAS_SCMI_SENSOR_EVENTS")
+        target_compile_definitions(framework PUBLIC "BUILD_HAS_SCMI_SENSOR_EVENTS")
     endif()
 endif()
 
-- 
GitLab