本文档定义 TsFile C++ 动态库、公共头文件、CMake package、pkg-config module、 命令行工具和平台软件包的统一发布接口。
Apache 社区投票通过的源码发布是正式发布物。Homebrew、Debian/Ubuntu 等平台 软件包和便携归档包均由对应源码发布构建。各产物的名称、版本和来源信息遵循对应 平台的打包规范,并可追溯到该源码发布。
CMake 安装使用 GNUInstallDirs,安装位置由 CMAKE_INSTALL_PREFIX、DESTDIR 以及各平台的标准目录变量共同确定。
| 内容 | 安装路径 |
|---|---|
| 动态库 | ${CMAKE_INSTALL_LIBDIR}/libtsfile.* |
| 公共头文件 | ${CMAKE_INSTALL_INCLUDEDIR}/tsfile/... |
| CMake package | ${CMAKE_INSTALL_LIBDIR}/cmake/TsFile/ |
| pkg-config module | ${CMAKE_INSTALL_LIBDIR}/pkgconfig/libtsfile.pc |
| 命令行工具 | ${CMAKE_INSTALL_BINDIR}/tsfile-cli |
| 项目声明文件 | ${CMAKE_INSTALL_DATADIR}/doc/tsfile/ |
公共头文件位于:
<prefix>/<includedir>/tsfile/...
CMake package 和 pkg-config module 向消费者提供的 include 根目录是:
<prefix>/<includedir>
用户代码使用:
#include <tsfile/reader/tsfile_reader.h> #include <tsfile/writer/tsfile_writer.h>
开发组件包含用户使用 TsFile C++ API 所需的全部头文件。安装完成后,用户无需 访问源码树或构建目录即可编译使用这些头文件的程序。
安装内容包括:
TsFileConfig.cmake;TsFileConfigVersion.cmake;TsFileTargets.cmake;TsFile::tsfile。标准用法为:
find_package(TsFile CONFIG REQUIRED) add_executable(my_application main.cpp) target_link_libraries(my_application PRIVATE TsFile::tsfile)
TsFile::tsfile 提供以下 usage requirements:
<prefix>/<includedir> include 根目录;用户通过 CMAKE_PREFIX_PATH 或 TsFile_DIR 指定 TsFile 的安装位置:
cmake -S . -B build -DCMAKE_PREFIX_PATH=/opt/tsfile
生成的 CMake package 使用相对安装路径,可随安装 prefix 一起移动,不包含源码树 或构建目录的绝对路径。
pkg-config module 名称为 libtsfile:
pkg-config --cflags --libs libtsfile
libtsfile.pc 的核心字段为:
Name: Apache TsFile Version: <source-release-version> Libs: -L${libdir} -ltsfile Cflags: -I${includedir}
其中 includedir 对应 <prefix>/<includedir>,CMake 和 pkg-config 因此产生相同 的头文件使用形式:
#include <tsfile/...>
仅在动态库内部使用的依赖不进入公开的 include 和 link 参数。类型出现在公共头 文件中的依赖通过 Requires 表达。
公共 API 包括:
TsFile::tsfile;libtsfile;动态库使用默认隐藏的符号可见性,只导出公共 API 和 C wrapper 所需符号。私有 实现符号和捆绑依赖符号不进入公开符号表。
TsFile C++ 对外发布动态库,不发布公共静态 libtsfile。
源码发布版本和 ABI epoch 分别设置:
set(TSFILE_VERSION <source-release-version>) set(TSFILE_ABI_VERSION 1) set_target_properties(tsfile PROPERTIES VERSION "${TSFILE_VERSION}" SOVERSION "${TSFILE_ABI_VERSION}")
在 ELF 平台上,源码版本 2.4.0、ABI epoch 1 对应:
libtsfile.so -> libtsfile.so.1 libtsfile.so.1 -> libtsfile.so.2.4.0 libtsfile.so.2.4.0
动态库记录的 SONAME 为:
libtsfile.so.1
在 macOS 上对应:
libtsfile.dylib -> libtsfile.1.dylib libtsfile.1.dylib -> libtsfile.2.4.0.dylib libtsfile.2.4.0.dylib
ABI epoch 仅在发生 ABI 不兼容修改时增加。以下修改改变 ABI epoch:
新增不改变既有二进制布局的 API、修复内部实现以及保持 ABI 的功能扩展沿用原 ABI epoch。开发版本后缀不进入 SONAME。
构建使用显式的依赖来源配置:
TSFILE_DEPENDENCY_PROVIDER=system TSFILE_DEPENDENCY_PROVIDER=bundled
Homebrew 和 Debian/Ubuntu 软件包使用 system 配置:
libtsfile 动态链接平台提供的依赖;All-in-one 便携包使用 bundled 配置:
libtsfile,或放入归档包的私有动态库目录;LICENSE 和 NOTICE;system 和 bundled 配置分别生成独立产物。
软件包使用三个逻辑组件:
| 组件 | 内容 | Debian/Ubuntu 名称 |
|---|---|---|
runtime | 带 ABI 版本的动态库和声明文件 | libtsfile1 |
development | 公共头文件、无版本链接名、CMake package、pkg-config module | libtsfile-dev |
tools | tsfile-cli 和声明文件 | tsfile-tools |
Homebrew Formula 在一个安装单元中提供动态库、开发文件和命令行工具。
All-in-one 便携包的目录结构为:
tsfile-<version>-<platform>/ ├── bin/ │ └── tsfile-cli ├── include/ │ └── tsfile/ ├── lib/ │ ├── libtsfile.* │ ├── cmake/TsFile/ │ └── pkgconfig/libtsfile.pc ├── LICENSE └── NOTICE
当前平台软件包范围包括:
RPM 不在当前软件包范围内。
公开的 Homebrew 和 Debian/Ubuntu 软件包使用各平台的原生打包元数据。
CPack 用于:
TGZ;CPack 配置由 TsFile 顶层项目统一生成,第三方依赖不修改 TsFile 的 CPack package 名称、版本、许可证或维护者信息。
每个受支持的平台配置通过以下检查:
DESTDIR 完成安装。find_package(TsFile CONFIG REQUIRED) 和 TsFile::tsfile 完成编译、链接和运行。libtsfile.pc 完成编译、链接和运行。#include <tsfile/...> 完成小型 TsFile 读写。LICENSE、NOTICE、版本、架构和来源信息与实际内容一致。