cmake
初识 cmake helloworld
PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello SRC_LIST)
PROJECT 指令得语法是:
PROJECT(projectname [CXX] [C] [Java])
这个指令隐式的定义了两个 cmake 变量:
_BINARY_DIR 以及_SOURCE_DIR
同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致
SET 指令的语法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
SET 指令可以用来显式的定义变量
MESSAGE 指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息。FATAL_ERROR,立即终止所有 cmake 过程.
FATAL_ERROR,立即终止所有 cmake 过程.
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中
定义的源文件列表, 本例中你也可以直接写成 ADD_EXECUTABLE(hello main.c)。
注:
在本例我们使用了${}来引用变量,这是 cmake 的变量应用方式,但是,有一些例外,比
如在 IF 控制语句,变量是直接使用变量名引用,而不需要 。 如 果 使 用 了 {}。如果使用了 。如果使用了{}去应用变
量,其实 IF 会去判断名为${}所代表的值的变量,那当然是不存在的了。
基本语法规则
1,变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
2,指令(参数 1 参数 2…)
参数使用括弧括起,参数之间使用空格或分号分开。
3,指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。
4、这里需要特别解释的是作为工程名的 HELLO 和生成的可执行文件 hello 是没有任何关系的。hello 定义了可执行文件的文件名,你完全可以写成:ADD_EXECUTABLE(t1 main.c)编译后会生成一个 t1 可执行文件。
5,关于语法的疑惑 SET(SRC_LIST main.c)也可以写成 SET(SRC_LIST “main.c”) 是没有区别的,但是假设一个源文件的文件名是 fu nc.c(文件名中间包含了空格)。 这时候就必须使用双引号,如果写成了 SET(SRC_LIST fu nc.c),就会出现错误,提示 你找不到 fu 文件和 nc.c 文件。这种情况,就必须写成: SET(SRC_LIST “fu nc.c”)
清理工程
跟经典的 autotools 系列工具一样,运行: make clean 即可对构建结果进行清理。
内部构建与外部构建:
新建build目录 cmake … 称之为外部构建。使工程看起来更整洁。
通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即 /backup/cmake/t1
而 HELLO_BINARY_DIR 则指代编译路径,即/backup/cmake/t1/build
值得注意的是 cmake 没有像automake 一样的 make distclean 指令,来清理中间文件。
下一节,我们的任务是让 HelloWorld 看起来更像一个工程。
后续更新。。。