通过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

猜你喜欢

转载自blog.csdn.net/weixin_37098881/article/details/81411608
今日推荐