gcc是否有工具或编译器选项来计算“已编译的代码行”?

时间:2019-02-18 22:04:11

标签: gcc compilation linux-kernel

对于比较Linux内核的编译时间,如果以后会有很多(实际上)已编译的代码行,这将非常有帮助。 事先对内核源代码执行“ cloc”编译只是解决方案的一部分,因为此值对于每个内核配置都是相等的,无论是否配置为例如“ tinyconfig”或“ allyesconfig”或“ localmodconfig”。

向gcc邮件列表添加了可能支持该问题的请求
https://gcc.gnu.org/ml/gcc-help/2019-03/msg00057.html

编辑(来自下面的评论,来自Mike Kinghan的答案03/09/2019):
“这个数字应该是比较以前版本和未来几年不同版本Linux内核的编译时间的归一化因素。”

1 个答案:

答案 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报告相比,更多或不同的设备。