首页 > 解决方案 > GN Build 添加具有 makefile 的子目录

问题描述

我正在尝试向需要第三方库tpm2-tss的铬添加功能。这个库有一个生成文件来构建它。

tpmthird_party目录中添加了一个文件夹并添加了一个BUILD.gn文件。该库也作为子目录添加到此文件夹中。

thirdparty
   ...other third-party folders
   tpm
      BUILD.gn
      tmp2-tss/
         Makefile
         ...

我尝试使用添加库

config("tpm_config"){
  include_dirs = ["tpm2-tss"]
}

在 BUILD.gn 中,然后configs += ["//thirdparty/tpm:tpm_config"]在我想使用库的地方使用。这当然不起作用,因为 tpm2-tss 库不是仅标头。但是,我找不到一种方法来告诉 GN Build 系统使用它提供的 Makefile 来构建/链接这个库。

有没有办法在 GN 中使用 makefile 或者我需要将 Makefile 重写为 BUILD.gn?

这只是为了证明概念,所以我不需要一个合适的解决方案来满足铬存储库的通常标准。

标签: makefilechromiumgn

解决方案


GN 对其他构建系统一无所知,并且除了编译/归档/链接之外,还需要您构建操作(或模板)。

因此,在您的情况下,您可能希望将 BUILD.gn 文件放在第三方事物的根目录中,如下所示:

action("tpm") {
  script = "make.py" # assumes you're using Python
  outputs = [ "${target_out_dir}/libtpm.a", ... ] # or whatever
  sources = [ ... ] # List tpm sources here
  args = [ ... ] # whatever make.py needs
}

如果 tpm 不经常更改,或者如果您总是在更改之前清理构建,则可以跳过该sources部分;这就是 GN 在目标上发出源文件依赖关系的地方。

或者,如果这是您经常做的事情,您可以将其包装在模板中:

template("make") {
  action(target_name) {
    script = "//path/to/make.py"
    ...
  }
}

然后在您的 BUILD.gn 文件中使用它:

import("//path/to/make.gni")

make("tpm") {
  ...
}

make.py可能看起来像这样:

import subprocess
return subprocess.run(['make', '-j'], check=True).returncode

推荐阅读