在我目前的项目中,存在超过200MB的C文件。在制作目标时,我只能看到< 100MB用于创建二进制文件。如何识别创建目标时未触及的文件。因此,我们可以将其剥离并使代码库更加流畅。
如何识别编译时为目标创建的文件列表?
答案 0 :(得分:1)
我可能会:
make clean
make 2>out
将构建的完整日志捕获到文件grep
out
调用的gcc
文件gcc
调用或类似的东西。不应该太难。
答案 1 :(得分:1)
我认为最好的方法是使用the methods Linux offers for monitoring file system access之一:
您还可以使用strace(make
)运行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
使用(完全是多余的)noop.c
和main.c
未被boo.o
使用
{li> noop.c
和boo.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.c
和TARG
没有其他可能存在的.c
文件。
$(used_srcs)
的评估会生成调试信息和过滤器
它提取.c
文件的名称。
评估$(unused_srcs)
然后只是清除$(used_srcs)
从所有.c
文件的列表中。