本篇逐步说明binding.gpy常用字段,与字段含义。
同系列参考文章
binding.gpy文件模板
文件代码
{
"variables": {
# 变量部分:用于定义构建过程中使用的变量
# 这些变量可以在整个文件中被引用,以避免硬编码和重复
},
"includes": [
"../build/common.gypi"
# 包含部分:引用外部的 GYP 文件,将其内容包含到当前 GYP 文件中
# 这种方法可以重用公共配置,如通用变量、设置等
],
"target_defaults": {
# 目标默认值:定义构建目标的默认配置
# 这些配置会应用到所有的构建目标中,可以在具体目标中被覆盖
},
"targets": [
{
"target_name": "target_1",
# 构建目标 1 的配置
# target_name:目标名称,用于标识这个构建目标
},
{
"target_name": "target_2",
# 构建目标 2 的配置
# target_name:目标名称,用于标识这个构建目标
}
],
"conditions": [
["OS=='linux'", {
"targets": [
{
"target_name": "linux_target_3"
# 在 Linux 操作系统上特定的构建目标
# target_name:目标名称,用于标识这个构建目标
}
]
}],
["OS=='win'", {
"targets": [
{
"target_name": "windows_target_4"
# 在 Windows 操作系统上特定的构建目标
# target_name:目标名称,用于标识这个构建目标
}
]
}],
["OS=='mac'", {
"targets": [
{
"target_name": "macos_target_5"
# 在 macOS 操作系统上特定的构建目标
# target_name:目标名称,用于标识这个构建目标
}
]
}]
]
}
字段说明
- variables: 可以在文件的其他各个部分插入和使用的变量的定义。
- includes: 将包含在此文件中的其他文件的列表。
- target_defaults: 定义所有目标的默认配置,可以在每个目标中被覆盖。
- targets: 定义了两个基本目标 target_1 和 target_2。
- conditions: 根据操作系统定义不同的目标
binding.gpy可执行程序模板
文件代码
{
"targets": [
{
"target_name": "foo", # 构建目标的名称
"type": "executable", # 目标类型,这里指定为可执行文件
"msvs_guid": "5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65", # 在 Visual Studio 中的项目 GUID
"dependencies": [ # 目标的依赖项
"xyzzy", # 依赖的其他构建目标
"../bar/bar.gyp:bar", # 依赖于另一个 GYP 文件中的目标
],
"defines": [ # 预处理器定义
"DEFINE_FOO", # 定义宏 `DEFINE_FOO`
"DEFINE_A_VALUE=value", # 定义宏 `DEFINE_A_VALUE` 并赋值为 `value`
],
"include_dirs": [ # 包含的头文件目录
"..", # 包含父目录
],
"sources": [ # 源文件列表
"file1.cc", # 源文件 `file1.cc`
"file2.cc", # 源文件 `file2.cc`
],
"conditions": [ # 根据条件设置不同的配置
["OS=='linux'", { # 针对 Linux 系统的配置
"defines": [ # Linux 特定的预处理器定义
"LINUX_DEFINE", # 定义宏 `LINUX_DEFINE`
],
"include_dirs": [ # Linux 特定的包含目录
"include/linux", # 包含目录 `include/linux`
],
}],
["OS=='win'", { # 针对 Windows 系统的配置
"defines": [ # Windows 特定的预处理器定义
"WINDOWS_SPECIFIC_DEFINE", # 定义宏 `WINDOWS_SPECIFIC_DEFINE`
],
}]
],
},
],
}
字段说明
- targets: 定义了一个构建目标 foo。
- target_name: 目标名称是 foo。
- type: 目标类型是可执行文件。static_library 静态库、executable 可执行文件、shared_library 动态库
- msvs_guid: Visual Studio 项目的 GUID。这只是过渡性的。这是一个硬编码的 GUID 值,将在生成的 Visual Studio 解决方案文件中使用。这使我们能够签入chrome.sln与 gyp 生成的项目文件互操作的文件。一旦 Chromium 中的所有内容都由 gyp 生成,GUID 在调用过程中保持不变就不再重要了
- dependencies: 目标依赖于 xyzzy 和 ../bar/bar.gyp 文件中的 bar 目标。
- defines: 预处理器定义,包括 DEFINE_FOO 和 DEFINE_A_VALUE=value。
- include_dirs: 包含头文件所在的目录。
- sources: 源文件列表,包括 file1.cc 和 file2.cc。
- conditions: 根据不同操作系统设置不同的配置:
-
- 在 Linux 系统上,定义了宏 LINUX_DEFINE 并包含目录 include/linux。
- 在 Windows 系统上,定义了宏 WINDOWS_SPECIFIC_DEFINE。
binding.gpy库目标模板
文件代码
{
"targets": [
{
"target_name": "foo",
"type": "<(library)", # 指定生成的目标类型,例如静态库(static_library)或动态库(shared_library)。
"msvs_guid": "5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65", # MSVS项目的GUID,只在Windows上使用。
"dependencies": [
"xyzzy", # 当前目标的依赖项,可以是其他目标名称。
"../bar/bar.gyp:bar" # 另一个GYP文件中的目标依赖项。
],
"defines": [
"DEFINE_FOO", # 预处理器定义,定义宏 'DEFINE_FOO'。
"DEFINE_A_VALUE=value" # 预处理器定义并赋值宏 'DEFINE_A_VALUE'。
],
"include_dirs": [
".." # 指定包含路径,编译器将搜索这些目录以查找头文件。
],
"direct_dependent_settings": { # 直接依赖此目标的其他目标所继承的设置。
"defines": [
"DEFINE_FOO", # 直接依赖此目标的目标将继承此定义。
"DEFINE_ADDITIONAL" # 另一个直接依赖定义。
],
"linkflags": [] # 链接器标志,可以在此处添加特定的链接器选项。
},
"export_dependent_settings": [ # 导出的依赖设置,指定此目标所依赖的其他目标。
"../bar/bar.gyp:bar"
],
"sources": [
"file1.cc", # 要编译的源文件。
"file2.cc"
],
"conditions": [
["OS=='linux'", { # 当操作系统为 Linux 时,应用以下设置。
"defines": [
"LINUX_DEFINE" # 仅在 Linux 上定义的宏。
],
"include_dirs": [
"include/linux" # 仅在 Linux 上的包含路径。
]
}],
["OS=='win'", { # 当操作系统为 Windows 时,应用以下设置。
"defines": [
"WINDOWS_SPECIFIC_DEFINE" # 仅在 Windows 上定义的宏。
]
}, { # 非 Windows 平台时,应用以下设置。
"defines": [
"NON_WINDOWS_DEFINE" # 非 Windows 平台定义的宏。
]
}],
["OS=='mac'", { # 当操作系统为 macOS 时,应用以下设置。
"defines": [
"MACOS_DEFINE" # 仅在 macOS 上定义的宏。
],
"include_dirs": [
"include/macos" # 仅在 macOS 上的包含路径。
]
}]
]
}
]
}
字段说明
targets:包含构建目标的数组,每个目标都是一个对象。
target_name:目标的名称。
type:目标类型,例如 executable(可执行文件)、static_library(静态库)或 shared_library(动态库)。在这里使用 <(library) 作为占位符。
msvs_guid:Microsoft Visual Studio 项目的 GUID,仅在 Windows 平台上使用。
dependencies:当前目标依赖的其他目标或文件,可以是同一个 GYP 文件中的其他目标,也可以是其他 GYP 文件中的目标。
defines:预处理器定义的宏,编译器会在所有源文件中定义这些宏。
include_dirs:编译器搜索头文件的目录。
direct_dependent_settings:直接依赖此目标的其他目标将继承的设置。
defines:直接依赖此目标的目标将继承的预处理器宏定义。
linkflags:链接器标志,可以在此添加特定的链接器选项。
export_dependent_settings:导出的依赖设置,指定此目标所依赖的其他目标。
sources:要编译的源文件列表。
conditions:条件编译,根据不同的平台设置不同的编译选项。
一些特殊用法
特定名称的文件
添加特定于平台的源文件的最简单方法是使用以下标准后缀之一(假设您要添加一个全新的文件并为其命名):
- xx_linux (例如foo_linux.cc)
- xx_mac (例如foo_mac.cc)
- xx_posix (例如foo_posix.cc)
- xx_win (例如foo_win.cc)
说明:如果源文件名字为foo_mac.cc,foo_mac.cc文件将自动从非macOS版本的源列表删除
指定命令
<!@(command):执行指定的命令,并将其输出作为值。在 include_dirs 中使用可以动态获取 Node.js 头文件路径
构建文件示例
与平台无关的构建
{
"targets": [
{
"target_name": "new_unit_tests", # 目标的名称
"type": "executable", # 目标类型,指定生成的目标为可执行文件
"defines": [
"FOO" # 预处理器定义,定义了宏 FOO
],
"include_dirs": [
".." # 包含目录,编译器会在此目录中搜索头文件
],
"dependencies": [
"other_target_in_this_file", # 当前 GYP 文件中的其他目标
"other_gyp2:target_in_other_gyp2" # 其他 GYP 文件中的目标
],
"sources": [
"new_additional_source.cc", # 要编译的源文件
"new_unit_tests.cc" # 要编译的源文件
]
}
]
}
特殊平台的构建
{
"targets": [], # 主目标数组是空的,因为所有目标都在 conditions 中定义
"conditions": [
[
"OS==\"win\"", # 如果操作系统是 Windows
{
"targets": [
{
"target_name": "new_unit_tests", # 目标名称
"type": "executable", # 目标类型是可执行文件
"defines": [
"FOO" # 预处理器宏定义
],
"include_dirs": [
".." # 包含的目录(上一级目录)
],
"dependencies": [
"other_target_in_this_file", # 当前 GYP 文件中的另一个目标
"other_gyp2:target_in_other_gyp2" # 位于另一个 GYP 文件 other_gyp2 中的目标 target_in_other_gyp2
],
"sources": [
"new_additional_source.cc", # 要编译的源文件
"new_unit_tests.cc" # 要编译的源文件
]
}
]
}
],
[
"OS==\"linux\"", # 如果操作系统是 Linux
{
"targets": [
{
"target_name": "new_unit_tests", # 目标名称
"type": "executable", # 目标类型是可执行文件
"defines": [
"FOO", # 预处理器宏定义
"LINUX_DEFINE" # 仅在 Linux 平台上定义的宏
],
"include_dirs": [
"..", # 包含的目录(上一级目录)
"include/linux" # 仅在 Linux 平台上包含的目录
],
"dependencies": [
"other_target_in_this_file", # 当前 GYP 文件中的另一个目标
"other_gyp2:target_in_other_gyp2" # 位于另一个 GYP 文件 other_gyp2 中的目标 target_in_other_gyp2
],
"sources": [
"new_additional_source.cc", # 要编译的源文件
"new_unit_tests.cc" # 要编译的源文件
]
}
]
}
],
[
"OS==\"mac\"", # 如果操作系统是 macOS
{
"targets": [
{
"target_name": "new_unit_tests", # 目标名称
"type": "executable", # 目标类型是可执行文件
"defines": [
"FOO", # 预处理器宏定义
"MACOS_DEFINE" # 仅在 macOS 平台上定义的宏
],
"include_dirs": [
"..", # 包含的目录(上一级目录)
"include/macos" # 仅在 macOS 平台上包含的目录
],
"dependencies": [
"other_target_in_this_file", # 当前 GYP 文件中的另一个目标
"other_gyp2:target_in_other_gyp2" # 位于另一个 GYP 文件 other_gyp2 中的目标 target_in_other_gyp2
],
"sources": [
"new_additional_source.cc", # 要编译的源文件
"new_unit_tests.cc" # 要编译的源文件
]
}
]
}
]
]
}
添加宏定义
{
"targets": [
{
"target_name": "existing_target", # 目标名称
"defines": [
"FOO", # 预处理器宏定义,定义了宏 FOO
"BAR=some_value" # 预处理器宏定义,定义了宏 BAR,其值为 some_value
]
}
]
}
添加头文件路径
{
"targets": [
{
"target_name": "existing_target", # 目标名称
"include_dirs": [
"..", # 包含的上一级目录
"include" # 包含的相对路径为 'include' 的目录
]
}
]
}
添加编译器标志
{
"targets": [
{
"target_name": "existing_target", # 目标名称
"conditions": [
[
"OS==\"win\"", # 条件:操作系统是 Windows
{
"cflags": [
"/WX" # Windows 平台下的编译器标志,所有警告视为错误
]
},
{ # 否则 (OS != "win")
"cflags": [
"-Werror" # 非 Windows 平台下的编译器标志,所有警告视为错误
]
}
]
]
}
]
}
添加链接器设置
{
"targets": [
{
"target_name": "existing_target", # 目标名称
"conditions": [
[
"OS==\"linux\"", # 条件:操作系统是 Linux
{
"ldflags": [
"-pthread" # Linux 平台下的链接器标志,启用线程支持
]
}
]
]
}
]
}
添加依赖库
{
"targets": [
{
"target_name": "existing_target", # 目标名称
"conditions": [
[
"OS==\"linux\"", # 条件:操作系统是 Linux
{
"link_settings": {
"ldflags": [
"-pthread" # Linux 平台下的链接器标志,启用线程支持
],
"libraries": [
"-L/path/to/lib", # 指定库文件路径
"-lmylibrary" # 链接名为 libmylibrary.so 的库
]
}
}
],
[
"OS==\"win\"", # 条件:操作系统是 Windows
{
"link_settings": {
"libraries": [
"-L/LIBPATH:C:\\path\\to\\lib", # 指定库文件路径
"-lmylibrary.lib" # 链接名为 mylibrary.lib 的库
]
}
}
]
]
}
]
}
拷贝动态库到生成目录
{
"targets": [
{
"target_name": "existing_target", # 目标名称
"conditions": [
[
"OS==\"linux\"", # 条件:操作系统是 Linux
{
"link_settings": {
"ldflags": [
"-pthread" # Linux 平台下的链接器标志,启用线程支持
],
"libraries": [
"-L/path/to/lib", # 指定库文件路径
"-lmylibrary" # 链接名为 libmylibrary.so 的库
]
}
}
],
[
"OS==\"win\"", # 条件:操作系统是 Windows
{
"copies": [{
"destination": "<(PRODUCT_DIR)",
"files": [
"./dll/*" # 拷贝动态库到生成目录
]
}],
}
]
]
}
]
}