Files
c_soft/make.py

211 lines
4.3 KiB
Python
Raw Normal View History

2024-06-28 21:34:36 +08:00
# -*- coding: utf-8 -*-
2024-06-18 19:37:43 +08:00
import os
import sys
import time
2025-06-20 15:50:39 +08:00
from create_lambda_fun import search_lambda
2024-06-18 19:37:43 +08:00
'''
2024-06-28 21:34:36 +08:00
修改编译脚本之后需要全编译一次
2024-06-18 19:37:43 +08:00
'''
CC = 'gcc'
# CC = 'C:\\ARM_GCC\\bin\\arm-none-eabi-gcc'
# AS = CC + ' -x assembler-with-cpp'
# HEX = 'C:\\ARM_GCC\\bin\\arm-none-eabi-objcopy' + ' -O ihex'
# BIN = 'C:\\ARM_GCC\\bin\\arm-none-eabi-objcopy' + ' -O binary -S'
2025-06-20 15:50:39 +08:00
CSRC = ["main.c","test/lambda_test.c"]
2024-06-18 19:37:43 +08:00
2025-06-20 15:50:39 +08:00
CINC = ['-Isoft',"-Icpu", "-I./"]
2024-06-18 19:37:43 +08:00
CDEF = ["-DTEST","-DLINUX"]
2024-06-18 19:37:43 +08:00
ASRC = []
BUILD_DIR = 'build'
TARGET = 'hello'
2024-06-18 19:37:43 +08:00
# CFLAG = ["-Wall -pedantic -specs=nano.specs -mcpu=cortex-m3 -mthumb -lc -lm -lnosys -Og -Tstm32_boot.ld",
# f"-Wl,-Map={BUILD_DIR}/{TARGET}.map,--cref -Wl,--gc-sections"]
2024-06-28 21:34:36 +08:00
# -pedantic 这一项是ISO语法检验
CFLAG = ["-Wall -g","-pthread"]
2024-06-18 19:37:43 +08:00
2024-06-28 21:34:36 +08:00
# 找到指定后缀的文件
def find_type(path:str,fix:list):
2024-06-18 19:37:43 +08:00
dlist=os.listdir(path)
file_list=[]
for i in dlist:
ps=os.path.join(path, i)
if os.path.isdir(ps):
file_list+=find_type(ps,fix)
else:
suf=ps.split('.')[-1]
if(suf in fix):
file_list.append(ps)
return file_list
'''
2024-06-28 21:34:36 +08:00
.c编译为.o文件
编译脚本需要实现 如果.c文件有修改 则重新编译对应文件的.o文件
2024-06-18 19:37:43 +08:00
gcc -c test.c -o test.o
2024-06-28 21:34:36 +08:00
输出依赖关系到.d文件
2024-06-18 19:37:43 +08:00
gcc -MM main.c -o build/main.d
'''
def tran_path(path:str):
p=path.replace('\\','/')
p=p.replace('/','_')
if(p[0]=='.'):
return p[1:]
else:
return p
2024-06-28 21:34:36 +08:00
# 判断是否需要重新生成
def check_rebuild(dst:str,src:list):
# print(f"src:{src}")
2024-06-18 19:37:43 +08:00
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
2024-06-18 19:37:43 +08:00
return False
2024-06-28 21:34:36 +08:00
# 读取.d文件返回依赖文件列表
2024-06-18 19:37:43 +08:00
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
2024-06-18 19:37:43 +08:00
t=t.split(':')[-1].strip()
t=t.split(' ')
2024-06-28 21:34:36 +08:00
# print(f"依赖列表{t}")
2024-06-18 19:37:43 +08:00
return t
2024-06-28 21:34:36 +08:00
# 生成依赖关系
def build_depend(src:list):
2024-06-18 19:37:43 +08:00
flags=f"{' '.join(CINC)} {' '.join(CDEF)} {' '.join(CFLAG)}"
for i in src:
name=tran_path(i).split('.')[0]
dst='.'.join([name,'d'])
dst=os.path.join(BUILD_DIR,dst)
if(check_rebuild(dst,[i])):
cmd=f"{CC} -MM {i} -o {dst} {flags}"
print(cmd)
ret=os.system(cmd)
if(ret):
exit()
else:
2025-06-20 17:26:36 +08:00
# print(f"{i} 没有更新源文件")
pass
2024-06-18 19:37:43 +08:00
2024-06-28 21:34:36 +08:00
# 生成中间文件
def build_object(src:list):
2024-06-18 19:37:43 +08:00
flags=f"{' '.join(CINC)} {' '.join(CDEF)} {' '.join(CFLAG)}"
for i in src:
name_l=tran_path(i).split('.')
name=name_l[0]
file_type=name_l[-1]
dst='.'.join([name,'o'])
dst=os.path.join(BUILD_DIR,dst)
cd='.'.join([name,'d'])
cmd = ''
if(file_type in ['c','.C']):
cd=os.path.join(BUILD_DIR,cd)
if(check_rebuild(dst,read_depend_files(cd))):
cmd=f"{CC} -c {i} -o {dst} {flags}"
else:
2025-06-20 17:26:36 +08:00
# print(f"{i} 没有更新依赖关系")
pass
2024-06-18 19:37:43 +08:00
elif(file_type in ['s','S','asm','ASM']):
if(check_rebuild(dst,[i])):
2024-10-29 00:02:03 +08:00
# cmd=f"{AS} -c {i} -o {dst} {flags}"
pass
else:
2025-06-20 17:26:36 +08:00
# print(f"{i} 没有更新依赖关系")
pass
2024-06-18 19:37:43 +08:00
if(len(cmd)>0):
print(cmd)
ret=os.system(cmd)
if(ret):
exit()
2024-06-28 21:34:36 +08:00
# 生成可执行文件
def build_target(src:list):
2024-06-18 19:37:43 +08:00
flags=f"{' '.join(CINC)} {' '.join(CDEF)} {' '.join(CFLAG)}"
obj_list=[]
for i in src:
name=tran_path(i).split('.')[0]
obj_list.append(BUILD_DIR+'/'+'.'.join([name,'o']))
dst=os.path.join(BUILD_DIR,TARGET)
if(check_rebuild(dst,obj_list)):
cmd=f"{CC} {' '.join(obj_list)} -o {dst} {flags}"
print(cmd)
ret=os.system(cmd)
if(ret):
exit()
else:
2025-06-20 17:26:36 +08:00
# print(f"{dst} 没有更新的链接文件")
pass
2024-06-18 19:37:43 +08:00
def main():
global CSRC
global ASRC
2025-06-20 17:26:36 +08:00
if(not os.path.exists(BUILD_DIR)):
os.makedirs(BUILD_DIR)
CSRC+=find_type('soft',['c','C'])
CSRC+=find_type('cpu',['c','C'])
2025-06-20 15:50:39 +08:00
CSRC=search_lambda(CSRC)
2024-06-18 19:37:43 +08:00
# ASRC+=find_type('./',['s','S','asm','ASM'])
build_depend(CSRC)
build_object(CSRC)
# build_object(ASRC)
2024-06-18 19:37:43 +08:00
build_target(CSRC+ASRC)
if __name__ == "__main__":
main()