继上一篇文章(点击查看),继续吧。
4、CMake脚本
什么是CMake脚本?一个独立的script.cmake CMake源文件。
运行CMake脚本
cmake -p script.cmake
CMake脚本只是单纯执行里面的命令,但是不生成构建文件,因为脚本文件里面定义的命令不能包括构建生成目标文件的命令或者动作。
先看看TarsCpp是如何使用该操作的,先看看最终效果吧。
先打开hello示例项目,然后构建,如图所示:
构建完成后,进入build目录,执行打包命令,即会运行打包脚本
cd build
make tar
可以看到,执行打包命令后,生成HelloClient.tgz和HelloServer.tgz软件包,实际上仅仅是两个压缩文件,我们看下具体命令的代码吧:
set(TARS_TAR_CMAKE "${PROJECT_BINARY_DIR}/tar.cmake")
add_custom_target(tar
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -P ${TARS_TAR_CMAKE})
执行make tar时,实际上运行的是以上这段脚本:即设置工作目录设置在当前构建目录下(build目录),然后执行命令cmake -P tar.cmake运行CMake脚本。
那我们看看tar.cmake是如何动态生成的吧。
# #########################################################################
# 打包命令:make tar
# 生成对应的tar命令cmake文件
set(RUN_TAR_COMMAND_FILE "${CMAKE_BINARY_DIR}/tar-${TARGET}.cmake")
# 创建临时目录,避免冲突
file(WRITE ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E echo mkdir -p ${CMAKE_BINARY_DIR}/tmp/${TARGET})\n")
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E echo rm -rf ${CMAKE_BINARY_DIR}/tmp/${TARGET})\n")
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/tmp/${TARGET})\n")
# Windows可执行文件以.exe作为后缀
set(TARGET_EXE_NAME ${TARGET})
if(WIN32)
set(TARGET_EXE_NAME "${TARGET_EXE_NAME}.exe")
endif()
# 拷贝执行文件到临时目录
if(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E echo copy bin/${CMAKE_BUILD_TYPE}/${TARGET_EXE_NAME} ${CMAKE_BINARY_DIR}/tmp/${TARGET}/)\n")
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy bin/${CMAKE_BUILD_TYPE}/${TARGET_EXE_NAME} ${CMAKE_BINARY_DIR}/tmp/${TARGET}/)\n")
else()
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E echo copy bin/${TARGET_EXE_NAME} ${CMAKE_BINARY_DIR}/tmp/${TARGET}/)\n")
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy bin/${TARGET_EXE_NAME} ${CMAKE_BINARY_DIR}/tmp/${TARGET}/)\n")
endif()
# 拷贝其他文件到临时目录
foreach(UPLOAD_FILE ${TARS_UPLOAD_FILES})
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E echo copy ${UPLOAD_FILE} ${CMAKE_BINARY_DIR}/tmp/${TARGET}/)\n")
if(WIN32)
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy ${UPLOAD_FILE} ${CMAKE_BINARY_DIR}/tmp/${TARGET}/)\n")
else()
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy ${UPLOAD_FILE} ${CMAKE_BINARY_DIR}/tmp/${TARGET}/)\n")
endif()
endforeach(UPLOAD_FILE ${TARS_UPLOAD_FILES})
# 执行打包命令
# tar czfv out.tgz dir
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/tmp/ tar czfv ${TARGET}.tgz ${TARGET})\n")
file(APPEND ${RUN_TAR_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/tmp/${TARGET}.tgz ${CMAKE_BINARY_DIR}/${TARGET}.tgz)\n")
add_custom_command(OUTPUT ${TARGET}.tgz
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -P ${RUN_TAR_COMMAND_FILE}
COMMENT "call ${RUN_TAR_COMMAND_FILE}")
add_custom_target(${TARGET}-tar DEPENDS ${TARGET}.tgz ${TARGET})
file(APPEND ${TARS_TAR_CMAKE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -P ${RUN_TAR_COMMAND_FILE})\n")
我们看到通过file命令往tar.cmake文件写入内容了,其内容又是运行子进程执行另外一个cmke脚本,晕菜了吧。
file(APPEND ${TARS_TAR_CMAKE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -P ${RUN_TAR_COMMAND_FILE})\n")
晕菜归晕菜,我们还是得看看另外个脚本是如何动态生成的,然后都运行了哪些指令。
上面一大串代码,做的事情其实不多,先动态创建一个脚本文件tar-${TARGET}.cmake,然后往文件里面写入命令,命令主要包括创建目录,拷贝文件,压缩目录等。好了,具体还得自己看看上面代码,揣摩揣摩下,不复杂。
除了打包命令make tar,TarsCpp还支持上传命令make upload快速发布到发布平台,对作为开发来说,这太有用了,还有发布tars文件命令make release发布tars文件和生成的对应头文件到本机协议目录,对多人合作来说,另外一个项目依赖你的微服务,即依赖你的服务接口定义(tars和对应头文件),发布文件后,其他人就可以使用了。当然还可以通过上传.tars文件命令make upload_tars把tars文件上传到发布平台,到发布平台,使用tars文件建case,测试,不香吗?哈哈,这几个命令,真的方便了开发,也方便了测试呀。
本文暂时没有评论,来添加一个吧(●'◡'●)