CMake在ubuntu下的使用(2)

上一节学习了单源文件,单目录多源文件,多目录多源文件,这里我们来继续学习cmake的使用。

自定义编译选项

源码路径:demo.

     ~~~~     CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案。
     ~~~~     例如,可以将 subSum库设为一个可选的库,如果该选项为 ON ,就使用该库定义的数学函数来进行运算。否则就直接相加。
     ~~~~     我们需要修改根目录的CMakeLists.txt:

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo4)

# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )
  
# 是否使用自己的 MathFunctions 库
option (USE_MYMATH
       "Use provided math implementation" ON)
       
# 是否加入 subSum 库
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/sub1")
  add_subdirectory (sub1)  
  set (EXTRA_LIBS ${EXTRA_LIBS} subSum)
endif (USE_MYMATH)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo ${DIR_SRCS})
target_link_libraries (Demo  ${EXTRA_LIBS})

     ~~~~     其中:

1.第7行的 configure_file 命令用于加入一个配置头文件 config.h ,这个文件由 CMake 从 config.h.in 生成,通过这样的机制,将可以通过预定义一些参数和变量来控制代码的生成。
2.第13行的 option 命令添加了一个 USE_MYMATH 选项,并且默认值为 ON 。
3.第17行根据 USE_MYMATH 变量的值来决定是否使用我们自己编写的 subSum库。

     ~~~~     然后修改main.cpp文件:

#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#ifdef USE_MYMATH
  #include "sub1/sumfun.h"
#else
#endif

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    int iVal1 = atof(argv[1]);
    int iVal2 = atoi(argv[2]);

#ifdef USE_MYMATH
    printf("Now we use our own Math library. \n");
    int result = sum_test(iVal1, iVal2);
#else
    printf("Now we use the standard. \n");
    int result = iVal1 + iVal2;
#endif
    printf("%d + %d = %d\n", iVal1, iVal2, result);
    return 0;
}

     ~~~~     上面的程序值得注意的是第2行,这里引用了一个 config.h 文件,这个文件预定义了 USE_MYMATH 的值。但我们并不直接编写这个文件,为了方便从 CMakeLists.txt 中导入配置,我们编写一个 config.h.in 文件,内容如下:

#cmakedefine USE_MYMATH

     ~~~~     然后我们可以使用ccmake来代替cmake指令进行编译,使用ccmake指令需要安装make-curses-gui。

sudo apt-get install cmake-curses-gui

     ~~~~     运行ccmake .
     ~~~~     如果开始没有编译会出现下面的界面,这个界面没有出现也没有关系

                                                     Page 0 of 1
 EMPTY CACHE

















EMPTY CACHE:
Press [enter] to edit option                                                 CMake Version 3.5.1
Press [c] to configure
Press [h] for help           Press [q] to quit without generating
Press [t] to toggle advanced mode (Currently Off)

     ~~~~     按c进行配置,然后进度从零到一百,出现下面的界面

 CMAKE_BUILD_TYPE                *
 CMAKE_INSTALL_PREFIX            */usr/local
 USE_MYMATH                      *ON















USE_MYMATH: Use provided math implementation
Press [enter] to edit option                                                 CMake Version 3.5.1
Press [c] to configure
Press [h] for help           Press [q] to quit without generating
Press [t] to toggle advanced mode (Currently Off)

     ~~~~     我们将光标移动到第三行,按回车就可以修改这个值,这个值就会直接影响到我们的编译,就是我们前面配置的USE_MYMATH,默认为NO。
     ~~~~     修改完成按c配置,g生成Makefile文件并退出
     ~~~~     然后make运行即可,我们可以在改完之后查看config.h文件的内容,如果是NO

qilimi@sharenew-desktop:~/test/cmake/5-test$ cat config.h
#define USE_MYMATH

     ~~~~     如果是OFF:

qilimi@sharenew-desktop:~/test/cmake/5-test$ cat config.h
/* #undef USE_MYMATH */

安装和测试

源码路径:demo.

     ~~~~     CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行。
     ~~~~     在以前的 GNU Makefile 里,你可能需要为此编写 install 和 test 两个伪目标和相应的规则,但在 CMake 里,这样的工作同样只需要简单的调用几条命令。
     ~~~~     定制安装规则,先在根目录下的CMakeList.txt最后添加:

# 指定安装路径
install (TARGETS Demo DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h"
         DESTINATION include)

     ~~~~     然后修改在sub1目录下的CMakeLists.txt文件,在最后添加:

