Browse Source

Added CI to compile more drivers for the changed BSP

dejavudwh 1 year ago
parent
commit
4cbc1893bd
2 changed files with 172 additions and 0 deletions
  1. 74 0
      .github/workflows/compile_bsp_with_drivers.yml
  2. 98 0
      tools/ci/compile_bsp_with_drivers.py

+ 74 - 0
.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

+ 98 - 0
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)