## 操作系統中安裝的cmake的最低版本
cmake_minimum_required(VERSION 2.8.3)
## project項是功能包的名稱,需要與package.xml中輸入的一致
project(myrobot_gazebo)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## 查找構建所需的其他CMake / Catkin 程序包
## fing_package項是進行構建所需的catkin程序包,我們正在使用catkin構建系統,因此肯定要輸入catkin
## 另外呢,這裏還需要填上用戶先創建依賴包的選項
## 若一個包被find_package了,那麼就會導致一些CMake變量的產生
## 這些變量後面將在CMake的腳本中用到,這些變量描述了所依賴的包輸出的頭文件、源文件、庫文件在哪裏
## 這些變量的名字依照的慣例是<PACKAGENAME>_<PROPERTY>,比如
## <NAME>_FOUND:這個變量說明這個庫是否被找到,如果找到就被設置爲true,否則設爲false;
## <NAME>_INCLUDE_DIRS or<NAME>_INCLUDES:這個包輸出的頭文件目錄;
## <NAME>_LIBRARIES or <NAME>_LIBS:這個包輸出的庫文件。
find_package(catkin REQUIRED
gazebo_msgs
gazebo_plugins
gazebo_ros
gazebo_ros_control
)
## 按照上面的find_package格式將多個包填寫後,它會把所有pacakge裏面的頭文件和庫文件等等目錄加到一組變量上,比如:catkin_INCLUDE_DIRS
## 這樣,我們就可以用這個變量查找需要的文件了。最終就只產生一組變量了。
## 另外,find_package額外包含了哪些依賴包,相應的package.xml文件build_depend與run_depend就必須包含
## 這裏是使用ROS以外功能包時使用的方法CMake程序包
## 例如使用Boost時必須安裝system功能包
# find_package(Boost REQUIRED COMPONENTS system)
## 是在使用python,也就是使用rospy時的配置選項
## 其功能是調用python安裝過程setup.py
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## 消息(.msg),服務(.srv)和動作(.action)文件在ROS包構建和使用之前需要一個特殊的預處理器構建步驟
## 這些宏的要點是生成編程語言特定的文件,以便可以利用其選擇的編程語言中的消息,服務和動作。
## 這些宏後面必須跟着一個調用generate_messages()。且這些宏必須在catkin_package()宏前面
## add_message_files是添加消息文件選項
## FILES將引用當前功能包目錄的msg文件夾中的**.msg文件,並自動生成一個頭文件
## 這個註釋掉的例子是說,我們將使用消息文件Message1.msg和Message2.msg
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
## add_service_files是添加要使用的服務文件選項
## FILES會引用功能包目錄中的srv文件夾中的**.srv文件
## 這個註釋掉的例子是說,我們將使用服務文件Service1.srv和Service2.srv
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## add_action_files是添加要使用的服務文件選項
## FILES會引用功能包目錄中的action文件夾中的**.action文件
## 這個註釋掉的例子是說,我們將使用服務文件Action1.action和Action2.action
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
# generate_messages(
# DEPENDENCIES
# std_msgs # Or other packages containing msgs
# )
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## 使用dynamic_reconfigure時加載要引用的配置文件的設置(不太懂)
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )
###################################
## catkin specific configuration ##
###################################
## 下面就是catkin構建選項
## 這是爲構建系統指定catkin特定信息所必需的,以便進一步應用於生成pkg-config和CMake文件。在使用add_library()或add_executable()聲明任何目標之前,必須調用此函數。該函數有5個可選參數:
## INCLUDE_DIRS表示將使用INCLUDE_DIRS後面的內部目錄include的頭文件,也就是這個catkin包的頭文件是導出到include這個文件夾,include位置是位於該功能包目錄下(需要手動創建)就是當前編寫的CMakeList.txt所在位置,與msg、srv、package.xml、CMakeList.txt共存的位置。與工作空間下(有src、build、devel的位置)devel文件下的include不同,那個有包含由msg文件生成的消息、服務的頭文件
## LIBRARIES表示將使用隨後而來的功能包的庫,就是做成一個庫給別的功能包用
## CATKIN_DEPENDS後面指定例如roscpp或者std_msgs等依賴包,簡單來說要填的內容就是該功能包運行時所需要的、所依賴的catkin包。它與package.xml中標籤xxxx對應。運行和編譯時的依賴不一樣,所以說findpackage()與catkin_package(CATKIN_DEPEND xxx)所跟的依賴是略有不同的
## DEPENDS是一個描述系統依賴包的設置,這個包運行時所依賴的包如果不屬於catkin包的話就要寫在這裏
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES myrobot_gazebo
# CATKIN_DEPENDS other_catkin_pkg
# DEPENDS system_lib
)
###########
## Build ## 建立庫/可執行文件
###########
## include_directories是指定頭文件的搜索路徑
## 下面設定爲${catkin_INCLUDE_DIRS}表示將引用每個功能包中的include目錄中的頭文件
## 當用戶想指定一個額外的include目錄時,寫在${catkin_INCLUDE_DIRS}的下一行就行
include_directories(
# include
# ${catkin_INCLUDE_DIRS}
)
## Declare a C++ library
## 聲明構建之後需要創建的庫
## 下面是引用myrobot_gazebo功能包的src文件夾中的myrobot_gazebo.cpp文件來創建myrobot_gazebo庫的命令
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/myrobot_gazebo.cpp
# )
## 在構建該庫和可執行文件之前
## 如果有預先生成的有依賴性消息或dynamic_reconfigure,則要先執行
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## add_executable是對於構建之後要生成創建的可執行文件的選項
## 下面是引用src/myrobot_gazebo_node.cpp文件生成myrobot_gazebo_node可執行文件
## 如果有多個要引用的**.cpp文件,將其寫在myrobot_gazebo_node.cpp之後
## 如果要創建兩個以上的可執行文件,需要追加add_executable項目
# add_executable(${PROJECT_NAME}_node src/myrobot_gazebo_node.cpp)
## target的命名:
## target的命名很重要,在catkin中target的名字必須是唯一的,和你之前構建產生的和安裝的都不能相同。這只是cmake內部的需要。可以利用set_target_properties()函數將以個target進行重命名。例如:
## set_target_properties(rviz_image_view
## PROPERTIES OUTPUT_NAME image_view
## PREFIX "")
## 這樣就可以把那個target rviz_image_view 改爲image_view。
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## 這個選項通常和add_executable放在一起
## 是在創建特定的可執行文件之前,將庫和可執行文件進行鏈接的選項
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_myrobot_gazebo.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
ROS中CMakeList.txt的一個例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.