最近要搞一个uboot引导linux启动的活儿,将uboot源码下载下来后,第一感觉:uboot源码太多了。
统计c源码行数与.c文件数:
linux环境,在uboot根目录下执行如下命令:
u-boot$ find . -name "*.c" -print | xargs wc -l ... 150866 总用量 u-boot$ find . -name "*.c" | wc -l 5031 .c文件数量
显示总的C语言代码行数:15W行源代码。很容易让人望而生畏。
但实际上参与编译的c源码没有这么多,我们可以只保留参与编译的c源码文件,在不影响编译的情况下,减少代码量,这样方便我们阅读代码。
一般.o文件要么放在.c文件相同目录,要么放在另外一个目录下(目录结构与.c文件目录结构相同,仅第一层目录不同)
如下图所示:
AA(.c文件目录) BB(.o文件目录) / \ \ / \ \ A1 A2 aa.c A1 A2 aa.o / \ / bb.c cc.c bb.o
可见.c源文件中cc.c没有参与编译,可以将其删除。
方法1:可以将.o文件保存到列表里,然后查询c文件夹中的.c文件是否与列表中.o文件匹配,若不匹配则删掉。
但是如果不同文件夹下存在相同名字的.o文件,用这种方法需要带上路径进行匹配。
方法2:同时枚举.c文件夹文件和.o文件夹文件,若找到某个.o文件,则在.c文件夹中相同位置找.c文件,然后修改其访问时间(标记),操作完成后,再次枚举.c文件夹中的.c文件,若其访问时间没有被修改,则删除之。
以下采用方法2,注意在执行脚本之前注意备份源文件。
版本:python3
import os import time class Compare: def __init__(self, c, o): self.c_path = c self.o_path = o def touch_used_c(self): print (f"------> enter ${self.o_path}") if os.path.isdir(self.c_path) and os.path.isdir(self.o_path): # 判断是否是一个文件夹 c_path = os.listdir(self.c_path) o_path = os.listdir(self.o_path) for every_dir in o_path: o_filePath = os.path.join(self.o_path, every_dir) if os.path.isdir(o_filePath): if every_dir in c_path: # 进入C文件夹相同文件夹 c_filePath = os.path.join(self.c_path, every_dir) else: continue # 如果C文件夹中无相同文件夹,继续下一轮 else: c_filePath = os.path.join(self.c_path, every_dir.split('.')[0] + '.c') if os.path.isdir(o_filePath) and os.path.isdir(c_filePath): Compare(c_filePath, o_filePath).touch_used_c() # 文件夹递归 elif os.path.isfile(o_filePath) and os.path.isfile(c_filePath): print(o_filePath,"----->.o文件或可其它elf") print(c_filePath,"----->.c文件") os.utime(c_filePath, (1576335480, 1576335480)) # touch的时间点 def del_unused_c(self): if os.path.isdir(self.c_path): c_path = os.listdir(self.c_path) for every_dir in c_path: c_filePath = os.path.join(self.c_path, every_dir) if os.path.isdir(c_filePath): Compare(c_filePath, None).del_unused_c() # 文件夹递归 elif os.path.isfile(c_filePath): if c_filePath.endswith('.c'): #只del不参与编译的c文件 if (int(os.path.getatime(c_filePath)) != 1576335480): print(c_filePath,"---->删掉") os.remove(c_filePath) if __name__=="__main__": c_path = "E:\work\\u-boot_c\\u-boot" # 注意要修改路径 o_path = "E:\work\\u-boot_o\\u-boot" cp = Compare(c_path, o_path) start = time.perf_counter() print(start) cp.touch_used_c() # touch 编译过的C文件 cp.del_unused_c() # del不参与编译的C文件 end = time.perf_counter() print(end) print ("程序运行时间:",end - start)
u-boot$ find . -name "*.c" -print | xargs wc -l ... 134987 总用量 u-boot$ find . -name "*.c" | wc -l 303 .c文件数量
可见:c代码行数只减少了2W行,.c文件个数减少比较多。可能是因为参与编译的.c文件大文件较多。