- 集群管理
- 任务调度
- 后端
【免费下载链接】mesos
Apache Mesos
Apache Mesos 官方同时维护 Autotools 与 CMake 两套构建系统,其中 CMake 构建具有更清晰的依赖图、更强的跨平台能力(尤其在 Windows 上)以及更灵活的打包与安装控制。本文以仓库内的 CMake 选项参考文档 为骨架,逐项拆解每一个-D构建选项的默认值、平台差异与真实作用,并结合cmake/CompilationConfigure.cmake、根 CMakeLists.txt、3rdparty/CMakeLists.txt 等源码印证其底层实现。读完本文,你将能够读懂 Mesos 的 CMake 配置输出、为 Linux/Windows 定制构建参数、正确配置第三方依赖获取方式,并掌握"构建 → 打包 → 跨机器部署"的完整实操流程。
先决条件与快速开始
Mesos 对 CMake 版本有明确要求:根 CMakeLists.txt 中声明,非 Windows 平台最低需要CMake 3.7.0,Windows 平台则要求CMake 3.8.0以上。
最简构建流程只需四步:
mkdir build cd build cmake .. cmake --build .cmake --build .还可以指定目标(target),例如:
# 构建全部测试(mesos-tests、libprocess-tests、stout-tests) cmake --build . --target tests # 把参数透传给底层构建系统(这里是 make) cmake --build . -- -j4cmake --build也可以替换为底层构建工具本身。例如 Linux 上默认生成器是 GNU Make,配置后可直接运行make tests;如果改用 Ninja 生成器(cmake -G Ninja),则可运行ninja tests。此外,根 CMakeLists.txt 还定义了check目标(等价于ctest -V -C $<CONFIG>)、dist与distcheck目标(分别调用 cmake/dist.sh 与 cmake/distcheck.sh,仅限非 Windows 平台)。
配置时还需要满足两条硬性约束,它们在 cmake/CompilationConfigure.cmake 中被强制检查:
- C++ 标准为 C++11:
CMAKE_CXX_STANDARD固定为 11,且关闭编译器扩展; - 必须编译为 64 位目标:如果
CMAKE_SIZEOF_VOID_P不等于 8 会直接报错,Linux 上可通过-DCMAKE_CXX_FLAGS=-m64、Windows 上需使用-G "Visual Studio 15 2017 Win64"生成器、macOS 上通过-DCMAKE_OSX_ARCHITECTURES=x86_64满足要求。
文档中特别强调:"The most up-to-date options can be found withcmake .. -LAH"。-LAH会在配置时列出全部缓存变量(含高级变量),是查阅当前版本可用选项的最权威方式。这与 CMake 构建文档 及 CMake By Example 互为补充,前者讲解构建流程与依赖图,后者给出新增库、第三方依赖与 Debug/Release 配置的具体示例。
全局编译行为选项
-DVERBOSE=(TRUE|FALSE)
控制构建过程是否输出详细日志,默认值为TRUE。在 cmake/CompilationConfigure.cmake 中,该选项被直接映射为CMAKE_VERBOSE_MAKEFILE,从而让 Makefile 类的生成器产生冗长的编译输出,便于排查编译命令与链接命令的具体参数。排查问题时临时关掉它可以显著减少终端噪音。
-DBUILD_SHARED_LIBS=(TRUE|FALSE)
决定尽可能构建共享库还是静态库,默认值具有平台差异:非 Windows 平台默认TRUE,Windows 默认FALSE(见 cmake/CompilationConfigure.cmake)。该选项不仅影响 Mesos 自身目标,还会通过LIBRARY_LINKAGE变量向下游传播——3rdparty/CMakeLists.txt 在BUILD_SHARED_LIBS为真时把LIBRARY_LINKAGE置为SHARED、否则置为STATIC,第三方依赖(如 glog、re2、libevent)在声明add_library(... IMPORTED GLOBAL)时就会按此选择共享/静态形态。Windows 上构建共享库目前仍标注为 "work-in-progress"(源码中会打印 WARNING 并开启CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS),CMake By Example 也明确说明 Windows 共享库构建尚未正式支持。
-DENABLE_GC_UNUSED=(TRUE|FALSE)
启用对未使用程序段(unused program segments)的垃圾回收,默认FALSE。开启后 cmake/CompilationConfigure.cmake 会先探测编译器支持,然后追加-ffunction-sections -fdata-sections编译选项和-Wl,--gc-sections链接选项,让链接器丢弃未被引用的函数与数据段,从而显著缩小最终构建产物体积。该能力依赖编译器的 section 与链接器 gc 支持,探测失败会直接FATAL_ERROR。
-DENABLE_PRECOMPILED_HEADERS=(TRUE|FALSE)
使用 cotire 自动生成预编译头,默认值同样按平台区分:Windows 默认TRUE,其余平台默认FALSE(源码中默认值直接取${WIN32})。需要特别注意的是,cmake/CompilationConfigure.cmake 规定:非 Windows 平台一旦开启该选项会直接报错(见 MESOS-7322),即预编译头目前仅支持 Windows。开启后代码还会把 cotire 的 unity build 关掉(COTIRE_ADD_UNITY_BUILD FALSE),仅保留预编译头功能;cotire 模块通过根 CMakeLists.txt 的include(cotire)引入。
打包选项:CPACK_BINARY_[TYPE]与CPACK_SOURCE_[TYPE]
Mesos 借助 CMake 自带的 CPack 模块生成安装包。二进制包由package目标产出,内容等同于install目标安装的所有文件;[TYPE] 可选值为:
| TYPE | 包格式 |
|---|---|
| BUNDLE | macOS bundle |
| DEB | Debian/Ubuntu 的.deb |
| DRAGNDROP | macOS Drag'n'Drop |
| IFW | Qt Installer Framework |
| NSIS | Windows NSIS 安装器 |
| OSXX11 | macOS X11 |
| PACKAGEMAKER | macOS PackageMaker |
| RPM | RedHat 系.rpm |
| STGZ | 自解压 tar.gz |
| TBZ2 / TGZ / TXZ | 对应压缩格式的 tarball |
源码包由package_source目标产出,包含构建与测试 Mesos 所需的全部源码;[TYPE] 可选值为TBZ2、TXZ、TZ、ZIP。
根 CMakeLists.txt 中,所有二进制包选项默认均为OFF,源码包中只有CPACK_SOURCE_TGZ被显式设为ON(其余为OFF)。包文件名统一为mesos-<version>。实际使用示例:
cmake -DCPACK_BINARY_TGZ=ON .. cmake --build . --target package cmake --build . --target package_source第三方依赖获取选项
-DREBUNDLED=(TRUE|FALSE)
决定是否优先使用随 Mesos 仓库一起以 tarball 形式捆绑的第三方依赖,默认TRUE。其底层机制在 3rdparty/CMakeLists.txt 中一目了然:
if (REBUNDLED) set(FETCH_URL ${CMAKE_CURRENT_SOURCE_DIR}) else () set(FETCH_URL ${3RDPARTY_DEPENDENCIES}) endif ()即REBUNDLED=TRUE时所有依赖 URL 指向仓库内3rdparty/目录(如 boost-1.81.0.tar.gz、glog-0.4.0.tar.gz);为FALSE时改为从3RDPARTY_DEPENDENCIES指定的镜像获取。
文档同时提醒:"并非总是可行"。典型反例就是 Windows:仓库没有捆绑 curl、apr、zlib 等系统级依赖(Windows 没有包管理器),因此即使REBUNDLED=TRUE,cmake/CompilationConfigure.cmake 也会打印警告,说明这些依赖仍将从网络下载。
-D3RDPARTY_DEPENDENCIES=[path_or_url]
指定依赖镜像的位置,可以是 URL,也可以是本地文件夹(例如本地克隆的镜像仓库),默认值为https://github.com/mesos/3rdparty/raw/master。它是REBUNDLED=FALSE时的下载源,在 Windows 上还承担着获取 curl、apr、zlib、cyrus-sasl、wclayer 等专属依赖的任务(见 3rdparty/CMakeLists.txt)。源码注释(cmake/CompilationConfigure.cmake)指出:MSVC 1900 构建需要比仓库捆绑版本更新的部分依赖,因此该选项对 Windows 尤为关键。使用本地镜像可以避免每次干净构建都从网络拉取;若传入本地路径必须是正斜杠的绝对路径(如-D3RDPARTY_DEPENDENCIES=C:/3rdparty),否则在 Windows 上会失败。
-DPATCHEXE_PATH=[path]
指定 Windows 下 GNU Patch 可执行文件的位置,默认值为%PROGRAMFILESX86%/GnuWin32/bin/patch.exe。它在 3rdparty/cmake/PatchCommand.cmake 中发挥了完整的"免提"逻辑:检查缓存变量 → 在默认位置搜索 → 找不到则FATAL_ERROR并提示手动指定 → 找到后把patch.exe与其 manifest 复制到用户临时目录 → 用mt.exe应用 manifest 以规避 UAC 提权弹窗→ 之后所有补丁都用这份临时的patch.exe完成。文档还特别提醒:Windows 上的补丁文件必须使用CRLF 行尾(LF 会导致 "Assertion failed, hunk, file patch.c, line 343" 错误),因此要求以git config core.autocrlf true检出仓库。
依赖管理的底层支撑机制
除了面向用户的选项,Mesos 的3rdparty层还有一组内部 CMake 函数/变量,理解它们有助于判断选项的真实影响:
EXTERNAL(lib version dir)(定义于 3rdparty/cmake/External.cmake):为依赖生成三个约定变量——<LIB>_TARGET(目标名,如boost-1.53.0)、<LIB>_CMAKE_ROOT(源码解压目录)、<LIB>_ROOT(各阶段构建目录);PATCH_CMD(CMD_VAR patch_file)(定义于 3rdparty/cmake/PatchCommand.cmake):根据平台生成打补丁命令,非 Windows 使用patch -p1 < file,Windows 使用规避提权后的临时patch.exe;CMAKE_NOOP(3rdparty/CMakeLists.txt):cmake -E echo空操作,用于让ExternalProject_Add跳过 configure/build/install 步骤(例如 boost 这类 header-only 依赖);CMAKE_FORWARD_ARGS/CMAKE_{C,CXX}_FORWARD_ARGS(3rdparty/CMakeLists.txt):作为CMAKE_ARGS传给按 CMake 方式构建的外部项目,确保生成器、编译器等配置传播到第三方依赖;CMAKE_SSL_FORWARD_ARGS则专门转发 OpenSSL 相关选项(OPENSSL_ROOT_DIR即经此生效,见 3rdparty/CMakeLists.txt);LIBRARY_LINKAGE:随BUILD_SHARED_LIBS自动切换SHARED/STATIC;MAKE_INCLUDE_DIR(target)与GET_BYPRODUCTS(target):分别规避 CMake 已知问题(imported 库的 include 目录缺失、Ninja 生成器无法识别 imported 库),是 glog、libev 等依赖能够跨生成器构建的关键。
事件循环与安全相关选项
-DENABLE_LIBEVENT=(TRUE|FALSE)
决定使用 libevent)。源码同时给出了一条重要警告(cmake/CompilationConfigure.cmake):Windows 上的 libevent 实现是buggy 且不受支持的,不提供异步 I/O,测试会失败;不显式开启时 Windows 默认走原生 IOCP 实现libwinio(基于 Windows Thread Pool API)。因此 Linux 生产环境通常保持默认的 libev 即可,Windows 用户则需自行权衡。
-DUNBUNDLED_LIBEVENT=(TRUE|FALSE)
决定 libprocess 使用系统安装的 libevent 而非捆绑版本,仅在ENABLE_LIBEVENT=TRUE时才有意义。当前仓库源码中该选项默认值为FALSE(见 cmake/CompilationConfigure.cmake;历史文档表格曾注明 macOS 上默认TRUE,以当前源码为准需留意这一差异)。为TRUE时,构建走find_package(LIBEVENT REQUIRED)分支,把系统 libevent 作为 imported 目标链接(3rdparty/CMakeLists.txt);为FALSE时则通过ExternalProject_Add从 LIBEVENT_RELEASES 下载源码构建——注意 libevent 并不随仓库捆绑,因此无论REBUNDLED为何值,启用ENABLE_LIBEVENT都会触发一次下载。
-DLIBEVENT_ROOT_DIR=[path]
指定 libevent 的安装路径(例如"C:\libevent-Win64"),默认未指定。它通过find_package(LIBEVENT REQUIRED)分支供UNBUNDLED_LIBEVENT=TRUE时定位系统 libevent,缓存变量定义见 cmake/CompilationConfigure.cmake。
-DENABLE_SSL=(TRUE|FALSE)
为 libprocess 构建 SSL 支持,默认FALSE。开启后会定义-DUSE_SSL_SOCKET=1(cmake/CompilationConfigure.cmake),并在 Windows 上额外设置OPENSSL_MSVC_STATIC_RT TRUE以使用多线程 CRT 的 OpenSSL。SSL 的详细配置可参考 SSL 文档。
-DOPENSSL_ROOT_DIR=[path]
指定 OpenSSL 的根目录(例如"C:\OpenSSL-Win64"),默认未指定。它在启用 SSL 时被收集进CMAKE_SSL_FORWARD_ARGS并转发给那些使用 CMake 查找 OpenSSL 的第三方依赖(3rdparty/CMakeLists.txt),保证 libevent_openssl 等组件能找到正确的 OpenSSL 头文件与库。
-DENABLE_LOCK_FREE_RUN_QUEUE=(TRUE|FALSE)
为 libprocess 构建无锁运行队列(lock free run queue),默认FALSE。属于 libprocess 内部的并发优化开关,源码定义见 cmake/CompilationConfigure.cmake。同族的底层选项还包括ENABLE_LOCK_FREE_EVENT_QUEUE与ENABLE_LAST_IN_FIRST_OUT_FIXED_SIZE_SEMAPHORE(cmake/CompilationConfigure.cmake),三者共同控制 libprocess 调度核心的同步原语选型。
语言运行时选项
-DENABLE_JAVA=(TRUE|FALSE)
构建 Java 组件(JNI 绑定、Java 调度器/执行器库等),默认FALSE,文档明确警告 "this is SLOW"。开启后 cmake/CompilationConfigure.cmake 会依次强制要求 Java Development Kit(find_package(Java COMPONENTS Development))、JNI(find_package(JNI))与 Maven(find_program(MVN mvn)),三者任一缺失即FATAL_ERROR;全部就绪后才把HAS_JAVA置为TRUE。测试代码也会据此定义MESOS_HAS_JAVA编译宏(见 src/tests/CMakeLists.txt)。
-DENABLE_NEW_CLI=(TRUE|FALSE)
启用基于 PyInstaller 打包的新版 Python CLI,默认FALSE。该选项对 Python 环境有硬性要求(见 cmake/CompilationConfigure.cmake):
- 若未单独指定
PYTHON_3,会先回退到PYTHON选项,再回退到 CMake 探测到的解释器; - 必须存在Python 3.6 或更新版本,否则报错;
- 必须安装tox(用于运行
src/python/lib/的单元测试),否则报错。
开启后,根 CMakeLists.txt 会把cli-tests加入tests目标依赖。
-DPYTHON_3=[path]
显式指定 Python 3 解释器路径(例如"python36"),默认未指定。它与ENABLE_NEW_CLI协同工作:既用于 PyInstaller 打包,也用于探测版本(import sys; print('%d.%d' % ...))以执行 3.6+ 校验。
安装与部署相关选项
-DENABLE_NVML=(TRUE|FALSE)
是否启用 NVML(NVIDIA Management Library)头文件以支持 GPU 资源探测,默认TRUE。开启时 3rdparty/CMakeLists.txt 会通过ExternalProject_Add解压仓库捆绑的 nvml-352.79.tar.gz,并以 INTERFACE 库nvml暴露其头文件目录;关闭则跳过该依赖。GPU 支持的详细说明可参考 GPU 支持文档。
-DMESOS_FINAL_PREFIX=[path]
调整内置路径(共享对象的 rpath、Mesos 各 flag 的默认路径等),使cmake install的产物在被拷贝到该前缀后依然可用,默认值为${CMAKE_INSTALL_PREFIX}。它典型服务于"打包管理系统在构建机与目标机使用不同前缀"的场景:构建机用CMAKE_INSTALL_PREFIX决定安装到何处,MESOS_FINAL_PREFIX则告诉 Mesos"最终会被放到哪里"。其定义与安装布局的联动见 cmake/CompilationConfigure.cmake 与 cmake/CompilationConfigure.cmake:POSIX 下会据此计算出DATA_INSTALL_PREFIX、PKG_LIBEXEC_INSTALL_DIR、LIB_INSTALL_DIR等安装布局变量,并把这些值以-DPKGLIBEXECDIR=...等全局宏注入源码(cmake/CompilationConfigure.cmake),同时把 rpath 指向最终的共享库位置。注意:该路径不必在构建机上真实存在;但如果取值与CMAKE_INSTALL_PREFIX不同,安装产物只有拷到MESOS_FINAL_PREFIX之后才能正常工作。
-DMESOS_INSTALL_TESTS=(TRUE|FALSE)
将测试可执行文件及其依赖加入 install 输出,默认FALSE(源码定义见 cmake/CompilationConfigure.cmake)。开启后,src/tests/CMakeLists.txt 会:
- 把
mesos-tests与test-helper从EXCLUDE_FROM_ALL改为常规目标并注册install(TARGETS ... RUNTIME DESTINATION ${MESOS_INSTALL_RUNTIME})(src/tests/CMakeLists.txt); - 通过
MESOS_INSTALL_TESTS编译宏让测试代码感知"运行于安装后的环境",从而用安装目录下的二进制与模块执行用例。
它配合MESOS_FINAL_PREFIX使用,即可在目标机器上直接mesos-tests对安装产物做冒烟验证,参见下文的实战示例。
实战:从构建到跨机器部署的完整流程
1. 普通可安装构建
mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/home/current_user/mesos .. cmake --build . --target install2. 可迁移安装 + 安装后自测(推荐组合)
在构建机上:
mkdir build && cd build cmake \ -DMESOS_FINAL_PREFIX=/opt/mesos \ -DCMAKE_INSTALL_PREFIX=/home/current_user/mesos \ -DMESOS_INSTALL_TESTS=ON .. cmake --build . --target install tar -czf mesos.tar.gz mesos -C /home/current_user在目标机上:
sudo tar -xf mesos.tar.gz -C /opt # 用安装产物运行测试 sudo /opt/mesos/bin/mesos-tests # 启动 Mesos agent sudo /opt/mesos/bin/mesos-agent --work-dir=/var/lib/mesos ...由于构建时指定了MESOS_FINAL_PREFIX=/opt/mesos,所有 rpath、默认路径和 flag 都已按/opt/mesos校准,拷过去即可直接运行。
3. 选择 Debug / Release 配置
默认配置总是Debug(带调试符号、几乎无优化),生产部署请显式指定:
# 单配置生成器(GNU Make):配置时决定 cmake -DCMAKE_BUILD_TYPE=Release .. cmake --build . # 多配置生成器(Visual Studio、Xcode):构建时决定 cmake --build . --config Release需要注意两点:CMAKE_BUILD_TYPE在 Visual Studio/Xcode 这类多配置生成器下会被忽略(配置在构建时切换,Debug/Release 产物会写入同名目标目录而互相覆盖,见 MESOS-7943);同时 CMake By Example 提醒,不要在自己的 CMake 逻辑里直接判断CMAKE_BUILD_TYPE,应使用生成器表达式(如$<$<CONFIG:Debug>:DEBUG_MODE>)。
4. 一个较完整的定制示例
cmake \ -DBUILD_SHARED_LIBS=TRUE \ -DENABLE_SSL=TRUE \ -DOPENSSL_ROOT_DIR=/usr/local/ssl \ -DENABLE_NVML=TRUE \ -DREBUNDLED=TRUE \ -DENABLE_JAVA=FALSE \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local/mesos \ ..Windows 平台的额外注意事项
Mesos 的 CMake 构建对 Windows 有一组强制约束,配置失败时会直接报错(cmake/CompilationConfigure.cmake):
- 必须使用Visual Studio 2017 的 Win64 生成器(
-G "Visual Studio 15 2017 Win64"),否则警告; - 必须使用MSVC编译器(不支持 mingw/Clang on Windows),且MSVC 版本不低于 1900(即 VS 2015 以上);
- 必须使用x64 toolset:
cmake -T host=x64,否则因 MSVC 链接器缺陷(见 MESOS-6720)直接报错; - 默认静态库(
BUILD_SHARED_LIBS=FALSE); - 默认开启预编译头(cotire,见 MESOS-7322);
- 需要 GnuWin32 的
patch.exe(可经PATCHEXE_PATH指定),并注意补丁文件的 CRLF 行尾。
此外,Windows 上 Mesos 的安装布局与 POSIX 不同:可执行文件与 DLL 统一放入bin,库放入lib,data 放入share/mesos(见 cmake/CompilationConfigure.cmake)。
小结:选项速查表
| 选项 | 作用 | 默认值(以当前仓库源码为准) |
|---|---|---|
VERBOSE | 详细构建输出 | TRUE |
BUILD_SHARED_LIBS | 共享/静态库 | 非 WindowsTRUE,WindowsFALSE |
ENABLE_GC_UNUSED | 链接期回收未用段,缩小产物 | FALSE |
ENABLE_PRECOMPILED_HEADERS | cotire 预编译头(仅 Windows) | WindowsTRUE,其余FALSE |
CPACK_BINARY_[TYPE] | 二进制包格式开关 | 全FALSE |
CPACK_SOURCE_[TYPE] | 源码包格式开关(TGZ 开) | TGZ=ON,其余FALSE |
REBUNDLED | 使用仓库捆绑依赖 | TRUE |
3RDPARTY_DEPENDENCIES | 依赖镜像 URL 或本地目录 | 官方mesos/3rdpartyraw 地址 |
PATCHEXE_PATH | Windows GNU Patch 路径 | %PROGRAMFILESX86%/GnuWin32/bin/patch.exe |
ENABLE_LIBEVENT | 事件循环改用 libevent | FALSE(Windows 必须开) |
UNBUNDLED_LIBEVENT | 使用系统 libevent | FALSE |
LIBEVENT_ROOT_DIR | 指定 libevent 路径 | 未指定 |
ENABLE_SSL | libprocess SSL 支持 | FALSE |
OPENSSL_ROOT_DIR | 指定 OpenSSL 路径 | 未指定 |
ENABLE_LOCK_FREE_RUN_QUEUE | libprocess 无锁运行队列 | FALSE |
ENABLE_JAVA | 构建 Java 组件(慢) | FALSE |
ENABLE_NEW_CLI | 构建新 Python CLI | FALSE |
PYTHON_3 | 指定 Python 3 解释器 | 未指定 |
ENABLE_NVML | 启用 NVML(GPU) | TRUE |
MESOS_FINAL_PREFIX | 校准安装产物迁移后的前缀 | ${CMAKE_INSTALL_PREFIX} |
MESOS_INSTALL_TESTS | 安装测试产物 | FALSE |
最后再次强调:任何版本的实际可用选项都以cmake .. -LAH的配置输出为准——文档与本文只是帮助你理解每个开关的意图与边界。想深入掌握 CMake 依赖图的传递语义(PUBLIC/PRIVATE/INTERFACE)、新库的添加规范与常见反模式,可继续阅读 CMake 构建文档 与 CMake By Example;构建参数之外的运行期配置,则可参考 配置总览 与 master/agent 配置说明。
- 集群管理
- 任务调度
- 后端
【免费下载链接】mesos
Apache Mesos
相关推荐
如何在Blockbench中实现PBR材质:金属度与粗糙度贴图完全指南
如何在Blockbench中实现PBR材质:金属度与粗糙度贴图完全指南 你是否在为你的3D模型缺乏真实质感而苦恼?想让低多边形模型呈现出金属光泽或粗糙表面效果吗
桌面应用3D建模图形学游戏开发palera1n越狱完整指南:从检查设备到跑通的5个步骤
palera1n越狱完整指南:从检查设备到跑通的5个步骤 palera1n 是一款基于 checkm8 bootROM 漏洞的越狱工具,面向 A8 到 A11
集群管理任务调度后端SuperCollider项目构建与编译:CMake配置完全解析
SuperCollider项目构建与编译:CMake配置完全解析 想要快速掌握SuperCollider音频合成环境的构建与编译技巧吗?作为一款功能强大的音频服
音频处理编程语言
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考