Browse Source

[scons] ci.attachconfig.yml is used in combination with scons

hydevcode 3 months ago
parent
commit
5886e262f9
3 changed files with 99 additions and 1 deletions
  1. 87 0
      tools/attachconfig.py
  2. 5 1
      tools/building.py
  3. 7 0
      tools/options.py

+ 87 - 0
tools/attachconfig.py

@@ -0,0 +1,87 @@
+import os
+import sys
+import shutil
+import yaml
+
+from SCons.Script import *
+
+# SCons AttachConfig Command Function
+def GenAttachConfigProject(program = None):
+    Rtt_Root = os.getcwd()
+    config_file = os.path.join(os.getcwd(), 'rtt_root', Rtt_Root, '.config')
+    config_bacakup = config_file+'.origin'
+    rtconfig_file = os.path.join(os.getcwd(), 'rtt_root', Rtt_Root, 'rtconfig.h')
+    rtconfig__bacakup = rtconfig_file+'.origin'
+    if GetOption('attach') == '?':
+        attachconfig=[]
+        GetAttachConfig("get",attachconfig,0)
+        print("\033[32m✅ AttachConfig has: \033[0m")
+        prefix=attachconfig[0]
+        for line in attachconfig:
+            temp_prefix=line.split(".", 1)
+            if prefix!=temp_prefix[0]:
+                print("\033[42m \033[30m------"+temp_prefix[0]+"------\033[0m")
+                prefix=temp_prefix[0]
+            print(line)
+            
+            
+    elif GetOption('attach') == 'default':
+        if os.path.exists(config_bacakup):
+            shutil.copyfile(config_bacakup, config_file)
+            os.remove(config_bacakup)
+        if os.path.exists(rtconfig__bacakup):
+            shutil.copyfile(rtconfig__bacakup, rtconfig_file)
+            os.remove(rtconfig__bacakup)
+        print("\033[32m✅ Default .config and rtconfig.h recovery success!\033[0m")
+    else:
+        attachconfig=GetOption('attach')
+        attachconfig_result=[]
+        GetAttachConfig("search",attachconfig,attachconfig_result)
+        if attachconfig_result==[]:
+            print("❌\033[31m Without this AttachConfig:"+attachconfig+"\033[0m")
+            return
+        if os.path.exists(config_bacakup)==False:
+            shutil.copyfile(config_file, config_bacakup)
+        if os.path.exists(rtconfig__bacakup)==False:
+            shutil.copyfile(rtconfig_file, rtconfig__bacakup)
+        with open(config_file, 'a') as destination:
+            for line in attachconfig_result:
+                destination.write(line + '\n')
+        from env_utility import defconfig
+        defconfig(Rtt_Root)
+        print("\033[32m✅ AttachConfig add success!\033[0m")
+
+def GetAttachConfig(action,attachconfig,attachconfig_result):
+    rtt_root = os.getcwd()
+    yml_files_content = []
+    directory = os.path.join(rtt_root, 'rtt_root', rtt_root, '.ci/attachconfig')
+    if os.path.exists(directory):
+            for root, dirs, files in os.walk(directory):
+                for filename in files:
+                    if filename.endswith('attachconfig.yml'):
+                        file_path = os.path.join(root, filename)
+                        if os.path.exists(file_path):
+                            try:
+                                with open(file_path, 'r') as file:
+                                    content = yaml.safe_load(file)
+                                    if content is None:
+                                        continue
+                                    yml_files_content.append(content)
+                            except yaml.YAMLError as e:
+                                print(f"::error::Error parsing YAML file: {e}")
+                                continue
+                            except Exception as e:
+                                print(f"::error::Error reading file: {e}")
+                                continue
+    for projects in yml_files_content:
+            for name, details in projects.items():
+                if details.get("kconfig") is None:
+                    continue
+                if(projects.get(name) is not None):
+                    if action == "get":
+                        attachconfig.append(name)
+                    if action == "search" and name == attachconfig:
+                        from ci.bsp_buildings import get_details_and_dependencies
+                        detail_list=get_details_and_dependencies([name],projects)
+                        for line in detail_list:
+                            attachconfig_result.append(line)

+ 5 - 1
tools/building.py

@@ -33,7 +33,6 @@ import operator
 import rtconfig
 import platform
 import logging
-
 from SCons.Script import *
 from utils import _make_path_relative
 from mkdist import do_copy_file
@@ -336,6 +335,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
         else:
             print('--global-macros arguments are illegal!')
 
+    if GetOption('attach'):
+        from attachconfig import GenAttachConfigProject
+        GenAttachConfigProject()
+        exit(0)
+
     if GetOption('genconfig'):
         from env_utility import genconfig
         genconfig()

+ 7 - 0
tools/options.py

@@ -141,3 +141,10 @@ def AddOptions():
                 action = 'store_true',
                 default = False,
                 help = 'make compile_commands.json')
+    AddOption('--attach',
+                dest = 'attach',
+                type = 'string',
+                help = 'View attachconfig or add attach to.config.'+\
+                'e.g. scons --attach=? View all attachconfig for the current bsp.'+\
+                ' or scons --attach=component.cherryusb_cdc Set option component.cherryusb_cdc inside attachconfig to.config.'+\
+                ' or scons --attach=default Restore.config and rtconfig to before attch was set.')