对于比较Linux内核的编译时间,如果以后会有很多(实际上)已编译的代码行,这将非常有帮助。 事先对内核源代码执行“ cloc”编译只是解决方案的一部分,因为此值对于每个内核配置都是相等的,无论是否配置为例如“ tinyconfig”或“ allyesconfig”或“ localmodconfig”。
向gcc邮件列表添加了可能支持该问题的请求
(https://gcc.gnu.org/ml/gcc-help/2019-03/msg00057.html)
编辑(来自下面的评论,来自Mike Kinghan的答案03/09/2019):
“这个数字应该是比较以前版本和未来几年不同版本Linux内核的编译时间的归一化因素。”
答案 0 :(得分:1)
似乎您想对编译器消耗的代码行进行计数 经过预处理。确切的意思是值得商,的,但是我 假设合理的计数方法足以满足您的需求 目的。一个GNU Make makefile,例如:
制作文件
%.o: %.c # Cancel built-in rule
%.o: %.i
$(CC) $(CFLAGS) -c $< -o $@
@loc=$$(wc -l $<); echo "Compiled $${loc%% *} LOC from $<"
%.i: %.c
$(CC) $(CPPFLAGS) -E -P $< > $@
说明了一种实现方法:-
Makefile避免了对源代码进行两次预处理的浪费,
因为gcc会将扩展名.i
识别为signifying a file of already-preprocessed
C source并将
不要再次对其进行预处理。也不必清理中间体
.i
个文件,因为GNU make将它们识别为中间文件和自动删除文件
他们。示例:
$ cat foo.c
#ifdef FOO
/* A
* B
* C
*/
int foo(int x, int y)
{
while(x < y) {
if (++x == y) {
return y;
}
--y;
}
while(y < x) {
if (++y == x) {
return x;
}
--x;
}
return y;
}
#else
/* D */
int bar(int x) {
return x * x;
}
#endif
$ make foo.o
cc -E -P foo.c > foo.i
cc -c foo.i -o foo.o
Compiled 3 LOC from foo.i
rm foo.i
$ rm foo.o
$ make CPPFLAGS=-DFOO foo.o
cc -DFOO -E -P foo.c > foo.i
cc -c foo.i -o foo.o
Compiled 16 LOC from foo.i
rm foo.i
您可能希望在预处理步骤中传递-P
option,如图所示,以禁止显示
行标记输出的产生将增加行数。例如。您可能不希望foo.i
成为:
$ cc -DFOO -E foo.c > foo.i
$ cat foo.i
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "foo.c"
int foo(int x, int y)
{
while(x < y) {
if (++x == y) {
return y;
}
--y;
}
while(y < x) {
if (++y == x) {
return x;
}
--x;
}
return y;
}
但希望它是:
$ cc -DFOO -E -P foo.c > foo.i
$ cat foo.i
int foo(int x, int y)
{
while(x < y) {
if (++x == y) {
return y;
}
--y;
}
while(y < x) {
if (++y == x) {
return x;
}
--x;
}
return y;
}
显然,对于一个编译了许多源文件的make系统,您应该 与添加每个文件的LOC报告相比,更多或不同的设备。