我不想在交叉编译项目中的源代码树中包含静态库,而是将boost直接添加到cmake中并构建它.这可用吗?
Fra*_*ser 42
在我的工作场所,我们也在努力解决这个问题.虽然我当然不能声称知道"最好的"方式,但我可以对我的经历提出以下想法.
我们最初只需要开发人员单独安装boost并让CMake以find_package(Boost...)
呼叫的形式进行正常检查.这很简单,但不是自动化的,并且已经安装了较旧版本的boost的开发人员会遇到问题.
然后,我们更改了大头钉,并添加了一个我们从上面提到的项目中克隆的增强源的副本.我不记得具体细节,但我认为这是目前Ryppl项目中正在进行的工作的前奏.重点是它已经支持CMake; boost库是通过add_library
调用添加的实际CMake目标,这使得它们更容易在CMake代码中使用.
虽然这通过在我们的项目中自动使用boost解决了以前的问题,但它最终成为维护的噩梦.我们克隆的boost项目从根本上改变了,现在非常依赖于Ryppl特定的CMake功能.我们不想将Ryppl添加为依赖项,因此我们再次更改了大头钉!
我们查看了您在问题中提到的项目,同样发现它们都不可用.
我们当前的设置使用了CMake的ExternalProject
模块.这允许我们下载并构建对构建树的提升.
好处:
缺点
add_library
调用添加)这是我们的CMake代码的链接.有几种方法可以改善这种需求,但它目前对我们来说效果相当不错.
我希望很快这个答案就会过时,并且可以提供一个体面的,模块化的,CMake兼容的解决方案.
我发现Fraser上面的答案是一个很好的起点,但在我们的系统上使用Boost 1.55.0遇到了一些问题.
首先,我们希望为我们的应用程序提供一个自包含的源代码包,因此首选不使用CMake ExternalProject.我们只使用Boost的thread和date_time库,所以我们使用bcp用构建工具,线程和其他依赖库创建Boost的子集:
$ bcp tools/build thread system date_time ../boost_1_55_0_threads_only
Run Code Online (Sandbox Code Playgroud)
并将其检入我们的svn存储库.
接下来,我能够使Fraser的CMake文件适应在Linux上构建,但是在bootstrap.bat
使用CMake的execute_process命令在Windows上运行该文件时遇到了问题.要运行bootstrap.bat,我们首先需要运行相关的Visual Studio vcvarsall.bat
脚本来设置环境变量(我们可以确定需要设置哪些单独的变量,但运行整个脚本更容易).要使用execult_process在同一个shell中运行两个.bat文件,我们使用cmd /c
并列出了由a分隔的文件&
作为参数.
bootstrap.bat
如果失败,也没有将退出代码设置为非零,因此使用execute_process RESULT_VARIABLE检查是否成功不起作用.相反,我们检查了在运行命令后是否已创建b2.exe可执行文件.
最后一个问题:bootstrap.sh
支持该--prefix=
选项,bootstrap.bat
但没有.我还发现指定on windows上的--prefix
选项b2.exe
有效,但在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()
Run Code Online (Sandbox Code Playgroud)
在上面APT_BOOST_SRC
是我们的源目录中Boost子目录APT_BOOST_BIN
的位置,是我们用来在我们的CMake构建目录中存储库的位置,并且APT_BOOST_COMPONENTS
是我们正在使用的Boost库的列表.
归档时间: |
|
查看次数: |
21645 次 |
最近记录: |