因为需要在linux环境下编写一个统一编译的shell脚本,看了一下cmake相关的东西。
整个shell脚本中具体执行的流程:
1.svn更新代码
2.获取CMakeLists.txt文件
3.cmake相关命令进行编译
重点在CMakeLists.txt文件上,因为它的语法之前并没有接触过,所以还是要了解一下的。
<1>变量定义
语法:SET(<NAME> <VALUE>)
举例:SET(INCLUDE ./source) [定义一个INCLUDE的变量,其值为./source]
<2>内置函数
例如:
AUX_SOURCE_DIRECTORY(<PATH> <PATH_SRC>)
[将PATH目录路径下的文件名都储存在PATH_SRC中,注意子文件夹的名字是不会储存的]
FIND_PATH(<NAME> <FILENAME> <PATH1,PATH2..>)
[在PATH路径下寻找文件FILENAME,如果能找到则将其路径储存在NAME变量中]
INCLUDE_DIRECTORIES(<PATH1,PATH2...>)
[设置PATH路径为cmake编译时的include搜索路径]
LINK_DIRECTORIES(<PATH1,PATH2..>)
[设置PATH路径为cmake编译时的库文件搜索路径]
STRING( XXX XXX )字符串系列的函数
例如我使用到的一个利用正则表达式的字符串替换
STRING( REGEX REPLACE <regular> <replace> <NAME> <FROMSTR> )
[根据regular正则表达式匹配FROMSTR中符合的串,将其替换为replace中的值,最后存入NAME变量中]
举例:
STRING( REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} )
将当前目录路径中的目录名取出,存入CURRENT_FOLDER变量中。
其中".*/(.*)"为正则表达式,根据贪婪匹配原则,其匹配的/必然是最后一个分隔符。
()之内的表达式一般都是后续需要引用的值,根据从左到右的顺序可以用\1 \2的编号格式去引用它们。
因为是在字符串内,防止转义字符\起效,用两个\将其转义为普通的字符。
具体函数的使用可以查看该博主的介绍,比较全面:更多介绍
<3>内置变量
除了自定义的变量,也有cmake自身内置的一些变量。
例如:
CMAKE_CURRENT_SOURCE_DIR
[当前CMakeLists.txt文件所在的目录路径]
EXECUTABLE_OUTPUT_PATH
[编译执行完毕生成的可执行文件存储路径]
LIBRARY_OUTPUT_PATH
[编译执行完毕生成的库文件存储路径]
还有其他的变量介绍,可以看这位博主的文章:更多介绍
<4>控制语句
比如以下if语句,根据对应路径目录是否存在决定不同的操作。
if (EXISTS "./source/gamesrc")
SET(LOGIC_INCLDE_1 ./source/gamesrc)
else()
SET(LOGIC_INCLDE_1 ./gamesrc)
endif()
最后,写一点shell脚本中用的东西:
local DirName=$(basename `pwd`) [获取当前目录名称,写起来比较简洁,挺好用的]