CMake 小贴士

 

  Documentation | CMake  

 

       设置CMAKE_MODULE_PATH ,  相当于 include() 命令的搜索路径, 【注意!注意!注意!不要“直接”使用相对或者绝对路径,而是用CMAKE_CURRENT_SOURCE_DIR 定义的相对路径】

  比如:

set(CMAKE_MODULE_PATH
  "${
CMAKE_MODULE_PATH}"
"${CMAKE_CURRENT_SOURCE_DIR}/mycmakedir"}
include
(mycmakefilename) # 直接引用 ./mycmakedir/mycmakefilename.cmake 文件 ,不用加cmake后缀
 

  判断编译器类型:

if(MSVC)
  include(FollyCompilerMSVC)
else()
  include(FollyCompilerUnix)
endif()

  引用配置文件:

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/CMake/folly-config.h.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/folly/folly-config.h
)

  测试

ENABLE_TESTING()   # 这一行决定 add_test 是否有效
ADD_TEST(testname Exename arg1 arg2 ...) 

  通过exe文件设置 cmake 标记

check_cxx_source_runs("
  #include <cstddef>
  #include <cwchar>
  int main(int argc, char** argv) {
    return wcstol(L\"01\", nullptr, 10) == 1 ? 0 : 1;
  }"
  HAVE_WCHAR_SUPPORT
)

   检查某文件是否存在:

find_program (<VAR> name1 [path1 path2 ...])

  批量执行exe(pipline) , 每一个命令都可以作为下一个命令的来源:

execute_process(COMMAND <cmd1> [<arguments>]
                [COMMAND <cmd2> [<arguments>]]...
                [WORKING_DIRECTORY <directory>]
                [TIMEOUT <seconds>]
                [RESULT_VARIABLE <variable>]
                [RESULTS_VARIABLE <variable>]
                [OUTPUT_VARIABLE <variable>]
                [ERROR_VARIABLE <variable>]
                [INPUT_FILE <file>]
                [OUTPUT_FILE <file>]
                [ERROR_FILE <file>]
                [OUTPUT_QUIET]
                [ERROR_QUIET]
                [COMMAND_ECHO <where>]
                [OUTPUT_STRIP_TRAILING_WHITESPACE]
                [ERROR_STRIP_TRAILING_WHITESPACE]
                [ENCODING <name>]
                [ECHO_OUTPUT_VARIABLE]
                [ECHO_ERROR_VARIABLE]
                [COMMAND_ERROR_IS_FATAL <ANY|LAST>])

#范例:在folly项目中应用:
find_program(CYTHON_EXE
             NAMES cython cython3)
if (CYTHON_EXE)
  execute_process(COMMAND ${CYTHON_EXE} --version
                  RESULT_VARIABLE _cython_retcode
                  OUTPUT_VARIABLE _cython_output
                  ERROR_VARIABLE _cython_output
                  OUTPUT_STRIP_TRAILING_WHITESPACE)

  if (${_cython_retcode} EQUAL 0)
    separate_arguments(_cython_output)
    list(GET _cython_output -1 CYTHON_VERSION_STRING)
    message(STATUS "Found Cython Version ${CYTHON_VERSION_STRING}")
  else ()
    message(STATUS "Failed to get Cython version")
  endif ()
else ()
  message(STATUS "Cython not found")
endif ()

 在 folly 项目里,发现 auto_sources(files "*.cpp" "RECURSE" "${FOLLY_DIR}") 这样的函数,但在CMake帮助文档里,并没有找到该函数的描述

 

generator-expression定义为$<...>的形式。该表达式的值有多种形式,而且支持嵌套使用

#条件表达式
$<condition:true_string> 当条件为1时,表达式为true_string,否则为空
$<IF:condition,true_string,false_string> 当条件为1时,表达式为true_string,否则为false_string

# 变量表达式
$<TARGET_EXISTS:target> 当target存在为1,否则为0
$<CONFIG:cfg> 当config为cfg时为1,否则为0。

# for example:
target_link_directories(${PROJECT_NAME} PUBLIC                                                                                                                                                                      
  $<$<CONFIG:Debug>:${CONAN_LIB_DIRS_DEBUG}>                                                                                                                                                                        
  $<$<CONFIG:Release>:${CONAN_LIB_DIRS_RELEASE}>)

 文件操作:

#创建目录
file(MAKE_DIRECTORY ./aa)  
#copy 文件
file(COPY data.txt DESTINATION ./aa/data.txt)
# 删除
file(REMOVE data.txt ./aa/data.txt)
# 重命名
file(RENAME old.txt new.txt)
# 下载
if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
   message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
   file(DOWNLOAD "https://github.com/conan-io/cmake-conan/raw/v0.14/conan.cmake"
                 "${CMAKE_BINARY_DIR}/conan.cmake")
endif()

 

把编译好的文件复制到目的地:

1 add_custom_command(TARGET ${local_obj}   # 针对要执行的项目 :
2     POST_BUILD   # 正确编译完成后执行
3     COMMAND ${CMAKE_COMMAND} -E   # 执行命令 和命令内容
4         copy ${bin_dir}/${local_obj}.exe  
5  ${CMAKE_CURRENT_SOURCE_DIR}/out)

 

posted on 2021-07-23 16:20  金凯旋  阅读(143)  评论(0编辑  收藏  举报

导航