| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- # -*- 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)
|