是否有一个维护,最新的基于CMake的Boost构build?
用CMake构buildBoost库会很好。 这里有各种尝试或正在尝试这样做的项目:
- Boost.CMake项目自v1.41.0以来没有更新过。
- Ryppl项目( http://ryppl.org/ ),但网站现在已经死了。 自2013年以来,大部分Ryppl Github存储库都没有更新。自2013年以来, Ryppl Google Group的stream量并不高。
- CMakeModularizationStatus维基页面指出它已经过时并redirect到已经解散的ryppl-dev邮件列表。
- https://github.com/boost-cmake似乎被积极维护(截至2017年初)。 它的文档页面很轻, 目前还不清楚是否需要单独下载或复制Boost库。 它显示了一个“为C ++库build议的”标志,所以我们可以认为它还不是一个官方的Boost库组件。
问题是:是否有一个维护,最新的基于CMake的Boost构build目前的工作?
[来自原来的问题,date为2013年8月]
我没有find“最好”的做法。 但是有两个好方法:
- 只要包括你需要的来源,如果这不是一个大问题,也没有太多的来源。 那么不要忘记像“-DBOOST_XXXXX_SOURCE”这样的定义,告诉boost源,他们不应该链接一个库。 (警告将会出现,因为这个macros在某些时候被重新定义了,那么你可以在MSVC的那些文件上忽略C4005,在CLang的时候很遗憾你不能使这个警告无声)
- 使用CMake的外部项目特性,并使用bjam构build系统的boost(这有一个很长的编译时间很大的不便,这就是为什么你应该去这个,只有当你使用很多boost库)
谢谢你们每一个人的帮助
在我的工作场所,我们也一直在努力。 虽然我当然不能声称知道“最好”的方法,但我可以对我的经验提供以下想法。
我们最初只是要求开发者分别安装boost,让CMake以find_package(Boost...)
调用的forms进行正常检查。 这很容易,但不是自动的,并且已经安装了较旧的boost版本的开发者会造成问题。
然后,我们改变了方针,并添加了我们从上面提到的其中一个项目中克隆出来的boost源的副本。 我不记得具体情况,但我认为这是Ryppl项目目前正在开展工作的先驱。 重点是它已经支持CMake; boost库是通过add_library
调用添加的实际CMake目标,这使得它们更容易在CMake代码中使用。
虽然这通过在项目中自动使用boost来解决了以前的问题,但最终却成了维护的噩梦。 我们克隆的boost项目从根本上改变了,现在非常依赖于Ryppl特定的CMake函数。 我们不想添加Ryppl作为依赖,所以我们再次改变方向!
我们看了你提到的那些项目,同样没有发现可用的项目。
我们目前的设置使用CMake的ExternalProject
模块。 这使我们能够下载和构build我们的构build树。
优点:
- 低维护
- 自动化,所以所有的开发人员使用相同的标志build立相同的版本
- 保持我们自己的源代码免受第三方代码的影响
- boost的多个副本可以高兴地共存(所以不会意外链接到使用不同编译器/ stdlib组合构build的副本)
缺点
- 删除你的构build树意味着必须从头开始下载和构buildboost。 这可以通过下载到一个固定的位置(比如system temp dir)来改善,所以如果findboost源的一个现有的副本,那么下载/解压缩步骤可以被跳过。
- boost库不是正确的CMake目标(即它们没有通过
add_library
调用添加)
这是我们的CMake代码的链接。 有几种方法可以改善这种需求,但目前对我们来说相当合适。
我希望很快这个答案变得过时了,一个体面的,模块化的,CMake兼容的解决scheme变得可用。
我发现上面的Fraser的答案是一个很好的起点,但在我们的系统上使用Boost 1.55.0时遇到了一些问题。
首先,我们希望为我们的应用程序提供一个自包含的源代码包,所以最好不要使用CMake ExternalProject。 我们只使用了Boost的线程和date_time库,所以我们使用bcp创buildBoost的一个子集,包括构build工具,线程和其他相关的库:
$ bcp tools/build thread system date_time ../boost_1_55_0_threads_only
并检查到我们的SVN存储库。
接下来,我能够调整Fraser的CMake文件来构buildLinux,但遇到了运行CMake的execute_process命令的Windows上的bootstrap.bat
文件的问题。 为了运行bootstrap.bat,我们首先需要运行相关的Visual Studio vcvarsall.bat
脚本来设置环境variables(我们可以找出哪些variables需要设置,但是运行整个脚本比较容易)。 要使用execult_process在同一个shell中运行两个.bat文件,我们使用cmd /c
并列出由&
分隔的文件。
另外bootstrap.bat
没有设置退出代码为非零的情况下,所以使用execute_process RESULT_VARIABLE检查成功没有工作。 相反,我们检查了b2.exe可执行文件是在命令运行后创build的。
最后一个问题: bootstrap.sh
支持--prefix=
选项, bootstrap.bat
不支持。 我还发现,在windows上为b2.exe
指定--prefix
选项,但在Linux上使用--prefix
选项作为b2
,而不指定它作为bootstrap.sh
给出错误。 (我还没有明白为什么)。
所以我们的CMake文件的相关部分如下所示:
# # run bootstrap # if(WIN32) if(MSVC10) set(VCVARS_CMD "C:\\Program^ Files^ ^(x86^)\\Microsoft^ Visual^ Studio^ 10.0\\VC\\vcvarsall.bat") elseif(MSVC11) set(VCVARS_CMD "C:\\Program^ Files^ ^(x86^)\\Microsoft^ Visual^ Studio^ 11.0\\VC\\vcvarsall.bat") elseif(MSVC12) set(VCVARS_CMD "C:\\Program^ Files^ ^(x86^)\\Microsoft^ Visual^ Studio^ 12.0\\VC\\vcvarsall.bat") # elseif(...) # add more options here endif(MSVC10) set(BOOTSTRAP_CMD "${VCVARS_CMD} & bootstrap.bat") message("Executing command: ${BOOTSTRAP_CMD}") execute_process(COMMAND cmd /c "${BOOTSTRAP_CMD}" WORKING_DIRECTORY ${APT_BOOST_SRC} RESULT_VARIABLE BS_RESULT OUTPUT_VARIABLE BS_OUTPUT ERROR_VARIABLE BS_ERROR) if(NOT EXISTS ${APT_BOOST_SRC}/b2.exe) message(FATAL_ERROR "Failed running cmd /c ${BOOTSTRAP_CMD} in ${APT_BOOST_SRC}:\n${BS_OUTPUT}\n${BS_ERROR}\n") else(NOT EXISTS ${APT_BOOST_SRC}/b2.exe) message("bootstrap output:\n${BS_OUTPUT}") endif(NOT EXISTS ${APT_BOOST_SRC}/b2.exe) else(WIN32) set(BOOTSTRAP_CMD "./bootstrap.sh") set(BOOTSTRAP_ARGS "--prefix=${APT_BOOST_BIN}") message("Executing command: ${BOOTSTRAP_CMD} ${BOOTSTRAP_ARGS}") execute_process(COMMAND "${BOOTSTRAP_CMD}" ${BOOTSTRAP_ARGS} WORKING_DIRECTORY ${APT_BOOST_SRC} RESULT_VARIABLE BS_RESULT OUTPUT_VARIABLE BS_OUTPUT ERROR_VARIABLE BS_ERROR) if(NOT BS_RESULT EQUAL 0) message(FATAL_ERROR "Failed running ${BOOTSTRAP_CMD} ${BOOTSTRAP_ARGS} in ${APT_BOOST_SRC}:\n${BS_OUTPUT}\n${BS_ERROR}\n") endif() endif(WIN32) # # run b2 # set(B2_ARGS "link=static" "threading=multi" "runtime-link=static" "variant=release") foreach(COMP IN LISTS APT_BOOST_COMPONENTS) set(B2_ARGS "--with-${COMP}" ${B2_ARGS}) endforeach(COMP IN LISTS APT_BOOST_COMPONENTS) if(WIN32) if(MSVC11) set(B2_ARGS "--toolset=msvc-11.0" ${B2_ARGS}) elseif(MSVC12) set(B2_ARGS "--toolset=msvc-12.0" ${B2_ARGS}) endif(MSVC11) file(TO_NATIVE_PATH ${APT_BOOST_BIN} APT_BOOST_BIN_WIN) set(B2_ARGS "--prefix=${APT_BOOST_BIN_WIN}" ${B2_ARGS} "architecture=x86" "address-model=64") endif(WIN32) set(B2_ARGS ${B2_ARGS} install) set(B2_CMD "./b2") message("Executing command: ${B2_CMD} ${B2_ARGS}") execute_process(COMMAND ${B2_CMD} ${B2_ARGS} WORKING_DIRECTORY ${APT_BOOST_SRC} RESULT_VARIABLE B2_RESULT OUTPUT_VARIABLE B2_OUTPUT ERROR_VARIABLE B2_ERROR) if(NOT B2_RESULT EQUAL 0) message(FATAL_ERROR "Failed running ${B2_CMD} in ${APT_BOOST_SRC}:\n${B2_OUTPUT}\n${B2_ERROR}\n") endif()
在上面的APT_BOOST_SRC
是我们的源代码目录中的Boost子目录的位置, APT_BOOST_BIN
是我们用来将这些库存储在我们的CMake构build目录中的位置,而APT_BOOST_COMPONENTS
是我们正在使用的Boost库的列表。