cmake 工具
cmake 使用非常简单,最常用的用法是 cmake . 在当前目录执行cmake
-D <var>:<type>=<value>
-D 选项就是用来传递相关配置的,我们在编译源码时,经常需要使用相关配置。
这篇文档不是教大学如何写CMAKE的脚本,而是如何使用cmake编译源码
下面以 libiio-0.19 编译为例:
解压源码,并在源码目录创建一个build子目录,然后在build目录执行 cmake ..
tar xvf libiio-0.19.tar.gz
cd libiio-0.19
mkdir build
cd build
cmake ..
有时候,这样执行后,由于依赖的原因,可能会提示错误,这时可以通过-D选项来配置。
cmake -DWITH_TESTS=OFF -DWITH_NETWORK_BACKEND=OFF -DCMAKE_C_COMPILER=arm-linux-gcc ..
当然,CMAKE有一些预置的宏,如例子中使用的CMAKE_C_COMPILER是用来指定编译工具的,通过这个宏可以用来实现交叉编译。
与项目有关的宏,如果项目源码目录没有帮助文档,可以通过查看CMakeLists.txt文件来获取。
交叉编译
作为嵌入式开发的工程师来说,交叉编译是件麻烦的事,特别是碰到cmake工程源码
官方文档有详细介绍
Cross Compiling
If cmake(1) is invoked with the command line parameter -DCMAKE_TOOLCHAIN_FILE=path/to/file, the file will be loaded early to set values for the compilers. A typical cross-compiling toolchain has content such as:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
set(CMAKE_STAGING_PREFIX /home/devel/stage)
set(CMAKE_C_COMPILER /home/devel/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /home/devel/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
The CMAKE_SYSTEM_NAME is the CMake-identifier of the target platform to build for.
The CMAKE_SYSROOT is optional, and may be specified if a sysroot is available.
The CMAKE_STAGING_PREFIX is also optional. It may be used to specify a path on the host to install to. The CMAKE_INSTALL_PREFIX is always the runtime installation location, even when cross-compiling.
The CMAKE_<LANG>_COMPILER variables may be set to full paths, or to names of compilers to search for in standard locations. In cases where CMake does not have enough information to extract information from the compiler, the CMakeForceCompiler module can be used to bypass some of the checks.
了解清楚后,其实也不难,不修改源码的情况下,可以使用-D选项来传递相关设置, 请看示例:
libiio_config:
rm -rf $(LIBIIO_DIR)/build
mkdir -p $(LIBIIO_DIR)/build
cd $(LIBIIO_DIR)/build && cmake \
-DWITH_TESTS=OFF \
-DWITH_NETWORK_BACKEND=OFF \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSROOT=$(TOOLCHAIN_SYSROOT) \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
-DCMAKE_C_COMPILER=$(CROSS_COMPILE)gcc \
..
在交叉编译下,CMAKE_SYSROOT 一般设置为工具链的sysroot目录,CMAKE_STAGING_PREFIX可以设置为我们自定义的根文件系统目录,里面已安装之前编译的一些库及头文件,这样cmake可以从这两个目录中找到相关依赖。
另外:为了防止intall目标安装到host目录,通过DESTDIR来设定安装目录。