1. 概述
文件CMakeLists.txt是用于构建软件包的CMake构建系统的输入。任何与CMake兼容的包都包含一个或多个CMakeLists.txt文件,该文件描述如何构建代码以及将代码安装到何处。用于catkin项目的CMakeLists.txt文件是一个带有一些附加约束的标准的普通CMakeLists.txt文件。
2. 总体结构与排序
CMakeLists.txt文件必须遵循这种格式,否则你的包将无法正确构建。配置中的顺序是重要的。
- 所需的CMake版本(Cmake_Minimum_Required)
- 功能包名称(project())
- 找到构建所需的其他CMake/Catkin包(find_Package())
- 启用Python模块支持(catkin_python_set())
- 信息/服务/动作生成器 (add_message_files(), add_service_files(), add_action_files())
- 调用消息/服务/动作生成 (generate_messages())
- 指定包构建信息导出(catkin_package())
- 要构建的库/可执行文件 (add_library()/add_executable()/target_link_libraries())
- 构建测试(catkin_add_gtest())
- 安装规则(install())
3. 详解
3.1 CMake Version
每个catkin CMakeLists.txt文件都必须从所需的CMake版本开始。catkin需要2.8.3或更高版本。
cmake_minimum_required(VERSION 2.8.3)
3.2 Package name
下一项是由CMake项目函数指定的包的名称。假设我们正在做一个叫做机器人大脑的功能包。
project(robot_brain)
注:在CMake中,你可以在以后的CMake脚本中的任何地方引用项目名称,方法是在需要的地方使用变量${PROJECT_NAME}。
3.3 Finding Dependent CMake Packages
然后,我们需要指定哪些其他CMake包需要使用来构建我们的项目。我们使用catkin_make的编译方式,至少需要catkin这个包。
find_package(catkin REQUIRED)
如果一个包是由CMake通过find_Package找到的,将会有一些CMake环境变量的产生,这些变量提供了有关查找包的信息。这些环境变量可以在以后的CMake脚本中使用。这些环境变量描述了包导出的头文件在哪里,源文件在哪里,包依赖于什么库,以及这些库的路径。名称遵循 <PACKAGE NAME>_<PROPERTY>的约定,例如:
- <NAME>_FOUND :如果找到库,则设置为true,否则为false。
- <NAME>_INCLUDE_DIRS or <NAME>_INCLUDES :包导出的头文件路径。
- <NAME>_LIBRARIES or <NAME>_LIBS :由包导出的库文件。
需要的包我们都可用这种方式包含进来,比如我们还需要roscpp,rospy,std_msgs。我们可以写成:
find_package(roscpp REQUIRED)
find_package(rospy REQUIRED)
find_package(std_msgs REQUIRED)
这样的话,每个依赖的package都会产生几个环境变量,这样很不方便。所以还有另外一种方式:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
这意味着roscpp、rospy、std_msgs、message_generation导出的头文件、库文件等路径也附加到catkin_变量上。例如,catkin_include_Dir不仅包含catkin的头文件路径,而且还包含其他功能包的头文件路径!
Boost:(Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。)
如果使用C+和Boost,则需要在Boost上调用find_Package(),并指定将Boost的哪些方面用作组件。例如,如果你想使用Boost线程,可以说:
find_package(Boost REQUIRED COMPONENTS thread)
3.4 catkin_package()
这是一个catkin提供的cmake宏,当我们要给构建系统指定catkin的特定的信息时就需要了,或者反过来利用他产生pkg-config和CMake文件。这个函数必须在声明add_library()或者 add_executable()生成target之前使用。该函数有5个可选参数:
- INCLUDE_DIRS:由功能包导出的头文件路径。
- LIBRARIES:从项目导出的库。
- CATKIN_DEPENDS:此项目所依赖的其他catkin项目。
- DEPENDS:该项目所依赖的非catkin CMake项目。
- CFG_EXTRAS:附加配置选项。
例如:
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS roscpp nodelet
DEPENDS eigen opencv)
这表示:功能包文件中的include文件夹是头文件的导出位置;引用CMake环境变量$ {PROJECT_NAME},即"robot_brain";
“roscpp”+“nodelet”是构建/运行此功能包所需的包;“eigen”+“OpenCV”是构建/运行此包所需的系统依赖项。
http://wiki.ros.org/catkin/CMakeLists.txt#Package_name
http://wiki.ros.org/catkin/package.xml
https://blog.youkuaiyun.com/xuehuafeiwu123/article/details/53929834
https://blog.youkuaiyun.com/u013243710/article/details/35795841