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