make - 剥离未使用的文件

时间:2014-05-21 10:39:40

标签: c linux gcc makefile

在我目前的项目中,存在超过200MB的C文件。在制作目标时,我只能看到< 100MB用于创建二进制文件。如何识别创建目标时未触及的文件。因此,我们可以将其剥离并使代码库更加流畅。

如何识别编译时为目标创建的文件列表?

4 个答案:

答案 0 :(得分:1)

我可能会:

  1. make clean
  2. make 2>out将构建的完整日志捕获到文件
  3. grep out调用的gcc文件
  4. gcc调用
  5. 中筛选出文件名
  6. 构建这些文件名的排序列表
  7. 在项目中构建文件名的排序列表。
  8. 比较两者。
  9. 或类似的东西。不应该太难。

答案 1 :(得分:1)

我认为最好的方法是使用the methods Linux offers for monitoring file system access之一:

  1. inotifywait
  2. kfsmd
  3. loggerfs
  4. auditd / auditctl / ausearch
  5. 您还可以使用stracemake)运行strace -f make命令并解析open()次调用的输出。 这就是我过去常常做的事情。

    选择。

答案 2 :(得分:0)

另一种方法是为您的可执行文件和共享库打开(自动生成的)依赖项文件。它们将包含.o作为先决条件,通常对应于.c

这最适用于具有完整依赖关系树的非递归make构建系统。

答案 3 :(得分:0)

如果您的make是GNU make,您可以考虑 以下方法的变化。 (为简单起见,我假设是唯一的 感兴趣的源文件是.c个文件。)

假设我们在目录Makefile中有dir,这是默认的 目标和可能的其他目标,包括中间目标。

您可以使用另一个makefile,例如unused_srcs.mk中的include Makefile,以便dir可以运行:

make unused_srcs

将显示dir中没有的所有源文件的列表 贡献于默认目标。或者运行:

make unused_srcs target=TARG

对于某个目标TARG,并获取dir中所有源文件的列表 不参与TARG

这假定Makefile有一个clean目标,或者几个目标 clean[-???]的变体,可以适当地清除默认目标或 您可能感兴趣的任何目标,并且您不介意 为clean[-???]目标调用了合适的unused_srcs

例如,在dir我们有:

<强>的main.c

extern void boo(void);

int main(void)
{
    boo();
    return 0;
}

<强> boo.c

#include <stdio.h>

void boo(void)
{
    puts("Boo!");
}

<强> noop.c

void noop(void){}

<强>生成文件

.phony: all clean

all: boo

objs = main.o boo.o

boo: $(objs)
    gcc -o $@ $^

clean-obj:
    rm -f *.o

clean: clean-obj
    rm -f boo

# include /some/standard/place/unused_srcs.mk
include unused_srcs.mk

在一些标准的地方,为简单起见,我们假设再次dir, 我们有:

<强> unused_srcs.mk

.phony: unused_srcs

ifndef $(target)
target = all
endif

ifndef $(cleaner)
cleaner = clean
endif

all_srcs = $(wildcard *.c)
used_srcs = $(filter %.c,$(shell ($(MAKE) $(cleaner) && $(MAKE) -n -d $(target)) \
    | grep -e 'Considering target file' | sed -e "s/[\`\']//g" -e "s/\.$$//g" -))
unused_srcs = $(filter-out $(used_srcs),$(all_srcs))

unused_srcs:
    @echo $(unused_srcs)

在这个项目中: -

  • noop.c未被boo使用(完全是多余的)
  • {li> noop.cmain.c未被boo.o 使用 {li> noop.cboo.c未被main.o 使用

我们可以使用make unused_srcs命令发现这些事实:

$ make unused_srcs
noop.c
$ make unused_srcs target=boo
noop.c
$ make unused_srcs target=boo.o
main.c noop.c
$ make unused_srcs cleaner=clean-obj target=boo.o
main.c noop.c
$ make unused_srcs target=main.o
boo.c noop.c
$ make unused_srcs target=clean
boo.c main.c noop.c

显然,所有繁重的工作都是在$(used_srcs)的评估中完成的。 $(unused_srcs)中的unused_srcs.mk,主要是前者。

评估$(used_srcs)攻击GNU make的{​​{1}}选项,其中 生成完整的调试信息,以及任何来源的事实 必须考虑 对所选TARG做出贡献的文件 制定TARG时的潜在目标。

总之,这些事情意味着如果我们清理TARG然后运行-d 输出将是make -n -d TARG的干运行(-n)的调试信息, 在这个输出中有一行如下:

  

考虑目标文件`FILE.c'。

将显示每个make TARG文件.c,其中包含FILE.cTARG 没有其他可能存在的.c文件。

$(used_srcs)的评估会生成调试信息和过滤器 它提取.c文件的名称。

评估$(unused_srcs)然后只是清除$(used_srcs) 从所有.c文件的列表中。