1 起因
最近要搞一个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源码文件,在不影响编译的情况下,减少代码量,这样方便我们阅读代码。
2 解决方案
一般.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,注意在执行脚本之前注意备份源文件。
3 python脚本
版本: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)
4 使用脚本处理后的结果
u-boot$ find . -name "*.c" -print | xargs wc -l
...
134987 总用量
u-boot$ find . -name "*.c" | wc -l
303 .c文件数量
可见:c代码行数只减少了2W行,.c文件个数减少比较多。可能是因为参与编译的.c文件大文件较多。