summaryrefslogtreecommitdiff
path: root/tools/ci/compile_bsp_with_drivers.py
blob: 0ddc7c58e67ff55a598e70e6fa25553515721fda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#
# 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
import sys

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 check_scons_build_files(dir):
    missing = []
    for filename in ["SConstruct", "SConscript"]:
        if not os.path.isfile(os.path.join(dir, filename)):
            missing.append(filename)

    if missing:
        logging.error("missing %s in %s", ", ".join(missing), dir)
        return False

    return True

def recompile_bsp(dir):
    logging.info("recomplie bsp: {}".format(dir))
    if not check_scons_build_files(dir):
        return 1

    result = subprocess.run(["scons", "-C", dir])
    if result.returncode != 0:
        logging.error("scons failed for %s", dir)
    return result.returncode

if __name__ == '__main__':
    init_logger()
    recompile_bsp_dirs = diff()
    failed = 0
    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)
        if recompile_bsp(dir) != 0:
            failed += 1

    sys.exit(failed)