对于比较 Linux 内核编译时间,如果之后(实际上)编译的代码行有一个数字,那将非常有帮助。在编译之前对内核源执行“cloc”只是解决方案的一部分,因为该值对于每个内核配置都是相等的,无论是否配置为“tinyconfig”或“allyesconfig”或“localmodconfig”。
向 gcc 邮件列表添加了可能支持此问题的请求
( https://gcc.gnu.org/ml/gcc-help/2019-03/msg00057.html )
编辑(来自 Mike Kinghan 03/09/2019 回答下面的评论):
“这个数字应该是一个规范化因素,用于比较以前版本和未来几年不同版本的 linux 内核的编译时间。”
看来你要计算预处理后编译器消耗的代码行数。这究竟是什么意思是有争议的,但我认为合理的计数方式足以满足您的目的。一个 GNU Make 生成文件,例如:
生成文件
%.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
为表示已经预处理过的 C 源文件的文件,并且不会再次对其进行预处理。清理中间.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
选项,如图所示,以抑制会增加行数的行标记输出的产生。例如,您可能不想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-system,您可以设计更多或不同的设备来将每个文件的 LOC 报告相加。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句