# 指定 MathFunctions 库的安装路径
install (TARGETS subSum DESTINATION bin)
install (FILES sumfun.h DESTINATION include)

     ~~~~     执行make install

qilimi@sharenew-desktop:~/test/cmake/6-test$ sudo make install
[ 50%] Built target subSum
[100%] Built target Demo
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/Demo
-- Installing: /usr/local/include/config.h
-- Installing: /usr/local/bin/libsubSum.a
-- Installing: /usr/local/include/sumfun.h

     ~~~~     添加测试同样很简单。CMake 提供了一个称为 CTest 的测试工具。我们要做的只是在项目根目录的 CMakeLists 文件中调用一系列的 add_test 命令。

# 启用测试
enable_testing()

# 测试程序是否成功运行
add_test (test_run Demo 5 2)

# 测试帮助信息是否可以正常提示
add_test (test_usage Demo)
set_tests_properties (test_usage
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")
  
# 测试 5 + 2
add_test (test_5_2 Demo 5 2)
set_tests_properties (test_5_2
 PROPERTIES PASS_REGULAR_EXPRESSION "= 7")
 
# 测试 10 + 5
add_test (test_10_5 Demo 10 5)
set_tests_properties (test_10_5
 PROPERTIES PASS_REGULAR_EXPRESSION "= 15")
 
# 测试 2 + 10
add_test (test_2_10 Demo 2 10)
set_tests_properties (test_2_10
 PROPERTIES PASS_REGULAR_EXPRESSION "= 12")

     ~~~~     上面的代码包含了四个测试。第一个测试 test_run 用来测试程序是否成功运行并返回 0 值。剩下的是否能得到正确结果。其中 PASS_REGULAR_EXPRESSION 用来测试输出是否包含后面跟着的字符串。

qilimi@sharenew-desktop:~/test/cmake/6-test$ make test
Running tests...
Test project /home/qilimi/test/cmake/6-test
    Start 1: test_run
1/5 Test #1: test_run .........................   Passed    0.00 sec
    Start 2: test_usage
2/5 Test #2: test_usage .......................   Passed    0.00 sec
    Start 3: test_5_2
3/5 Test #3: test_5_2 .........................   Passed    0.00 sec
    Start 4: test_10_5
4/5 Test #4: test_10_5 ........................   Passed    0.00 sec
    Start 5: test_2_10
5/5 Test #5: test_2_10 ........................   Passed    0.00 sec

100% tests passed, 0 tests failed out of 5

Total Test time (real) =   0.01 sec

     ~~~~     如果要测试更多的输入数据,像上面那样一个个写测试用例未免太繁琐。这时可以通过编写宏来实现,下面替换上面的代码:

# 启用测试
enable_testing()

# 测试程序是否成功运行
add_test (test_run Demo 5 2)

# 测试帮助信息是否可以正常提示
add_test (test_usage Demo)
set_tests_properties (test_usage
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

# 定义一个宏,用来简化测试工作
macro (do_test arg1 arg2 result)
  add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})
  set_tests_properties (test_${arg1}_${arg2}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)

# 使用该宏进行一系列的数据测试
do_test (5 2 "7")
do_test (10 5 "15")
do_test (2 10 "12")
do_test (15 10 "25")
do_test (2 14 "16")
do_test (2 77 "79")
qilimi@sharenew-desktop:~/test/cmake/6-test$ make test
Running tests...
Test project /home/qilimi/test/cmake/6-test
    Start 1: test_run
1/8 Test #1: test_run .........................   Passed    0.00 sec
    Start 2: test_usage
2/8 Test #2: test_usage .......................   Passed    0.00 sec
    Start 3: test_5_2
3/8 Test #3: test_5_2 .........................   Passed    0.00 sec
    Start 4: test_10_5
4/8 Test #4: test_10_5 ........................   Passed    0.00 sec
    Start 5: test_2_10
5/8 Test #5: test_2_10 ........................   Passed    0.00 sec
    Start 6: test_15_10
6/8 Test #6: test_15_10 .......................   Passed    0.00 sec
    Start 7: test_2_14
7/8 Test #7: test_2_14 ........................   Passed    0.00 sec
    Start 8: test_2_77
8/8 Test #8: test_2_77 ........................   Passed    0.00 sec

100% tests passed, 0 tests failed out of 8

Total Test time (real) =   0.01 sec

学习来源:https://www.hahack.com/codes/cmake/#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值