Apache Mesos 的 CMake 构建配置选项全解析 集群管理任务调度后端【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos1/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.0Windows 平台则要求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 标准为 C11CMAKE_CXX_STANDARD固定为 11且关闭编译器扩展必须编译为 64 位目标如果CMAKE_SIZEOF_VOID_P不等于 8 会直接报错Linux 上可通过-DCMAKE_CXX_FLAGS-m64、Windows 上需使用-G Visual Studio 15 2017 Win64生成器、macOS 上通过-DCMAKE_OSX_ARCHITECTURESx86_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 平台默认TRUEWindows 默认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_SYMBOLSCMake 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包格式BUNDLEmacOS bundleDEBDebian/Ubuntu 的.debDRAGNDROPmacOS DragnDropIFWQt Installer FrameworkNSISWindows NSIS 安装器OSXX11macOS X11PACKAGEMAKERmacOS PackageMakerRPMRedHat 系.rpmSTGZ自解压 tar.gzTBZ2 / TGZ / TXZ对应压缩格式的 tarball源码包由package_source目标产出包含构建与测试 Mesos 所需的全部源码[TYPE] 可选值为TBZ2、TXZ、TZ、ZIP。根 CMakeLists.txt 中所有二进制包选项默认均为OFF源码包中只有CPACK_SOURCE_TGZ被显式设为ON其余为OFF。包文件名统一为mesos-version。实际使用示例cmake -DCPACK_BINARY_TGZON .. 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 ()即REBUNDLEDTRUE时所有依赖 URL 指向仓库内3rdparty/目录如 boost-1.81.0.tar.gz、glog-0.4.0.tar.gz为FALSE时改为从3RDPARTY_DEPENDENCIES指定的镜像获取。文档同时提醒并非总是可行。典型反例就是 Windows仓库没有捆绑 curl、apr、zlib 等系统级依赖Windows 没有包管理器因此即使REBUNDLEDTRUEcmake/CompilationConfigure.cmake 也会打印警告说明这些依赖仍将从网络下载。-D3RDPARTY_DEPENDENCIES[path_or_url]指定依赖镜像的位置可以是 URL也可以是本地文件夹例如本地克隆的镜像仓库默认值为https://github.com/mesos/3rdparty/raw/master。它是REBUNDLEDFALSE时的下载源在 Windows 上还承担着获取 curl、apr、zlib、cyrus-sasl、wclayer 等专属依赖的任务见 3rdparty/CMakeLists.txt。源码注释cmake/CompilationConfigure.cmake指出MSVC 1900 构建需要比仓库捆绑版本更新的部分依赖因此该选项对 Windows 尤为关键。使用本地镜像可以避免每次干净构建都从网络拉取若传入本地路径必须是正斜杠的绝对路径如-D3RDPARTY_DEPENDENCIESC:/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 fileWindows 使用规避提权后的临时patch.exeCMAKE_NOOP3rdparty/CMakeLists.txtcmake -E echo空操作用于让ExternalProject_Add跳过 configure/build/install 步骤例如 boost 这类 header-only 依赖CMAKE_FORWARD_ARGS/CMAKE_{C,CXX}_FORWARD_ARGS3rdparty/CMakeLists.txt作为CMAKE_ARGS传给按 CMake 方式构建的外部项目确保生成器、编译器等配置传播到第三方依赖CMAKE_SSL_FORWARD_ARGS则专门转发 OpenSSL 相关选项OPENSSL_ROOT_DIR即经此生效见 3rdparty/CMakeLists.txtLIBRARY_LINKAGE随BUILD_SHARED_LIBS自动切换SHARED/STATICMAKE_INCLUDE_DIR(target)与GET_BYPRODUCTS(target)分别规避 CMake 已知问题imported 库的 include 目录缺失、Ninja 生成器无法识别 imported 库是 glog、libev 等依赖能够跨生成器构建的关键。事件循环与安全相关选项-DENABLE_LIBEVENT(TRUE|FALSE)决定使用 libevent。源码同时给出了一条重要警告cmake/CompilationConfigure.cmakeWindows 上的 libevent 实现是buggy 且不受支持的不提供异步 I/O测试会失败不显式开启时 Windows 默认走原生 IOCP 实现libwinio基于 Windows Thread Pool API。因此 Linux 生产环境通常保持默认的 libev 即可Windows 用户则需自行权衡。-DUNBUNDLED_LIBEVENT(TRUE|FALSE)决定 libprocess 使用系统安装的 libevent 而非捆绑版本仅在ENABLE_LIBEVENTTRUE时才有意义。当前仓库源码中该选项默认值为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_LIBEVENTTRUE时定位系统 libevent缓存变量定义见 cmake/CompilationConfigure.cmake。-DENABLE_SSL(TRUE|FALSE)为 libprocess 构建 SSL 支持默认FALSE。开启后会定义-DUSE_SSL_SOCKET1cmake/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_SEMAPHOREcmake/CompilationConfigure.cmake三者共同控制 libprocess 调度核心的同步原语选型。语言运行时选项-DENABLE_JAVA(TRUE|FALSE)构建 Java 组件JNI 绑定、Java 调度器/执行器库等默认FALSE文档明确警告 this is SLOW。开启后 cmake/CompilationConfigure.cmake 会依次强制要求 Java Development Kitfind_package(Java COMPONENTS Development)、JNIfind_package(JNI)与 Mavenfind_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)是否启用 NVMLNVIDIA 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.cmakePOSIX 下会据此计算出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_TESTSON .. 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_TYPERelease .. 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_LIBSTRUE \ -DENABLE_SSLTRUE \ -DOPENSSL_ROOT_DIR/usr/local/ssl \ -DENABLE_NVMLTRUE \ -DREBUNDLEDTRUE \ -DENABLE_JAVAFALSE \ -DCMAKE_BUILD_TYPERelease \ -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 toolsetcmake -T hostx64否则因 MSVC 链接器缺陷见 MESOS-6720直接报错默认静态库BUILD_SHARED_LIBSFALSE默认开启预编译头cotire见 MESOS-7322需要 GnuWin32 的patch.exe可经PATCHEXE_PATH指定并注意补丁文件的 CRLF 行尾。此外Windows 上 Mesos 的安装布局与 POSIX 不同可执行文件与 DLL 统一放入bin库放入libdata 放入share/mesos见 cmake/CompilationConfigure.cmake。小结选项速查表选项作用默认值以当前仓库源码为准VERBOSE详细构建输出TRUEBUILD_SHARED_LIBS共享/静态库非 WindowsTRUEWindowsFALSEENABLE_GC_UNUSED链接期回收未用段缩小产物FALSEENABLE_PRECOMPILED_HEADERScotire 预编译头仅 WindowsWindowsTRUE其余FALSECPACK_BINARY_[TYPE]二进制包格式开关全FALSECPACK_SOURCE_[TYPE]源码包格式开关TGZ 开TGZON其余FALSEREBUNDLED使用仓库捆绑依赖TRUE3RDPARTY_DEPENDENCIES依赖镜像 URL 或本地目录官方mesos/3rdpartyraw 地址PATCHEXE_PATHWindows GNU Patch 路径%PROGRAMFILESX86%/GnuWin32/bin/patch.exeENABLE_LIBEVENT事件循环改用 libeventFALSEWindows 必须开UNBUNDLED_LIBEVENT使用系统 libeventFALSELIBEVENT_ROOT_DIR指定 libevent 路径未指定ENABLE_SSLlibprocess SSL 支持FALSEOPENSSL_ROOT_DIR指定 OpenSSL 路径未指定ENABLE_LOCK_FREE_RUN_QUEUElibprocess 无锁运行队列FALSEENABLE_JAVA构建 Java 组件慢FALSEENABLE_NEW_CLI构建新 Python CLIFALSEPYTHON_3指定 Python 3 解释器未指定ENABLE_NVML启用 NVMLGPUTRUEMESOS_FINAL_PREFIX校准安装产物迁移后的前缀${CMAKE_INSTALL_PREFIX}MESOS_INSTALL_TESTS安装测试产物FALSE最后再次强调任何版本的实际可用选项都以cmake .. -LAH的配置输出为准——文档与本文只是帮助你理解每个开关的意图与边界。想深入掌握 CMake 依赖图的传递语义PUBLIC/PRIVATE/INTERFACE、新库的添加规范与常见反模式可继续阅读 CMake 构建文档 与 CMake By Example构建参数之外的运行期配置则可参考 配置总览 与 master/agent 配置说明。赞分享集群管理任务调度后端【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos1/mesos点击查看免费下载相关推荐如何在Blockbench中实现PBR材质金属度与粗糙度贴图完全指南如何在Blockbench中实现PBR材质金属度与粗糙度贴图完全指南 你是否在为你的3D模型缺乏真实质感而苦恼想让低多边形模型呈现出金属光泽或粗糙表面效果吗桌面应用3D建模图形学游戏开发palera1n越狱完整指南从检查设备到跑通的5个步骤palera1n越狱完整指南从检查设备到跑通的5个步骤 palera1n 是一款基于 checkm8 bootROM 漏洞的越狱工具面向 A8 到 A11集群管理任务调度后端SuperCollider项目构建与编译CMake配置完全解析SuperCollider项目构建与编译CMake配置完全解析 想要快速掌握SuperCollider音频合成环境的构建与编译技巧吗作为一款功能强大的音频服音频处理编程语言上一篇Hasura GraphQL Engine 的 MSSQL 后端变更操作Mutations实现解析从 RFC 到源码落地下一篇OpenDesign Gradient 设计系统使用指南从 Token 契约到组件落地的完整实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考