import os
import sys
import rtconfig
import platform
import subprocess

from rtconfig import RTT_ROOT
import sys

def generate_ldscript(input, output):
    if not os.path.exists(input):
        print('Error: file', input, 'not found')
        return

    if os.path.exists(output):
        os.remove(output)

    if rtconfig.PLATFORM == 'gcc':

        gcc_cmd = os.path.join(rtconfig.EXEC_PATH, rtconfig.CC)

        # gcc -E -P -x c $input -o $output
        if (platform.system() == 'Windows'):
            child = subprocess.Popen([gcc_cmd, '-E', '-P', '-x', 'c', input, '-o', output], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
        else:
            child = subprocess.Popen(gcc_cmd + f' -E -P -x c {input} -o {output}', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

        child.communicate()

        print(output, 'is generated from', input)

sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
from building import *

TARGET = 'rtthread.' + rtconfig.TARGET_EXT

# apply soft-FPU config
options = LocalOptions("rtconfig.h")
soft_fpu = GetLocalDepend(options, 'BSP_RISCV_FPU_SOFT')
if soft_fpu:
    rtconfig.DEVICE = rtconfig.DEVICE.replace('-march=rv64imafdcv -mabi=lp64d', '-march=rv64imafdc -mabi=lp64')
    rtconfig.CFLAGS = rtconfig.CFLAGS.replace('-march=rv64imafdcv -mabi=lp64d', '-march=rv64imafdc -mabi=lp64')
    rtconfig.LFLAGS = rtconfig.LFLAGS.replace('-march=rv64imafdcv -mabi=lp64d', '-march=rv64imafdc -mabi=lp64')
    rtconfig.AFLAGS = rtconfig.AFLAGS.replace('-march=rv64imafdcv -mabi=lp64d', '-march=rv64imafdc -mabi=lp64')

DefaultEnvironment(tools=[])
env = Environment(tools = ['mingw'],
    AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
    CC = rtconfig.CC, CCFLAGS = 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']

Export('RTT_ROOT')
Export('rtconfig')

# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False)

generate_ldscript('link.lds', 'link.lds.generated')

# make a building
DoBuilding(TARGET, objs)

Clean(TARGET, 'link.lds.generated')
Clean(TARGET, 'build')
