1.自动构建脚本优化,自动识别工程类型。

This commit is contained in:
MacRsh
2024-01-18 07:58:51 +08:00
parent 9df8cf9780
commit 6617c0341a
2 changed files with 59 additions and 71 deletions

View File

@@ -11,7 +11,7 @@
import re import re
try: try:
from build import install_package from tool import install_package
except ImportError: except ImportError:
exit(1) exit(1)
@@ -28,7 +28,7 @@ except ImportError:
import curses import curses
try: try:
from build import log_print from tool import log_print
except ImportError: except ImportError:
exit(1) exit(1)
@@ -68,7 +68,7 @@ def generate_config_file(kconfig_file, config_in, config_out, header_out):
header_file.write("#endif /* _MR_CONFIG_H_ */\n") header_file.write("#endif /* _MR_CONFIG_H_ */\n")
header_file.close() header_file.close()
log_print('success', "config file make success") log_print('success', "mr-library config file make success")
def main(): def main():

View File

@@ -70,13 +70,13 @@ class MDK5:
break break
# Check mdk file, init self # Check mdk file, init self
if mdk_file: if mdk_file:
self.state = "ok"
self.path = os.path.dirname(mdk_file) self.path = os.path.dirname(mdk_file)
self.file = mdk_file self.file = mdk_file
self.tree = etree.parse(mdk_file) self.tree = etree.parse(mdk_file)
self.root = self.tree.getroot() self.root = self.tree.getroot()
else: else:
log_print('error', "MDK build failed, '.uvprojx' file not found") self.state = "not found"
exit(1)
def add_include_path(self, path): def add_include_path(self, path):
# Fix path # Fix path
@@ -92,14 +92,13 @@ class MDK5:
for path in paths: for path in paths:
self.add_include_path(path) self.add_include_path(path)
def add_files_new_group(self, name, files): def add_file_to_group(self, name, file):
# Fix name and files # Fix name and files
name = name.replace('\\', '/') name = name.replace('\\', '/')
fix_files = []
for file in files:
file = os.path.relpath(file, self.path).replace('\\', '/') file = os.path.relpath(file, self.path).replace('\\', '/')
fix_files.append(file) # Check name and file
files = fix_files if name is None or file is None:
return
# Add group # Add group
groups_node = self.tree.find('//Groups') groups_node = self.tree.find('//Groups')
group_node = groups_node.find(f"./Group[GroupName='{name}']") group_node = groups_node.find(f"./Group[GroupName='{name}']")
@@ -107,14 +106,10 @@ class MDK5:
group_node = etree.SubElement(groups_node, "Group") group_node = etree.SubElement(groups_node, "Group")
group_name_node = etree.SubElement(group_node, "GroupName") group_name_node = etree.SubElement(group_node, "GroupName")
group_name_node.text = name group_name_node.text = name
# Check files
if files is None:
return
# Add files # Add files
files_node = group_node.find("Files") files_node = group_node.find("Files")
if files_node is None: if files_node is None:
files_node = etree.SubElement(group_node, "Files") files_node = etree.SubElement(group_node, "Files")
for file in files:
# Add file # Add file
file_node = files_node.find(f"./File[FileName='{os.path.basename(file)}']") file_node = files_node.find(f"./File[FileName='{os.path.basename(file)}']")
if file_node is None: if file_node is None:
@@ -141,29 +136,15 @@ class MDK5:
file_extension = os.path.splitext(file_name_node.text)[1] file_extension = os.path.splitext(file_name_node.text)[1]
file_type = file_type_map.get(file_extension, '9') file_type = file_type_map.get(file_extension, '9')
file_type_node.text = file_type file_type_node.text = file_type
log_print('info', "add %s" % name) log_print('info', "add %s" % file)
def add_path_files(self, path): def add_file(self, file):
files = [] name = os.path.dirname(os.path.relpath(file, self.path).replace('\\', '/')).replace('../', '')
for root, dirs, fs in os.walk(path): self.add_file_to_group(name, file)
for f in fs:
files.append(os.path.relpath(os.path.join(root, f), self.path))
self.add_files_new_group(path, files)
def add_path_c_files(self, path): def add_files(self, files):
# Get c files for file in files:
files = [] self.add_file(file)
for root, dirs, fs in os.walk(path):
if root == path:
for f in fs:
if f.endswith(".c") or f.endswith(".cpp") or f.endswith(".cxx"):
file = os.path.relpath(os.path.join(root, f), self.path)
files.append(file)
# Fix name
name = os.path.relpath(path, self.path).replace('\\', '/').replace("../", "")
# Add group
if files:
self.add_files_new_group(name, files)
def use_gnu(self, enable=True): def use_gnu(self, enable=True):
# Check uAC6 # Check uAC6
@@ -204,13 +185,13 @@ class Eclipse:
break break
# Check eclipse file, init self # Check eclipse file, init self
if eclipse_file: if eclipse_file:
self.state = "ok"
self.path = os.path.dirname(eclipse_file) self.path = os.path.dirname(eclipse_file)
self.file = eclipse_file self.file = eclipse_file
self.tree = etree.parse(eclipse_file) self.tree = etree.parse(eclipse_file)
self.root = self.tree.getroot() self.root = self.tree.getroot()
else: else:
log_print('error', "eclipse build failed, '.cproject' not found") self.state = "not found"
exit(1)
def add_include_path(self, path): def add_include_path(self, path):
# Fix path # Fix path
@@ -281,18 +262,19 @@ class Eclipse:
log_print('success', "project build success") log_print('success', "project build success")
class MR: class MrLib:
def __init__(self): def __init__(self):
self.path = os.getcwd() self.path = os.getcwd()
self.files_paths = [] self.c_files = []
self.h_files = []
for root, dirs, files in os.walk(self.path): for root, dirs, files in os.walk(self.path):
if root == self.path: for f in files:
for path in dirs: if f.endswith(".c") or f.endswith(".cpp"):
file_path = os.path.join(root, path) self.c_files.append(os.path.join(root, f))
self.files_paths.append(file_path) elif f.endswith(".h"):
break self.h_files.append(os.path.join(root, f))
self.project_path = os.path.dirname(self.path) self.proj_path = os.path.dirname(self.path)
def generate_include_file(self): def generate_include_file(self):
header_out = os.path.join(self.path, "include/mr_lib.h").replace('\\', '/') header_out = os.path.join(self.path, "include/mr_lib.h").replace('\\', '/')
@@ -336,7 +318,7 @@ class MR:
header_file.write("#endif /* _MR_LIB_H_ */\n") header_file.write("#endif /* _MR_LIB_H_ */\n")
header_file.close() header_file.close()
log_print('success', "library include file make success") log_print('success', "mr-library include file make success")
def show_logo(): def show_logo():
@@ -367,35 +349,28 @@ def show_license():
"查看。建议您在使用前全面复核许可证内容, 以确保完全理解并同意接受其中的所有规定。") "查看。建议您在使用前全面复核许可证内容, 以确保完全理解并同意接受其中的所有规定。")
def build_mdk(): def build_mdk(mr_proj_path, include_path, c_files):
mr = MR()
# MDK project # MDK project
mdk_proj = MDK5(mr.project_path) mdk_proj = MDK5(mr_proj_path)
# Include path # Include path
mdk_proj.add_include_path(mr.path) mdk_proj.add_include_path(include_path)
# Add all c files # Add all c files
for files_path in mr.files_paths: mdk_proj.add_files(c_files)
mdk_proj.add_path_c_files(files_path)
# Use gnu # Use gnu
mdk_proj.use_gnu(True) mdk_proj.use_gnu(True)
# Save # Save
mdk_proj.save() mdk_proj.save()
# Generate include file
mr.generate_include_file()
def build_eclipse(): def build_eclipse(mr_proj_path, path):
mr = MR()
# Eclipse project # Eclipse project
eclipse_proj = Eclipse(mr.project_path) eclipse_proj = Eclipse(mr_proj_path)
# Include path # Include path
eclipse_proj.add_include_path(mr.path) eclipse_proj.add_include_path(path)
# Use auto init # Use auto init
eclipse_proj.use_auto_init() eclipse_proj.use_auto_init()
# Save # Save
eclipse_proj.save() eclipse_proj.save()
# Generate include file
mr.generate_include_file()
def menuconfig(): def menuconfig():
@@ -416,6 +391,24 @@ def menuconfig():
exit(1) exit(1)
def build():
mr_lib = MrLib()
# Build project
mdk5 = MDK5(mr_lib.proj_path)
eclipse = Eclipse(mr_lib.proj_path)
if mdk5.state == "ok":
build_mdk(mr_lib.proj_path, mr_lib.path, mr_lib.c_files)
elif eclipse.state == "ok":
build_eclipse(mr_lib.proj_path, mr_lib.path)
else:
log_print('error', "Project not found(MDK5 or Eclipse)")
exit(1)
# Generate include file
mr_lib.generate_include_file()
if __name__ == '__main__': if __name__ == '__main__':
# Show logo # Show logo
show_logo() show_logo()
@@ -423,14 +416,15 @@ if __name__ == '__main__':
# Parse arguments # Parse arguments
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-m", "--menuconfig", action="store_true", help="Run menuconfig") parser.add_argument("-m", "--menuconfig", action="store_true", help="Run menuconfig")
parser.add_argument("-b", "--build", action="store_true", help="Build project")
parser.add_argument("-lic", "--license", action="store_true", help="Show license") parser.add_argument("-lic", "--license", action="store_true", help="Show license")
parser.add_argument("-gli", "--generate_lib_include_file", action="store_true", parser.add_argument("-gli", "--generate_lib_include_file", action="store_true",
help="Generate library include file") help="Generate library include file")
group = parser.add_mutually_exclusive_group()
group.add_argument("-mdk", "--mdk", action="store_true", help="Build with MDK")
group.add_argument("-ecl", "--eclipse", action="store_true", help="Build with Eclipse")
args = parser.parse_args() args = parser.parse_args()
# Build
if args.build:
build()
# Menuconfig # Menuconfig
if args.menuconfig: if args.menuconfig:
menuconfig() menuconfig()
@@ -439,11 +433,5 @@ if __name__ == '__main__':
show_license() show_license()
# Generate library include file # Generate library include file
if args.generate_lib_include_file: if args.generate_lib_include_file:
mr = MR() mr = MrLib()
mr.generate_include_file() mr.generate_include_file()
# Build
if args.mdk:
build_mdk()
elif args.eclipse:
build_eclipse()