quinnwencn / blog

Apache License 2.0
0 stars 0 forks source link

CMake执行命令 #30

Open quinnwencn opened 4 months ago

quinnwencn commented 4 months ago

在一些编译场景中,我们需要在编译前执行一些shell命令,这在Makefile中是非常常见的,但在CMake中很少涉及。CMake中执行命令常用的有:

  1. execute_process
  2. add_custom_command 这里介绍下execute_process的使用方法:

    execute_process

    execute_process可以执行一个或者多个进程,它的定义为:

    execute_process(COMMAND <cmd1> [args1...]]
                [COMMAND <cmd2> [args2...] [...]]
                [WORKING_DIRECTORY <directory>]
                [TIMEOUT <seconds>]
                [RESULT_VARIABLE <variable>]
                [OUTPUT_VARIABLE <variable>]
                [ERROR_VARIABLE <variable>]
                [INPUT_FILE <file>]
                [OUTPUT_FILE <file>]
                [ERROR_FILE <file>]
                [OUTPUT_QUIET]
                [ERROR_QUIET]
                [OUTPUT_STRIP_TRAILING_WHITESPACE]
                [ERROR_STRIP_TRAILING_WHITESPACE])

    其中:

    • COMMAND: 需要执行的命令,有多个命令,则可以通过多个COMMAND参数执行;
    • WORKING_DIRECTORY:命令执行的目录,效果类似于cd WORKING_DIRECTORY && COMMAND;
    • TIMEOUT: 命令执行的超时时间,如果在超时时间还没结束,命令进程将被结束
    • RESULT_VARIABLE:命令的执行结果将存储在该参数中,可能是进程的返回参数,类型为int,也可能是错误的提示字符串;
    • OUTPUT_VARIABLE: 命令执行的标准输出;
    • ERROR_VARIABLE: 命令执行的错误输出;
    • INPUT_FILE, OUTPUT_FILE, ERROR_FILE:第一个进程的输入是INPUT_FILE,最后一个进程的输出在OUTPUT_FILE,所有进程的错误信息都会输出在ERROR_FILE;
    • OUTPUT_QUIET,ERROR_QUIET:忽略输出和错误;
    • OUTPUT_STRIP_TRAILING_WHITESPACE和ERROR_STRIP_TRAILING_WHITESPACE:未找到含义 下面,我展示几个简单的例子,说明如何使用,但不会涵盖所有参数:
      execute_process(COMMAND rm -rf test_file WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
      execute_process(COMMAND mkdir test_file WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
      execute_process(COMMAND openssl genrsa -out root.key 2048
              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test_file
              TIMEOUT 5)

      对于产生文件后,需要在代码中引用,可也通过target_compile_definitions为代码中引入宏定义:

      target_compile_definitions( target PUBLIC  MACRO_DEFINE="xxx")

      例子:

      target_compile_definitions(auth_test PUBLIC 
      ROOT_KEY="${CMAKE_CURRENT_SOURCE_DIR}/test_file/root.key")