import os import sys import rtconfig import subprocess IS_EXPORTED = False # setup RT-Thread Root Path if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: RTT_ROOT = os.path.join(os.getcwd(),'..','..','..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: from building import * except Exception as e: print('Cannot found RT-Thread root directory, please check RTT_ROOT') exit(-1) if RTT_ROOT == 'rt-thread': IS_EXPORTED = True # if kenrel and bsp has been exported by export_project.py # setup Phytium BSP Root Path if IS_EXPORTED: BSP_ROOT = '.' else: BSP_ROOT = os.path.join(RTT_ROOT ,'bsp','phytium') TARGET = 'rtthread_a64.' + rtconfig.TARGET_EXT DefaultEnvironment(tools=[]) env = Environment(tools = ['mingw'], AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, AR = rtconfig.AR, ARFLAGS = '-rc', LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) env.PrependENVPath('PATH', rtconfig.EXEC_PATH) env['ASCOM'] = env['ASPPCOM'] os.environ["BSP_ROOT"] = BSP_ROOT os.environ["SDK_DIR"] = os.path.join(BSP_ROOT,'libraries','phytium_standalone_sdk') Export('RTT_ROOT') Export('BSP_ROOT') Export('rtconfig') def is_phytium_sdk_installed(): py_target_folder = os.path.join(BSP_ROOT,"libraries","phytium_standalone_sdk") return os.path.exists(py_target_folder) def install_phytium_sdk(): if is_phytium_sdk_installed(): return 0 install_script_path = os.path.join(BSP_ROOT,"libraries","phytium_standalone_sdk_install.py") if os.path.exists(install_script_path): try: subprocess.call(["python", install_script_path]) except: subprocess.call(["python3", install_script_path]) if not is_phytium_sdk_installed(): print("Error: phytium_standalone_sdk install failed") exit(0) else: print("Error: phytium_standalone_sdk_install.py is not exists, exit compilation") exit(0) install_phytium_sdk() # prepare building environment objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False) if not IS_EXPORTED: # if project is not exported, libraries and board need to manually add # include libraries objs.extend(SConscript(os.path.join(BSP_ROOT,'libraries','SConscript'), variant_dir='build/libraries', duplicate=0)) # include board objs.extend(SConscript(os.path.join(BSP_ROOT,'board','SConscript'), variant_dir='build/board', duplicate=0)) # make a building # Preprocess linker script import subprocess lds_src = os.path.join(os.getcwd(), 'link.lds') lds_out = os.path.join(os.getcwd(), 'link_preprocessed.lds') try: subprocess.run([ rtconfig.CC, '-E', '-P', '-x', 'c', '-I', os.getcwd(), lds_src, '-o', lds_out ], check=True, capture_output=True) except subprocess.CalledProcessError as e: print(f"Warning: Failed to preprocess linker script: {e.stderr.decode() if e.stderr else str(e)}") # Update LFLAGS to use preprocessed linker script env['LINKFLAGS'] = env['LINKFLAGS'].replace('-T link.lds', '-T link_preprocessed.lds') # Clean generated linker script Clean(TARGET, lds_out) DoBuilding(TARGET, objs)