0

我正在尝试编写一个生成 .gch 文件的 GN 文件。我在这里浏览了 GN 文档

我只是不明白如何实现这一点,我是 GN 新手。所以让我解释一下我想要实现的目标。

我希望 GN 创建以下一对编译器命令:

my-clang -x c++-header pch/hello_world.h -o pch/hello_world.h.gch
my-clang -include pch/hello_world.h -o hello.out -c hello_world.cpp

我希望能够在我的 GN 文件中创建一个源集,如下所示:

source_set("source_set0") {
    precompiled_source = "//pch/hello_world.h"
    precompiled_header = "../pch/hello_world.h"

    cflags = [
        "-include$precompiled_header"
    ]

    sources = [
        "//hello_world.cpp",
    ]
}

然而,这实际上并没有生成预编译的头文件。

我希望我需要另一个 source_set 或等效项来专门编译头文件,但是我的理解是编译器需要 .gch 后缀才能将文件识别为预编译头文件。

所以我想我需要说服 GN 根据目标创建特定的输出文件

  • hello_world.h 文件输出 hello_world.h.gch
  • hello_world.cpp 输出 hello_world.o

理想情况下,我希望能够修改我的工具规范:

tool("cxx") {{
    command = "\"{cxx_exe}\" ... -c {{{{source}}}} -o {{{{output}}}}"        
    outputs = [
      "{{{{source_out_dir}}}}/{{{{target_output_name}}}}.{{{{source_name_part}}}}.o",
       **SOME CONDITION**
      "{{{{source_out_dir}}}}/{{{{target_output_name}}}}.{{{{source_name_part}}}}.h.gch",
    ]
  }}

然而,我对工具变量的阅读表明上述功能仅适用于 linker_tools。

GN 似乎也需要一些说服力来将 cxx 工具与 .h 文件相关联。

有没有人对此有任何经验或能够指出我正确的方向。

TL;博士

  • 我想用 GN 编译头文件以生成 .gch 文件
  • 我想在后面的编译步骤中使用 gch
  • 按照文档没有帮助,我是不是误会了
  • 如何说服 GN 编译 .h 文件
  • 我是否需要确保头文件的编译首先发生

谢谢你的时间

ps cpp 文件内容:

int main (void){
  const char*  greeting = "Hello world";
  print_greeting(greeting);
}

.h 文件内容

#pragma once
#include <iostream>

void print_greeting(const char* greeting){
  std::printf("%s", greeting);
}
4

1 回答 1

0

我明白了这一点,我修改了工具:

tool("cxx") {{
    command = "\"{cxx_exe}\" ... -c {{{{source}}}} -o {{{{output}}}}"        
    precompiler_header_type = "gcc"
    outputs = [
      "{{{{source_out_dir}}}}/{{{{target_output_name}}}}.{{{{source_name_part}}}}.o",
       **SOME CONDITION**
      "{{{{source_out_dir}}}}/{{{{target_output_name}}}}.{{{{source_name_part}}}}.h.gch",
    ]
  }}

然后更新我的 gn 文件:

config("precompiled_header"){
    precompiled_header="../pch/hello_world.h"
    precompiled_source="//pch/hello_world.h"
}

source_set("source_set1") {
    public_configs = [
        ":precompiled_header"
    ]

    sources = [
        "//hello_world.cpp",
    ]
}

事后看来,这实际上是文档所说的。GN 创建的命令行现在看起来像这样

ninja.exe -t 命令

"my-clang++.exe" ...  -O2 -g -x c++-header -c ../pch/hello_world.h -o obj/pch/source_set1.hello_world.h-cc.gch
"my-clang++.exe"  ...   -O2 -g -include obj/pch/source_set1.hello_world.h-cc -c ../hello_world.cpp -o obj/source_set1.hello_world.o

希望这对将来的人有所帮助

于 2020-06-24T13:39:09.077 回答