关于行动投入的GN参考
对于动作和action_foreach目标,输入应该是脚本的输入,不会有变化。这些应该是脚本通过导入使用的所有.py文件(主脚本本身将是操作的隐式依赖,因此不需要列出)。 对于操作目标,输入和源是相同的,但从样式的角度来看,建议遵循与action_foreach相同的规则,并将助手文件放在输入中,以及脚本(如果有的话)在源中使用的数据。 请注意,声明操作中的输入依赖项的另一种方法是让该操作编写一个help文件(请参阅“dependencies”)。这允许脚本动态地编写输入依赖项,在实际执行脚本之前可能不知道这些依赖项。这比在运行GN来确定输入时进行处理更有效,并且比硬编码列表更容易保持同步。
在我的例子中,有一个输入是可选的,所以我只想在它存在的情况下将它添加到列表中。我看不出有什么方法可以在GN中测试这一点。我可以使用解文件,但这是唯一的选择吗?
发布于 2022-02-06 15:55:28
构建args是一种解决方案,如果调用GN的任何内容都“知道”是否存在可选的输入文件:
BUILD.gn
declare_args() {
have_some_optional_input_file = false
}
action("my_action") {
inputs = [ ... ] # list of your required inputs
if (have_some_optional_input_file) {
inputs += [ "my_optional_input.whatever" ]
}
...
}如果它是真正不可知的,总是有exec_script“逃逸舱口”:脚本
这允许您在配置时运行任意脚本,GN将解析输出,就像您直接将其写入BUILd.gn文件一样。
由于GN需要知道每个构建的确切输入,所以可以这样做:
BUILD.gn
action("my_action") {
inputs = [ ... ] + exec_script("find_optional_inputs.py", [], "list lines")
}编写您的find_optional_inputs.py,以便它返回一个以换行符分隔的列表,其中包含您希望它添加到输入集中的所有文件。
不过,您的exec_script语句在每次调用GN时都会运行,即使它只是用于desc或ls这样的非变异子命令。此外,如果您的脚本在模板中,它将在每个实例化中运行一次。您的脚本还将在引用它的每个工具链上运行一次。您可以将--time参数添加到GN本身,以查看它需要多长时间,因此至少可以监视它!
https://stackoverflow.com/questions/68440970
复制相似问题