Files
c_soft/make_riscv.py

212 lines
4.9 KiB
Python
Raw Normal View History

2025-04-17 00:04:59 +08:00
import os
import sys
import time
import shutil
2025-04-17 00:04:59 +08:00
CC="riscv64-unknown-elf-gcc"
2025-04-17 11:14:53 +08:00
OBJCPY="riscv64-unknown-elf-objcopy"
OBJDUMP="riscv64-unknown-elf-objdump"
2025-04-17 00:04:59 +08:00
CFLAG=[
2025-06-26 17:41:33 +08:00
"-march=rv32i",
2025-04-17 00:04:59 +08:00
"-mabi=ilp32",
"-ffunction-sections",
"-fdata-sections",
"-ffast-math",
"-fno-common",
"-fno-builtin-printf",
"-Wall",
"-Werror",
"-g",
2025-04-17 15:35:32 +08:00
"-O0",
2025-04-17 00:04:59 +08:00
"-fno-omit-frame-pointer",
"-msave-restore"
]
2025-06-13 17:49:35 +08:00
DEF=[]
2025-06-13 14:38:32 +08:00
INC=[
"-I./riscv/rtthread/libcpu/risc-v/common",
"-I./riscv/rtthread/include",
"-I./riscv/startup",
"-I./riscv/rtthread/components/drivers/include"
]
2025-04-17 00:04:59 +08:00
SRC=[
2025-06-13 14:38:32 +08:00
"riscv/startup/main.c",
"riscv/startup/test.c",
# "riscv/startup/interrupt.c",
"riscv/startup/start.S",
# "riscv/startup/trap.S",
"riscv/startup/rtthread_irq.c",
"riscv/rtthread/libcpu/risc-v/common/atomic_riscv.c",
"riscv/rtthread/libcpu/risc-v/common/context_gcc.S",
"riscv/rtthread/libcpu/risc-v/common/cpuport.c",
"riscv/rtthread/libcpu/risc-v/common/interrupt_gcc.S",
"riscv/rtthread/libcpu/risc-v/common/trap_common.c",
"riscv/rtthread/src/clock.c",
"riscv/rtthread/src/components.c",
"riscv/rtthread/src/cpu.c",
"riscv/rtthread/src/idle.c",
"riscv/rtthread/src/ipc.c",
"riscv/rtthread/src/irq.c",
"riscv/rtthread/src/kservice.c",
"riscv/rtthread/src/mem.c",
"riscv/rtthread/src/memheap.c",
"riscv/rtthread/src/mempool.c",
"riscv/rtthread/src/object.c",
"riscv/rtthread/src/scheduler_comm.c",
# "riscv/rtthread/src/scheduler_mp.c",
"riscv/rtthread/src/scheduler_up.c",
"riscv/rtthread/src/signal.c",
"riscv/rtthread/src/slab.c",
"riscv/rtthread/src/thread.c",
"riscv/rtthread/src/timer.c",
"riscv/rtthread/src/klibc/kstdio.c",
"riscv/rtthread/src/klibc/kstring.c",
"riscv/rtthread/components/drivers/core/device.c"
2025-04-17 00:04:59 +08:00
]
2025-06-26 17:41:33 +08:00
LD_FILE="riscv/riscv.ld"
2025-04-17 11:14:53 +08:00
2025-04-17 00:04:59 +08:00
TARGET="riscv"
OUTPUT="output"
2025-06-13 17:49:35 +08:00
def tran_path(path:str):
2025-06-26 17:41:33 +08:00
path=os.path.normpath(os.path.join(OUTPUT,path))
base_path=os.path.dirname(path)
if not os.path.exists(base_path):
os.makedirs(base_path)
return path
2025-06-13 17:49:35 +08:00
# 判断是否需要重新生成
def check_rebuild(dst:str,src:list):
# print(f"src:{src}")
if(not os.path.exists(dst)):
return True
dst_time=os.path.getmtime(dst)
src_time=[]
for i in src:
src_time.append(os.path.getmtime(i))
src_time.sort()
if(src_time[-1]>dst_time):
return True
# for item in src_time:
# if(item>dst_time):
# return True
return False
# 读取.d文件返回依赖文件列表
def read_depend_files(name:str):
with open(name) as f:
lines=f.readlines()
t=''
for line in lines:
line=line.strip()
if(line[-1]=='\\'):
t+=line[:-1]
else:
t+=line
t=t.split(':')[-1].strip()
t=t.split(' ')
# print(f"依赖列表{t}")
return t
# 生成依赖关系
def build_depend(src:list):
flags=f"{' '.join(INC)} {' '.join(DEF)} {' '.join(CFLAG)}"
for i in src:
2025-06-26 17:41:33 +08:00
name=os.path.splitext(tran_path(i))[0]
2025-06-13 17:49:35 +08:00
dst='.'.join([name,'d'])
if(check_rebuild(dst,[i])):
cmd=f"{CC} -MM {i} -o {dst} {flags}"
2025-06-26 00:33:08 +08:00
print(f"更新 {dst}")
2025-06-13 17:49:35 +08:00
ret=os.system(cmd)
if(ret):
exit()
else:
# print(f"{i} 没有更新源文件")
pass
# 生成中间文件
def build_object(src:list):
flags=f"{' '.join(INC)} {' '.join(DEF)} {' '.join(CFLAG)}"
for i in src:
2025-06-26 17:41:33 +08:00
name_t=os.path.splitext(tran_path(i))
name=name_t[0]
file_type=name_t[-1]
2025-06-13 17:49:35 +08:00
dst='.'.join([name,'o'])
cd='.'.join([name,'d'])
cmd = ''
2025-06-26 17:41:33 +08:00
if(file_type in ['.c','.C']):
2025-06-13 17:49:35 +08:00
if(check_rebuild(dst,read_depend_files(cd))):
cmd=f"{CC} -c {i} -o {dst} {flags}"
else:
# print(f"{i} 没有更新依赖关系")
pass
2025-06-26 17:41:33 +08:00
elif(file_type in ['.s','.S','.asm','.ASM']):
if(check_rebuild(dst,read_depend_files(cd))):
2025-06-13 17:49:35 +08:00
cmd=f"{CC} -c {i} -o {dst} {flags}"
else:
# print(f"{i} 没有更新依赖关系")
pass
if(len(cmd)>0):
2025-06-26 00:33:08 +08:00
print(f"编译 {dst}")
2025-06-13 17:49:35 +08:00
ret=os.system(cmd)
if(ret):
exit()
# 生成可执行文件
def build_target(src:list):
flags=f"{' '.join(INC)} {' '.join(DEF)} {' '.join(CFLAG)}"
obj_list=[]
for i in src:
2025-06-26 17:41:33 +08:00
name=os.path.splitext(tran_path(i))[0]
obj_list.append('.'.join([name,'o']))
2025-06-13 17:49:35 +08:00
dst=os.path.join(OUTPUT,TARGET)+".elf"
if(check_rebuild(dst,obj_list)):
cmd=f"{CC} {' '.join(obj_list)} -o {dst} {flags} -T{LD_FILE} -Wall -Wextra -nostartfiles -Wl,-Map,\"{OUTPUT}/{TARGET}.map\""
2025-06-26 00:33:08 +08:00
print(f"链接 {dst}")
2025-06-13 17:49:35 +08:00
ret=os.system(cmd)
if(ret):
exit()
else:
# print(f"{dst} 没有更新的链接文件")
pass
def main():
global SRC
if not os.path.exists(OUTPUT):
os.mkdir(OUTPUT)
2025-06-13 17:49:35 +08:00
build_depend(SRC)
build_object(SRC)
build_target(SRC)
os.system(f"{OBJCPY} -O binary {OUTPUT}/{TARGET}.elf {OUTPUT}/{TARGET}.bin")
os.system(f"{OBJCPY} -O ihex {OUTPUT}/{TARGET}.elf {OUTPUT}/{TARGET}.hex")
os.system(f"{OBJDUMP} -d {OUTPUT}/{TARGET}.elf > {OUTPUT}/{TARGET}.lst")
if __name__ == "__main__":
main()