# -*- coding: utf-8 -*- """ Adapter module to integrate new OOP implementation with existing building.py. This module provides the bridge between the legacy function-based API and the new object-oriented implementation, ensuring backward compatibility. """ import os from typing import List, Dict, Any, Optional from .core import BuildContext from .environment import RTEnv from .generator import GeneratorConfig, GeneratorRegistry # Global variables for compatibility _context: Optional[BuildContext] = None def init_build_context(root_directory: str) -> BuildContext: """ Initialize the build context. This function should be called early in PrepareBuilding. Args: root_directory: RT-Thread root directory Returns: BuildContext instance """ global _context _context = BuildContext(root_directory) return _context def get_build_context() -> Optional[BuildContext]: """Get the current build context.""" return _context def inject_environment_methods(env) -> None: """ Inject RT-Thread methods into SCons Environment. This should be called in PrepareBuilding after environment setup. Args: env: SCons Environment object """ RTEnv.inject_methods(env) # Also set the environment in context if _context: _context.prepare_environment(env) def load_rtconfig(config_file: str = 'rtconfig.h') -> Dict[str, Any]: """ Load configuration from rtconfig.h. Args: config_file: Configuration file name Returns: Dictionary of build options """ if _context: _context.load_configuration(config_file) return _context.build_options return {} def DefineGroup(name: str, src: List[str], depend: Any = None, **kwargs) -> List: """ Legacy DefineGroup function for backward compatibility. This function delegates to the environment method. Args: name: Group name src: Source files depend: Dependencies **kwargs: Additional parameters Returns: List of build objects """ if _context and _context.environment: return _context.environment.DefineGroup(name, src, depend, **kwargs) else: # Fallback behavior print(f"Warning: DefineGroup called before environment setup for group '{name}'") return [] def GetDepend(depend: Any) -> bool: """ Legacy GetDepend function for backward compatibility. Args: depend: Dependency to check Returns: True if dependency is satisfied """ if _context: return _context.get_dependency(depend) return False def GetCurrentDir() -> str: """ Get current directory. Returns: Current directory path """ return os.path.abspath('.') def SrcRemove(src: List[str], remove: List[str]) -> None: """ Remove files from source list. Args: src: Source list (modified in place) remove: Files to remove """ if not isinstance(remove, list): remove = [remove] for item in remove: if item in src: src.remove(item) def GetBuildOptions() -> Dict[str, Any]: """ Get build options. Returns: Dictionary of build options """ if _context: return _context.build_options return {} def MergeGroups() -> List: """ Merge all registered groups. Returns: List of all build objects """ if _context: return _context.merge_groups() return [] def GenerateProject(target: str, env, projects: List) -> None: """ Generate IDE project files. Args: target: Target type (mdk5, iar, vscode, etc.) env: SCons Environment projects: Project list """ if not _context: print("Error: Build context not initialized") return # Get project info from registry project_info = _context.project_registry.get_project_info() # Create generator config config = GeneratorConfig( output_dir=os.getcwd(), project_name=os.path.basename(os.getcwd()), target_name="rtthread.elf" ) # Create and run generator try: generator = _context.generator_registry.create_generator(target, config) if generator.generate(_context, project_info): print(f"Successfully generated {target} project files") else: print(f"Failed to generate {target} project files") except Exception as e: print(f"Error generating {target} project: {e}") def PrepareModuleBuilding(env, root_directory, bsp_directory) -> None: """ Prepare for building a module. This is a simplified version of PrepareBuilding for module compilation. Args: env: SCons Environment root_directory: RT-Thread root directory bsp_directory: BSP directory """ # Initialize context context = init_build_context(root_directory) context.bsp_directory = bsp_directory # Inject methods inject_environment_methods(env) # Load configuration config_path = os.path.join(bsp_directory, 'rtconfig.h') if os.path.exists(config_path): load_rtconfig(config_path)