浏览代码

add package instance docs

ruki 6 月之前
父节点
当前提交
bbf8087467
共有 6 个文件被更改,包括 1045 次插入0 次删除
  1. 1 0
      docs/api/index.md
  2. 516 0
      docs/api/scripts/package_instance.md
  3. 1 0
      docs/config.ts
  4. 1 0
      docs/zh/api/index.md
  5. 525 0
      docs/zh/api/scripts/package_instance.md
  6. 1 0
      docs/zh/config.ts

+ 1 - 0
docs/api/index.md

@@ -16,4 +16,5 @@ outline: deep
 
 ## Scripts API
 
+- [Package Instance](/api/scripts/package_instance)
 - [Native Modules](/api/scripts/native_modules)

+ 516 - 0
docs/api/scripts/package_instance.md

@@ -0,0 +1,516 @@
+# Package instance
+
+This page describes the interface for `package` of functions like `on_load()`, `on_install()` or `on_test()` of the [Package Dependencies](https://xmake.io/#/manual/package_dependencies.md)
+
+## package:name
+
+- Get the name of the package
+
+## package:get
+
+- Get the values of the package by name
+
+```lua
+-- get the dependencies
+package:get("deps")
+-- get the links
+package:get("links")
+-- get the defined macros
+package:get("defines")
+```
+
+## package:set
+
+- Set the values of the package by name
+
+If you just want to add values use [package:add](#package-add)
+
+```lua
+-- set the dependencies
+package:set("deps", "python")
+-- set the links
+package:set("links", "sdl2")
+-- set the defined macros
+package:set("defines", "SDL_MAIN_HANDLED")
+```
+
+## package:add
+
+- Add to the values of the package by name
+
+```lua
+-- add dependencies
+package:add("deps", "python")
+-- add links
+package:add("links", "sdl2")
+-- add defined macros
+package:add("defines", "SDL_MAIN_HANDLED")
+```
+
+## package:license
+
+- Get the license of the package
+
+Same as `package:get("license")`
+
+## package:description
+
+- Get the description of the package
+
+Same as `package:get("description")`
+
+## package:plat
+
+- Get the platform of the package. Can be any of:
+  + windows
+  + linux
+  + macosx
+  + android
+  + iphoneos
+  + watchos
+  + mingw
+  + cygwin
+  + bsd
+
+If the package is binary [`os.host`](http://xmake.io/#/manual/builtin_modules.md#oshost) is returned
+
+## package:arch
+
+- Get the architecture of the package (e.g. x86, x64, x86_64)
+
+If the package is binary [`os.arch`](http://xmake.io/#/manual/builtin_modules.md#osarch) is returned
+
+## package:targetos
+
+- Get the targeted OS of the package.
+
+There are the same values as [package:plat](#package-plat)
+
+## package:targetarch
+
+- Get the targeted architecture of the package.
+
+There are the same values as [package:arch](#package-arch)
+
+## package:is_plat
+
+- Wether the current platform is one of the given platforms
+
+```lua
+-- Is the current platform android?
+package:is_plat("android")
+-- Is the current platform windows, linux or macosx?
+package:is_plat("windows", "linux", "macosx")
+```
+
+## package:is_arch
+
+- Wether the current platform is one of the given platforms
+
+```lua
+-- Is the current architecture x86
+package:is_arch("x86")
+-- Is the current architecture x64 or x86_64
+package:is_arch("x64", "x86_64")
+```
+
+## package:is_targetos
+
+- Wether the currently targeted OS is one of the given OS
+
+```lua
+-- Is the currently targeted OS windows?
+package:is_targetos("windows")
+-- Is the currently targeted OS android or iphoneos?
+package:is_targetos("android", "iphoneos")
+```
+
+## package:is_targetarch
+
+- Wether the currently targeted architecture is one of the given architectures
+
+```lua
+-- Is the currently targeted architecture x86
+package:is_targetarch("x86")
+-- Is the currently targeted architecture x64 or x86_64
+package:is_targetarch("x64", "x86_64")
+```
+
+## package:alias
+
+- Get the alias of the package
+
+If the user sets an alias like so:
+```lua
+add_requires("libsdl", {alias = "sdl"})
+```
+This alias can be retrieved by
+```lua
+-- returns "sdl"
+package:alias()
+```
+
+## package:urls
+
+- Get the URLs of the package
+
+Retrieve the URLs set by:
+```lua
+add_urls("https://example.com/library-$(version).zip")
+-- or so
+set_urls("https://example.com/library-$(version).zip")
+```
+Then write this:
+```lua
+-- returns the table {"https://example.com/library-$(version).zip"}
+package:urls()
+```
+
+## package:dep
+
+- Get a dependency of the package by name. The name needs to be a dependency of the package.
+
+```lua
+local python = package:dep("python")
+-- returns "python"
+python:name()
+```
+
+## package:deps
+
+- Get all dependencies of the package
+
+```lua
+-- prints the names of all dependencies
+for _,dep in pairs(package:deps()) do
+    print(dep:name())
+end
+```
+
+## package:sourcehash
+
+- Get the sha256 checksum of an URL alias
+
+If the checksum is provided like so:
+```lua
+add_urls("https://example.com/library-$(version).zip", {alias = "example"})
+add_versions("example:2.4.1", "29f9983cc7196e882c4bc3d23d7492f9c47574c7cf658afafe7d00c185429941")
+```
+You can retrieve the checksum like so:
+```lua
+-- returns "29f9983cc7196e882c4bc3d23d7492f9c47574c7cf658afafe7d00c185429941"
+package:sourcehash("example")
+-- or so
+package:sourcehash(package:url_alias(package:urls()[1]))
+```
+
+## package:kind
+
+- Get the kind of the package. Can be any of:
+  + binary
+  + toolchain (is also binary)
+  + library (default)
+  + template [#2138](https://github.com/xmake-io/xmake/issues/2138)
+  + headeronly
+
+## package:is_binary
+
+- Wether the package is of kind binary
+
+
+## package:is_toolchain
+
+- Wether the package is of kind toolchain
+
+
+## package:is_library
+
+- Wether the package is of kind library
+
+## package:is_toplevel
+
+- Wether the package is directly required by the user (e.g. xmake.lua)
+
+## package:is_thirdparty
+
+- Wether the package is provided by a thirdparty package manager (e.g. brew, conan, vcpkg)
+
+
+## package:is_debug
+
+- Wether the package is build with debug mode (Same as `package:config("debug")`)
+
+
+## package:is_supported
+
+- Wether the package is supported by the current platform and architecture
+
+
+## package:debug
+
+- Wether the the package gets built with debug mode
+
+It's deprecated, please use [`package:is_debug`](#package-is_debug) instead
+
+## package:is_cross
+
+- Wether the package is getting cross-compiled
+
+
+## package:cachedir
+
+- Get the cache directory of the package
+
+
+## package:installdir
+
+- Get the installation directory of the package. Can also be used to get a subdirectory. If the given directory tree does not exist it will be created.
+
+```lua
+-- returns the installation directory
+package:installdir()
+-- returns the subdirectory include inside the installation directory
+package:installdir("include")
+-- returns the subdirectory include/files
+package:installdir("include", "files")
+```
+
+## package:scriptdir
+
+- Get the directory where the xmake.lua of the package lies
+
+
+## package:envs
+
+- Get the exported environment variables of the package
+
+
+## package:getenv
+
+- Get the given environment variable
+
+```lua
+-- returns a table
+package:getenv("PATH")
+```
+
+## package:setenv
+
+- Set the given environment variable. Overwrites the variable
+
+```lua
+-- sets PATH to {"bin", "lib"}
+package:setenv("PATH", "bin", "lib")
+```
+
+## package:addenv
+
+- Add the given values to the environment variable
+
+```lua
+-- adds "bin" and "lib" to PATH
+package:addenv("PATH", "bin", "lib")
+```
+
+## package:versions
+
+- Get all version strings of the package. Returns a table containing all versions as strings
+
+
+## package:version
+
+- Get the version of the package
+
+```lua
+local version = package:version()
+-- get the major version
+version:major()
+-- get the minor version
+version:minor()
+-- get the patch version
+version:patch()
+```
+
+## package:version_str
+
+- Get the version of the package as string
+
+
+## package:config
+
+- Get the given configuration value of the package
+
+```lua
+-- if configurations are set like so
+add_require("example", {configs = {enable_x = true, value_y = 6}})
+-- these values can be retrieved like so
+-- returns true
+package:config("enable_x")
+-- returns 6
+package:config("value_y")
+```
+
+## package:config_set
+
+- Set the given configuration value of the package
+
+```lua
+package:config_set("enable_x", true)
+package:config_set("value_y", 6)
+```
+
+## package:configs
+
+- Get all configurations of the package
+
+```lua
+-- returns a table with the configuration names as keys and their values as values
+local configs = package:configs()
+local enable_x = configs["enable_x"]
+local value_y = configs["value_y"]
+```
+
+## package:buildhash
+
+- Get the build hash of the package
+
+
+## package:patches
+
+- Get all patches of the current version
+
+```lua
+-- returns a table with all patches
+local patches = package:patches()
+-- each element contains the keys "url" and "sha256"
+local url = patches[1]["url"]
+local sha256 = patches[1]["sha256"]
+```
+
+## package:has_cfuncs
+
+- Wether the package has the given C functions
+
+This should be used inside `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:has_cfuncs("foo"))
+  -- you can also add configs
+  assert(package:has_cfuncs("bar", {includes = "foo_bar.h"}))
+  assert(package:has_cfuncs("blob", {includes = "blob.h", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_cfuncs("bla", {configs = {languages = "c99"}}))
+end)
+```
+
+## package:has_cxxfuncs
+
+- Wether the package has the given C++ functions
+
+This should be used inside `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:has_cxxfuncs("foo"))
+  -- you can also add configs
+  assert(package:has_cxxfuncs("bar", {includes = "foo_bar.hpp"}))
+  assert(package:has_cxxfuncs("blob", {includes = "blob.hpp", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_cxxfuncs("bla", {configs = {languages = "cxx17"}}))
+end)
+```
+
+## package:has_ctypes
+
+- Wether the package has the given C types
+
+This should be used inside `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:has_ctypes("foo"))
+  -- you can also add configs
+  assert(package:has_ctypes("bar", {includes = "foo_bar.h"}))
+  assert(package:has_ctypes("blob", {includes = "blob.h", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_ctypes("bla", {configs = {languages = "c99"}}))
+end)
+```
+
+## package:has_cxxtypes
+
+- Wether the package has the given C++ types
+
+This should be used inside `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:has_cxxtypes("foo"))
+  -- you can also add configs
+  assert(package:has_cxxtypes("bar", {includes = "foo_bar.hpp"}))
+  assert(package:has_cxxtypes("blob", {includes = "blob.hpp", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_cxxtypes("bla", {configs = {languages = "cxx17"}}))
+end)
+```
+
+## package:has_cincludes
+
+- Wether the package has the given C header files
+
+This should be used in `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:has_cincludes("foo.h"))
+end)
+```
+
+## package:has_cxxincludes
+
+- Wether the package has the given C++ header files
+
+This should be used in `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:has_cxxincludes("foo.hpp"))
+end)
+```
+
+## package:check_csnippets
+
+- Wether the given C snippet can be compiled and linked
+
+This should be used in `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:check_csnippets({test = [[
+    #define USE_BLOB
+    #include <blob.h>
+    void test(int argc, char** argv) {
+      foo bar;
+      printf("%s", bar.blob);
+    }
+  ]]}, {configs = {languages = "c99"}, includes = "foo.h"}))
+end)
+```
+
+## package:check_cxxsnippets
+
+- Wether the given C++ snippet can be compiled and linked
+
+This should be used in `on_test` like so:
+```lua
+on_test(function (package)
+  assert(package:check_cxxsnippets({test = [[
+    #define USE_BLOB
+    #include <blob.hpp>
+    void test(int argc, char** argv) {
+      foo bar();
+      std::cout << bar.blob;
+    }
+  ]]}, {configs = {languages = "cxx11"}, includes = "foo.hpp"}))
+end)
+```
+
+## package:check_fcsnippets
+
+- Wether the given Fortran snippet can be compiled and linked
+
+see above

+ 1 - 0
docs/config.ts

@@ -87,6 +87,7 @@ function descriptionApiGuide(): DefaultTheme.SidebarItem[] {
 
 function scriptsApiGuide(): DefaultTheme.SidebarItem[] {
   return [
+    { text: 'Package Instance', link: '/package_instance' },
     { text: 'Native Modules', link: '/native_modules' }
   ]
 }

+ 1 - 0
docs/zh/api/index.md

@@ -15,4 +15,5 @@ outline: deep
 
 ## 脚本域 API
 
+- [包实例](/zh/api/scripts/package_instance)
 - [原生模块](/zh/api/scripts/native_modules)

+ 525 - 0
docs/zh/api/scripts/package_instance.md

@@ -0,0 +1,525 @@
+# 包实例
+
+此页面描述了 [包依赖管理](https://xmake.io/#/zh-cn/manual/package_dependencies.md) 的 `on_load()`、`on_install()` 或 `on_test()` 等函数的 `package` 接口
+
+## package:name
+
+- 获取包的名字
+
+## package:get
+
+- 获取包在描述域的配置值
+
+任何在描述域的 `set_xxx` 和 `add_xxx` 配置值都可以通过这个接口获取到。
+
+```lua
+-- get the dependencies
+package:get("deps")
+-- get the links
+package:get("links")
+-- get the defined macros
+package:get("defines")
+```
+
+## package:set
+
+- 设置包的配置值
+
+如果你想添加值可以用 [package:add](#package-add)。
+
+```lua
+-- set the dependencies
+package:set("deps", "python")
+-- set the links
+package:set("links", "sdl2")
+-- set the defined macros
+package:set("defines", "SDL_MAIN_HANDLED")
+```
+
+## package:add
+
+- 按名称添加到包的值
+
+```lua
+-- add dependencies
+package:add("deps", "python")
+-- add links
+package:add("links", "sdl2")
+-- add defined macros
+package:add("defines", "SDL_MAIN_HANDLED")
+```
+
+## package:license
+
+- 获取包的许可证(同`package:get("license")`)
+
+## package:description
+
+- 获取包的描述(同`package:get("description")`)
+
+## package:plat
+
+- 获取包的平台。 可以是以下任何一种:
+  + windows
+  + linux
+  + macosx
+  + android
+  + iphoneos
+  + watchos
+  + mingw
+  + cygwin
+  + bsd
+
+如果包是二进制的,则会返回 [`os.host`](https://xmake.io/#/zh-cn/manual/builtin_modules.md#oshost) 的值
+
+## package:arch
+
+- 获取包的架构(例如 x86、x64、x86_64)
+
+如果包是二进制的,则返回 [`os.arch`](https://xmake.io/#/zh-cn/manual/builtin_modules.md#osarch)
+
+## package:targetos
+
+- 获取包的目标操作系统。
+
+可以具有与 [package:plat](#package-plat) 相同的值
+
+## package:targetarch
+
+- 获取包的目标架构。
+
+可以具有与 [package:arch](#package-arch) 相同的值
+
+## package:is_plat
+
+- 当前平台是否是给定平台之一
+
+```lua
+-- Is the current platform android?
+package:is_plat("android")
+-- Is the current platform windows, linux or macosx?
+package:is_plat("windows", "linux", "macosx")
+```
+
+## package:is_arch
+
+- 当前架构是否是给定架构之一
+
+```lua
+-- Is the current architecture x86
+package:is_arch("x86")
+-- Is the current architecture x64 or x86_64
+package:is_arch("x64", "x86_64")
+```
+
+## package:is_targetos
+
+- 当前目标操作系统是否是给定操作系统之一
+
+```lua
+-- Is the currently targeted OS windows?
+package:is_targetos("windows")
+-- Is the currently targeted OS android or iphoneos?
+package:is_targetos("android", "iphoneos")
+```
+
+## package:is_targetarch
+
+- 当前目标架构是否是给定架构之一
+
+```lua
+-- Is the currently targeted architecture x86
+package:is_targetarch("x86")
+-- Is the currently targeted architecture x64 or x86_64
+package:is_targetarch("x64", "x86_64")
+```
+
+## package:alias
+
+- 获取包的别名
+
+如果用户像这样设置别名:
+
+```lua
+add_requires("libsdl", {alias = "sdl"})
+```
+
+那么这个别名可以通过这个接口获取到:
+
+```lua
+-- returns "sdl"
+package:alias()
+```
+
+## package:urls
+
+- 获取包的 urls 列表
+
+如果我们设置了如下 URLs
+
+```lua
+add_urls("https://example.com/library-$(version).zip")
+-- or so
+set_urls("https://example.com/library-$(version).zip")
+```
+
+那么我们可以通过下面的接口来获取
+
+```lua
+-- returns the table {"https://example.com/library-$(version).zip"}
+package:urls()
+```
+
+## package:dep
+
+- 通过名称获取包的依赖项。 该名称需要是包的依赖项。
+
+```lua
+local python = package:dep("python")
+-- returns "python"
+python:name()
+```
+
+## package:deps
+
+- 获取包的所有依赖项
+
+```lua
+-- prints the names of all dependencies
+for _,dep in pairs(package:deps()) do
+    print(dep:name())
+end
+```
+
+## package:sourcehash
+
+- 获取 URL 别名的 sha256 校验和
+
+如果校验和是这样提供的:
+
+```lua
+add_urls("https://example.com/library-$(version).zip", {alias = "example"})
+add_versions("example:2.4.1", "29f9983cc7196e882c4bc3d23d7492f9c47574c7cf658afafe7d00c185429941")
+```
+
+您可以像这样获取它:
+
+```lua
+-- returns "29f9983cc7196e882c4bc3d23d7492f9c47574c7cf658afafe7d00c185429941"
+package:sourcehash("example")
+-- or so
+package:sourcehash(package:url_alias(package:urls()[1]))
+```
+
+## package:kind
+
+- 获取包的类型。 可以是以下任何一种:
+  + binary
+  + toolchain (is also binary)
+  + library (default)
+  + template [#2138](https://github.com/xmake-io/xmake/issues/2138)
+  + headeronly
+
+## package:is_binary
+
+- 包是否为二进制类型
+
+## package:is_toolchain
+
+- 报是否为工具链类型
+
+## package:is_library
+
+- 包是否为库类型
+
+## package:is_toplevel
+
+-- 包是否在用户 xmake.lua 里面通过 add_requires 直接引用
+
+## package:is_thirdparty
+
+- 包是否由第三方包管理器提供(例如 brew、conan、vcpkg)
+
+## package:is_debug
+
+- 包是否以调试模式构建
+
+同`package:config("debug")`
+
+## package:is_supported
+
+- 当前平台和架构是否支持该包
+
+## package:debug
+
+- 包是否使用调试模式构建
+
+不推荐使用:使用 [`package:is_debug`](#package-is_debug) 代替。
+
+## package:is_cross
+
+- 包是否正在交叉编译
+
+## package:cachedir
+
+- 获取包的缓存目录
+
+## package:installdir
+
+- 获取包的安装目录。 也可用于获取子目录。 如果给定的目录树不存在,它将被创建。
+
+```lua
+-- returns the installation directory
+package:installdir()
+-- returns the subdirectory include inside the installation directory
+package:installdir("include")
+-- returns the subdirectory include/files
+package:installdir("include", "files")
+```
+
+## package:scriptdir
+
+- 获取包的xmake.lua所在目录
+
+## package:envs
+
+- 获取包导出的环境变量
+
+## package:getenv
+
+- 获取给定的环境变量
+
+```lua
+-- returns a table
+package:getenv("PATH")
+```
+
+## package:setenv
+
+- 设置给定的环境变量。 覆盖变量
+
+```lua
+-- sets PATH to {"bin", "lib"}
+package:setenv("PATH", "bin", "lib")
+```
+
+## package:addenv
+
+- 将给定的值添加到环境变量
+
+```lua
+-- adds "bin" and "lib" to PATH
+package:addenv("PATH", "bin", "lib")
+```
+
+## package:versions
+
+- 获取包的所有版本列表。
+
+## package:version
+
+- 获取包的版本
+
+它会返回一个语义版本对象,便于做版本之间的判断。
+
+```lua
+local version = package:version()
+-- get the major version
+version:major()
+-- get the minor version
+version:minor()
+-- get the patch version
+version:patch()
+```
+
+## package:version_str
+
+- 以字符串形式获取包的版本
+
+## package:config
+
+- 获取包的给定配置值
+
+```lua
+-- if configurations are set like so
+add_require("example", {configs = {enable_x = true, value_y = 6}})
+-- these values can be retrieved like so
+-- returns true
+package:config("enable_x")
+-- returns 6
+package:config("value_y")
+```
+
+## package:config_set
+
+- 设置包的给定配置值
+
+```lua
+package:config_set("enable_x", true)
+package:config_set("value_y", 6)
+```
+
+## package:configs
+
+- 获取包的所有配置
+
+```lua
+-- returns a table with the configuration names as keys and their values as values
+local configs = package:configs()
+local enable_x = configs["enable_x"]
+local value_y = configs["value_y"]
+```
+
+## package:buildhash
+
+- 获取包的构建哈希
+
+它确保每个包,不同的配置安装到唯一的路径下,相互之间不冲突。
+
+## package:patches
+
+- 获取当前版本的所有补丁
+
+```lua
+-- returns a table with all patches
+local patches = package:patches()
+-- each element contains the keys "url" and "sha256"
+local url = patches[1]["url"]
+local sha256 = patches[1]["sha256"]
+```
+
+## package:has_cfuncs
+
+- 检测包是否具有给定的 C 函数
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:has_cfuncs("foo"))
+  -- you can also add configs
+  assert(package:has_cfuncs("bar", {includes = "foo_bar.h"}))
+  assert(package:has_cfuncs("blob", {includes = "blob.h", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_cfuncs("bla", {configs = {languages = "c99"}}))
+end)
+```
+
+## package:has_cxxfuncs
+
+- 检测包是否具有给定的 C++ 函数
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:has_cxxfuncs("foo"))
+  -- you can also add configs
+  assert(package:has_cxxfuncs("bar", {includes = "foo_bar.hpp"}))
+  assert(package:has_cxxfuncs("blob", {includes = "blob.hpp", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_cxxfuncs("bla", {configs = {languages = "cxx17"}}))
+end)
+```
+
+## package:has_ctypes
+
+- 检测包是否具有给定的 C 类型
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:has_ctypes("foo"))
+  -- you can also add configs
+  assert(package:has_ctypes("bar", {includes = "foo_bar.h"}))
+  assert(package:has_ctypes("blob", {includes = "blob.h", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_ctypes("bla", {configs = {languages = "c99"}}))
+end)
+```
+
+## package:has_cxxtypes
+
+- 检测包是否具有给定的 C++ 类型
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:has_cxxtypes("foo"))
+  -- you can also add configs
+  assert(package:has_cxxtypes("bar", {includes = "foo_bar.hpp"}))
+  assert(package:has_cxxtypes("blob", {includes = "blob.hpp", configs = {defines = "USE_BLOB"}}))
+  -- you can even set the language
+  assert(package:has_cxxtypes("bla", {configs = {languages = "cxx17"}}))
+end)
+```
+
+## package:has_cincludes
+
+- 检测包是否具有给定的 C 头文件
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:has_cincludes("foo.h"))
+end)
+```
+
+## package:has_cxxincludes
+
+- 检测包是否具有给定的 C++ 头文件
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:has_cincludes("foo.hpp"))
+end)
+```
+
+## package:check_csnippets
+
+- 检测是否可以编译和链接给定的 C 代码片段
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:check_csnippets({test = [[
+    #define USE_BLOB
+    #include <blob.h>
+    void test(int argc, char** argv) {
+      foo bar;
+      printf("%s", bar.blob);
+    }
+  ]]}, {configs = {languages = "c99"}, includes = "foo.h"}))
+end)
+```
+
+## package:check_cxxsnippets
+
+- 检测是否可以编译和链接给定的 C++ 代码片段
+
+这应该在 `on_test` 中使用,如下所示:
+
+```lua
+on_test(function (package)
+  assert(package:check_cxxsnippets({test = [[
+    #define USE_BLOB
+    #include <blob.hpp>
+    void test(int argc, char** argv) {
+      foo bar();
+      std::cout << bar.blob;
+    }
+  ]]}, {configs = {languages = "cxx11"}, includes = "foo.hpp"}))
+end)
+```
+
+## package:check_fcsnippets
+
+- 检测是否可以编译和链接给定的 Fortran 代码片段
+
+用法如上

+ 1 - 0
docs/zh/config.ts

@@ -124,6 +124,7 @@ function descriptionApiGuide(): DefaultTheme.SidebarItem[] {
 
 function scriptsApiGuide(): DefaultTheme.SidebarItem[] {
   return [
+    { text: '包实例', link: '/package_instance' },
     { text: '原生模块', link: '/native_modules' }
   ]
 }