删掉不参与编译的.c文件代码

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文件大文件较多。

posted @ 2022-02-18 22:41  sureZ_ok  阅读(139)  评论(0编辑  收藏  举报