From 4cbc1893bd1f5e19a09fde573c4d1f46c8e5d561 Mon Sep 17 00:00:00 2001 From: dejavudwh Date: Thu, 29 Jun 2023 10:04:46 +0800 Subject: [PATCH] Added CI to compile more drivers for the changed BSP --- .../workflows/compile_bsp_with_drivers.yml | 74 ++++++++++++++ tools/ci/compile_bsp_with_drivers.py | 98 +++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 .github/workflows/compile_bsp_with_drivers.yml create mode 100644 tools/ci/compile_bsp_with_drivers.py diff --git a/.github/workflows/compile_bsp_with_drivers.yml b/.github/workflows/compile_bsp_with_drivers.yml new file mode 100644 index 0000000000..b5810b15d0 --- /dev/null +++ b/.github/workflows/compile_bsp_with_drivers.yml @@ -0,0 +1,74 @@ +# +# Copyright (c) 2006-2023, RT-Thread Development Team +# +# SPDX-License-Identifier: Apache-2.0 +# +# Change Logs: +# Date Author Notes +# 2023-06-27 dejavudwh the first version +# + +name: BSP compilation with more drivers + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + # Runs at 16:00 UTC (BeiJing 00:00) on the 1st of every month + schedule: + - cron: '0 16 1 * *' + push: + branches: + - master + paths-ignore: + - documentation/** + - '**/README.md' + - '**/README_zh.md' + pull_request: + branches: + - master + paths-ignore: + - documentation/** + - '**/README.md' + - '**/README_zh.md' + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + build: + runs-on: ubuntu-latest + name: BSP Compilation with More Drivers + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: 3.8 + + - name: Install Tools + shell: bash + run: | + sudo apt-get update + sudo apt-get -qq install gcc-multilib libncurses5 libncurses5-dev libncursesw5-dev scons + sudo python -m pip install --upgrade pip -qq + git config --global http.postBuffer 524288000 + git remote -v + git fetch origin + python -c "import tools.menuconfig; tools.menuconfig.touch_env()" + + - name: Install Arm ToolChains + if: ${{ success() }} + shell: bash + run: | + wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.3/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 + sudo tar xjf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 -C /opt + /opt/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gcc --version + echo "RTT_EXEC_PATH=/opt/gcc-arm-none-eabi-10-2020-q4-major/bin" >> $GITHUB_ENV + + - name: Bsp Scons Compile + if: ${{ success() }} + shell: bash + run: | + source ~/.env/env.sh + python tools/ci/compile_bsp_with_drivers.py diff --git a/tools/ci/compile_bsp_with_drivers.py b/tools/ci/compile_bsp_with_drivers.py new file mode 100644 index 0000000000..827eb952cb --- /dev/null +++ b/tools/ci/compile_bsp_with_drivers.py @@ -0,0 +1,98 @@ +# +# Copyright (c) 2006-2023, RT-Thread Development Team +# +# SPDX-License-Identifier: Apache-2.0 +# +# Change Logs: +# Date Author Notes +# 2023-06-27 dejavudwh the first version +# + +import subprocess +import logging +import os + +CONFIG_BSP_USING_X = ["CONFIG_BSP_USING_UART", "CONFIG_BSP_USING_I2C", "CONFIG_BSP_USING_SPI", "CONFIG_BSP_USING_ADC", "CONFIG_BSP_USING_DAC"] + +def init_logger(): + log_format = "[%(filename)s %(lineno)d %(levelname)s] %(message)s " + date_format = '%Y-%m-%d %H:%M:%S %a ' + logging.basicConfig(level=logging.INFO, + format=log_format, + datefmt=date_format, + ) + +def diff(): + result = subprocess.run(['git', 'diff', '--name-only', 'HEAD', 'origin/master', '--diff-filter=ACMR', '--no-renames', '--full-index'], stdout = subprocess.PIPE) + file_list = result.stdout.decode().strip().split('\n') + logging.info(file_list) + bsp_paths = set() + for file in file_list: + if "bsp/" in file: + logging.info("Modifed file: {}".format(file)) + bsp_paths.add(file) + + dirs = set() + for dir in bsp_paths: + dir = os.path.dirname(dir) + while "bsp/" in dir: + files = os.listdir(dir) + if ".config" in files and "rt-thread.elf" not in files and not dir.endswith("bsp"): + logging.info("Found bsp path: {}".format(dir)) + dirs.add(dir) + break + new_dir = os.path.dirname(dir) + dir = new_dir + + return dirs + +def check_config_in_line(line): + for config in CONFIG_BSP_USING_X: + if config in line and '#' in line: + logging.info("Found in {}".format(line)) + return config + + return "" + +def check_config_in_file(file_path): + configs = set() + found = False + try: + with open(file_path, 'r') as file: + for line in file: + line.strip() + if found: + res = check_config_in_line(line) + if res: + configs.add(res) + elif "On-chip Peripheral Drivers" in line: + logging.info("Found On-chip Peripheral Drivers") + found = True + except FileNotFoundError: + logging.error("The .config file does not exist for this BSP, please recheck the file directory!") + + return configs + +def modify_config(file_path, configs): + with open(file_path + "/rtconfig.h", 'a') as file: + for item in configs: + define1 = item.replace("CONFIG_BSP", "BSP") + define2 = item.replace("CONFIG_BSP", "RT") + file.write("#define " + define1 + "\n") + file.write("#define " + define2 + "\n") + +def recompile_bsp(dir): + logging.info("recomplie bsp: {}".format(dir)) + os.system("scons -C " + dir) + +if __name__ == '__main__': + init_logger() + recompile_bsp_dirs = diff() + for dir in recompile_bsp_dirs: + dot_config_path = dir + "/" + ".config" + configs = check_config_in_file(dot_config_path) + logging.info("add config:") + logging.info(configs) + logging.info("Add configurations and recompile!") + modify_config(dir, configs) + recompile_bsp(dir) \ No newline at end of file