您的位置:首页 > 编程语言 > C语言/C++

跨平台CMake的编写

2015-12-22 08:04 603 查看
最近开发跨平台C++编译器,让我深切的体会到了CMake的重要性,一开始,项目只有简短的配置,所有的依赖项都需要手动下载并编译。

但不同人下载和编译的方式许多,版本也不同,编译器也不同,Debug版本也不同,稍有不慎就无法链接到一起。

C++链接库的问题

由于C++库没有通用的ABI,底层链接接口都是各编译器制定的,所以不同编译器编译的库不能混合使用,于是,为了保险起见,我们将全部依赖项都使用编译安装的方式,用同一款编译器编译,选用合适的配置,这样才能保障链接不出问题。

例如我们开发的Elite编译器,就依赖许多第三方库,像lua、oolua、libiconv、LLVM等,这些库都需要配置方可使用,如果不自动配置的化,让每一位开发者手动配置,那么就十分容易出问题。

跨平台CMake的技巧

CMake是一款非常强大的工具,我觉得它最大的亮点就是良好的跨平台性能。

我们这里介绍一下CMake控制安装库的方式,首先介绍安装CMake管理的项目,这个是最简单的。

ExternalProject_Add(liblua
DOWNLOAD_DIR third_party/
GIT_REPOSITORY https://github.com/elite-lang/lua SOURCE_DIR third_party/lua/
CMAKE_COMMAND cmake
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${third_party_install_path}"
# INSTALL_COMMAND ""
BUILD_ALWAYS 0
)


ExternalProject是一个非常棒的Cmake工具,能够从Git上下载指定仓库到某一个路径下,我们只需要配置好仓库地址、下载目标目录,源代码目录,并且指定:

CMAKE_COMMAND cmake


即可,Cmake会自动执行下载、配置、编译、安装这几个步骤

判断目标平台

CMAKE下,已经帮我们预制好了许多变量,通过判断这些变量的值,即可确定目标平台

例如:Unix可以判断是否为unix系列,包括linux、苹果、cygwin等

Win32可以判断是否为windows平台

这些预定义变量可以帮助我们轻松编写不同平台的执行动作,例如oolua是在不同平台下,是用不同的脚本配置编译的:

## oolua的构建
if (APPLE)
set(OOLUA_BUILD_COMMAND make "mac")
elseif (UNIX)
set(OOLUA_BUILD_COMMAND make "linux")
elseif (MSVC)
if(MSVC12)
set(OOLUA_BUILD_COMMAND "vs2013x86_build.bat")
elseif(MSVC14)
set(OOLUA_BUILD_COMMAND "vs2015x86_build.bat")
endif()
endif()

ExternalProject_Add(liboolua
DEPENDS liblua
DOWNLOAD_DIR third_party/
GIT_REPOSITORY https://github.com/elite-lang/oolua SOURCE_DIR third_party/oolua/
CONFIGURE_COMMAND ""
BUILD_COMMAND ${OOLUA_BUILD_COMMAND}
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/third_party/oolua/build_scripts/"
INSTALL_COMMAND ""
INSTALL_DIR ${third_party_install_path}
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 跨平台 cmake git