CMake语法与Bash语法的区别
CMake语法与Bash语法的区别
CMake使用的不是Bash语法,而是一种专门设计的脚本语言。虽然两者有一些相似之处(比如变量使用${}
进行引用),但它们是不同的语言体系。
主要区别
特性 | CMake语法 | Bash语法 |
---|---|---|
语言类型 | 构建系统配置语言 | Unix shell脚本语言 |
变量引用 | ${VAR} 或 $ENV{VAR} | $VAR 或 ${VAR} |
字符串比较 | if(VAR STREQUAL "value") | if [ "$VAR" = "value" ]; then |
列表表示 | set(MY_LIST a b c) | MY_LIST=("a" "b" "c") |
函数定义 | function(my_func) | my_func() { ... } |
命令执行 | execute_process(COMMAND cmd) | 直接执行命令或使用反引号/$() |
注释 | # 注释 | # 注释 |
CMake特有的语法元素
-
命令调用:
command_name(arg1 arg2) # 不需要空格分隔
-
条件语句:
if(condition)# ... elseif(another_condition)# ... else()# ... endif()
-
循环:
foreach(item IN LISTS my_list)message(STATUS "Item: ${item}") endforeach()
-
特殊变量:
CMAKE_CURRENT_SOURCE_DIR
- 当前处理的CMakeLists.txt所在目录PROJECT_SOURCE_DIR
- 项目根目录
相似之处
- 变量扩展:都使用
${}
语法(但CMake更严格) - 注释符号:都使用
#
- 基本逻辑结构:都有if/else/foreach等控制结构
重要注意事项
-
空格敏感:CMake命令名和括号之间不能有空格
message ("Hello") # 错误 - 括号前有空格 message("Hello") # 正确
-
参数分隔:CMake参数用空格分隔,不像Bash可以用引号分组
set(SOURCES "a.cpp" "b.cpp") # 正确 set(SOURCES a.cpp b.cpp) # 也正确
-
环境变量访问:需要特殊语法
$ENV{PATH} # CMake访问环境变量PATH
理解这些区别对于正确编写CMake脚本非常重要,特别是当你有Bash背景时,需要避免将Bash的习惯带入CMake脚本编写中。