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

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

# 检查环境变量 SIFLI_SDK 是否已设置，用于定位 SDK 根目录
SIFLI_SDK = os.getenv('SIFLI_SDK')
if not SIFLI_SDK:
    # 如果未设置，提示用户先运行 SDK 根目录下的 set_env.bat 来配置环境变量
    print("Please run set_env.bat in root folder of SIFLI SDK to set environment.")
    # 退出脚本，防止后续编译出错
    exit()
# 从 building 模块导入所有函数与变量，提供编译构建所需的基础功能
from building import *

# 调用 PrepareEnv()，初始化编译环境（如工具链路径、默认参数等）
PrepareEnv()

# 调用 SifliEnv()，根据当前选择的 CPU 类型（HCPU/LCPU/BCPU）设置默认 rtconfig 参数
SifliEnv()
# 如需执行预编译脚本，可取消下行注释；目前被注释掉
#os.system("prebuild.bat")
################################## change rtconfig.xxx to customize build ########################################
# 打印输出目录路径，调试用，当前被注释
# print (rtconfig.OUTPUT_DIR)

# 获取输出目录路径，后续用于拼接目标文件路径
OUTPUT_DIR = os.path.join(os.getcwd(), 'build_lcpu') + os.sep
rtconfig.OUTPUT_DIR = OUTPUT_DIR
# 拼接完整目标文件路径：输出目录 + 目标名 + 扩展名
TARGET = OUTPUT_DIR + rtconfig.TARGET_NAME + '.' + rtconfig.TARGET_EXT
# 拼接二进制目标文件路径：输出目录 + 目标名 + .bin
BIN_TARGET = OUTPUT_DIR + rtconfig.TARGET_NAME + '.bin'
# 设置编译后动作：使用 fromelf 工具将 ELF 转为 bin 文件，再调用 Python 脚本生成补丁源文件
rtconfig.POST_ACTION ='fromelf --bin $TARGET --output ' + OUTPUT_DIR + rtconfig.TARGET_NAME + '.bin \npython ../../../../../tools/patch/gen_src.py lcpu '+ BIN_TARGET + ' ../hcpu/src/ '
    
# 从 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)

# 调用 PrepareBuilding，扫描源码、生成对象文件列表并配置包含路径等
objs = PrepareBuilding(env)

# 执行最终链接，生成目标文件 TARGET
DoBuilding(TARGET, objs)
