# 引入OS模块用于环境变量与路径操作
import os

# 导入构建系统提供的全部辅助函数与变量
from building import *

# 引入编译与芯片相关配置参数
import rtconfig

# 创建并配置 SCons 构建环境的函数
def create_env(proj_path = None):
    # 检查环境变量 SIFLI_SDK 是否已设置
    SIFLI_SDK = os.getenv('SIFLI_SDK')
    # 如果未设置，提示用户运行 SDK 根目录下的 set_env.bat 脚本
    if not SIFLI_SDK:
        print("Please run set_env.bat in root folder of SIFLI SDK to set environment.")
        # 退出程序，防止后续构建出错
        exit()

    # 根据是否传入 proj_path 决定 LCPU 子项目路径
    if proj_path:
        # 若传入 proj_path，则在其上级目录下寻找 lcpu 文件夹
        lcpu_proj_path = os.path.join(proj_path, '../lcpu')
    else:
        # 否则使用相对路径 ../lcpu
        lcpu_proj_path = '../lcpu'
    # 定义子项目名称
    lcpu_proj_name = 'lcpu'
    # 将 LCPU 子项目添加到主项目中，指定核心为 LCPU
    AddChildProj(lcpu_proj_name, lcpu_proj_path, True, core="LCPU")

    # 如果未指定 proj_path，则添加引导加载程序（BootLoader）
    if proj_path is None:
        # 使用 SDK 路径和芯片型号添加 BootLoader
        AddBootLoader(SIFLI_SDK, rtconfig.CHIP)

    # 设置 Sifli 平台默认的编译选项
    SifliEnv(proj_path)

    # 从 rtconfig 模块中尝试获取 CXX（C++ 编译器）变量，若不存在则返回 None
    cxx = getattr(rtconfig, 'CXX', None)
    # 如果未定义 CXX，则根据 CC（C 编译器）自动生成对应的 C++ 编译器名称
    # 若 CC 中包含 'gcc'，则将其替换为 'g++'；否则直接使用 CC 的值
    if not cxx:
        cxx = rtconfig.CC.replace('gcc', 'g++') if 'gcc' in rtconfig.CC else rtconfig.CC
    # 从 rtconfig 模块中尝试获取 CXXFLAGS（C++ 编译标志），若不存在则退而使用 CFLAGS（C 编译标志）
    cxxflags = getattr(rtconfig, 'CXXFLAGS', rtconfig.CFLAGS)

    # 创建 SCons 环境对象，指定使用 mingw 工具链
    env = Environment(tools = ['mingw'],
        # 汇编器及其标志
        AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
        # C 编译器及其标志
        CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
        # C++ 编译器及其标志
        CXX = cxx, CXXFLAGS = cxxflags,
        # 归档器及其标志
        AR = rtconfig.AR, ARFLAGS = '-rc',
        # 链接器及其标志
        LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
    # 将工具链可执行文件路径添加到环境变量 PATH 的前面，确保优先使用
    env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
    # 返回配置好的环境对象
    return env

# 执行构建的函数
def build(env):
    # 准备构建环境，返回待编译的对象列表
    objs = PrepareBuilding(env)

    # 拼接最终生成的目标文件路径：build_dir + 目标名 + 扩展名
    TARGET = os.path.join(env['build_dir'], rtconfig.TARGET_NAME + '.' + rtconfig.TARGET_EXT)
    
    # 执行实际的构建过程，生成目标文件
    DoBuilding(TARGET, objs)
