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)