通过CMakeLists.txt和shell脚本实现自动化编译

这是项目的整个目录结构

项目目录

#此种方式配置犹如Vs中的配置一样
# CMakeLists file
cmake_minimum_required(VERSION 2.6)

project (server)

#编译选项
SET(CMAKE_CXX_FLAGS_DEBUG "-g -ggdb -Wall -Wno-unknown-pragmas")
SET(CMAKE_CXX_FLAGS "-std=c++0x -Wno-deprecated")
SET(CMAKE_CXX_FLAGS_RELEASE "-g -O2")
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--hash-style=sysv")

#指定头文件
#其中PROJECT_SOURCE_DIR是此CMakeList所在的目录
include_directories ("${PROJECT_SOURCE_DIR}/lib/linux/include" "${PROJECT_SOURCE_DIR}/lib/linux/include/mysql" "${PROJECT_SOURCE_DIR}/lib/boost_1_53_0" "${PROJECT_SOURCE_DIR}/event"  )

#指定链接库(libXXXX.so动态库, libXXXX.a静态库)的目录
link_directories ("${PROJECT_SOURCE_DIR}/lib/linux/lib")

#添加子目录(其中子目录中含有项目文件.cpp)
add_subdirectory (common)
add_subdirectory (event)
add_subdirectory (logic)
add_subdirectory (net)
add_subdirectory (worldd)
add_subdirectory (gamed)
add_subdirectory (pvpwar/battled)
add_subdirectory (pvpwar/matchd)

#最终要生成的可执行文件 和main函数所在的文件
add_executable (gamed gamed/Daemon.cpp)
add_executable (worldd worldd/worldd.cpp)
add_executable (battled pvpwar/battled/battle.cpp)
add_executable (matchd pvpwar/matchd/match.cpp)

#指定生成的可执行程序需要的库如gamed 依赖于gamed game logic event common net protobuf log4cxx config++ tokyotyrant mysqlclient 
target_link_libraries (gamed game logic event common net protobuf log4cxx config++ tokyotyrant mysqlclient)
target_link_libraries (worldd world logic event common net protobuf log4cxx config++ tokyotyrant)
target_link_libraries (battled battle logic event common net protobuf log4cxx config++ )
target_link_libraries (matchd match logic event common net protobuf log4cxx config++ tokyotyrant mysqlclient)
#这是自动写子目录CMakeList的脚本,文件名为叫autoCeateSubCmakeList.sh(对应项目目录图片中的./buildcmake.sh)
#build net
cd net
rm -f CMakeLists.txt
echo "# CMakeLists file">>CMakeLists.txt
echo "add_library(net NetCache.cpp NetHandler.cpp ProtocolHandler.cpp )">>CMakeLists.txt
cd ..

#build common
cd common
rm -f CMakeLists.txt

echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(common  ">>CMakeLists.txt
ls xml/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo  ") ">>CMakeLists.txt

cd ..

#build event 
cd event
rm -f CMakeLists.txt

echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(event  ">>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo  ") ">>CMakeLists.txt

cd ..

#build gamed
cd gamed
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(game  ">>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
echo  ") ">>CMakeLists.txt

cd ..

#build logic
cd logic
rm -f CMakeLists.txt

echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(logic  ">>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo  ") ">>CMakeLists.txt

cd ..


#build worldd
cd worldd
rm -f CMakeLists.txt

echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(world  ">>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo  ") ">>CMakeLists.txt

cd ..

#build battle
cd pvpwar/battled
rm -f CMakeLists.txt

echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(battle  ">>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo  ") ">>CMakeLists.txt

cd ../..

#build match
cd pvpwar/matchd
rm -f CMakeLists.txt

echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(match  ">>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo  ") ">>CMakeLists.txt

cd ../..

此时在主CmakeList.txt文件下,
先执行./autoCeateSubCmakeList.sh,目的是生成子文件夹下CMakeLists.txt
然后执行cmake . 目的是让主CMakeList根据配置还有根据子文件夹下的CMakeList.txt生成makefile
然后就可以执行make的指令进行编译了


#以后代码有更新直接调用此脚本即可自动编译,如果以后有新增加的文件夹,那么需要重新在上面的脚本和主CMakeList中按照格式新增新的文件夹
#!/bin/bash
set -x
svn up
./buildcmake.sh
make -j 8
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CMakeLists.txt文件中,可以使用`execute_process`命令执行外部脚本。该命令的语法如下: ``` execute_process(COMMAND command [args...] [WORKING_DIRECTORY dir] [OUTPUT_VARIABLE var] [RESULT_VARIABLE var] [ERROR_VARIABLE var] [INPUT_FILE file] [OUTPUT_FILE file] [ERROR_FILE file] [RESULT_ENCODING encoding] [OUTPUT_STRIP_TRAILING_WHITESPACE] [ERROR_STRIP_TRAILING_WHITESPACE] [OUTPUT_QUIET] [ERROR_QUIET] [TIMEOUT seconds] [MAXIMUM_OUTPUT_SIZE bytes]) ``` 其中,`command`参数指定要执行的外部脚本,`args`参数指定要传递给脚本的参数。可以使用`WORKING_DIRECTORY`参数来指定脚本执行的工作目录。`OUTPUT_VARIABLE`参数可以将脚本的输出存储到指定的变量中,`RESULT_VARIABLE`参数可以将脚本的返回值存储到指定的变量中,`ERROR_VARIABLE`参数可以将脚本的错误信息存储到指定的变量中。`INPUT_FILE`参数可以将指定的文件内容作为脚本的输入,`OUTPUT_FILE`参数可以将脚本的输出保存到指定的文件中,`ERROR_FILE`参数可以将脚本的错误信息保存到指定的文件中。`RESULT_ENCODING`参数可以指定返回值的编码方式。`OUTPUT_STRIP_TRAILING_WHITESPACE`参数可以去除输出内容中的末尾空格,`ERROR_STRIP_TRAILING_WHITESPACE`参数可以去除错误信息中的末尾空格。`OUTPUT_QUIET`参数可以禁止将输出内容打印到终端,`ERROR_QUIET`参数可以禁止将错误信息打印到终端。`TIMEOUT`参数可以指定脚本的最大执行时间,`MAXIMUM_OUTPUT_SIZE`参数可以指定输出内容的最大长度。 例如,以下代码使用`execute_process`命令执行一个Python脚本,并将其输出存储到变量中: ``` execute_process(COMMAND python script.py arg1 arg2 OUTPUT_VARIABLE script_output) ``` 其中,`script.py`是要执行的Python脚本,`arg1`和`arg2`是传递给脚本的参数,`script_output`是存储脚本输出的变量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值