CMake项目生成脚本

https://blog.csdn.net/fly_520/article/details/81984057

手动写Makefile太麻烦,然后选择CMake,但是用CMake还是要写CMakeList.txt,于是自己写了个shell脚本来实现快速创建CMake项目。
 

 
  1. #!/bin/sh

  2. #-------------

  3. # Module : mk_cmake_pro.sh

  4. # Author : Shunli Guo

  5. # Created : 2018.6.12

  6. # Modify :

  7. # Version : 1.0

  8. # Usage : ./mk_cmake_pro.sh

  9. # Description : 创建一个cmake的工程

  10. #---------------

  11. # 默认情况下运行本程序,会生成如下目录和文件

  12. # test

  13. # ├── build

  14. # ├── CMakeLists.txt

  15. # ├── config.json

  16. # ├── include

  17. # ├── lib

  18. # ├── test

  19. # │   └── main.cc

  20. # └── version.h.in

  21. #

  22. # 4 directories, 4 files

  23. #

  24. # 其中:

  25. # 1. CMakeLists.txt是CMake的描述文件

  26. # 2. build是编译目录

  27. # 3. config.json是配置文件

  28. # 4. include文件夹是头文件搜索路径

  29. # 5. lib文件夹是库文件搜索路径

  30. # 6. main.cc是主程序

  31. #

  32. # 编译操作过程:

  33. # cd build

  34. # cmake ..

  35. # make

  36. # 使用make生成exe输出在test文件夹中

  37. # make install

  38. # 将配置文件等其他相关文件拷贝到test文件夹中

  39. # make clean

  40.  
  41. PWD=$(pwd)

  42. cd $PWD

  43.  
  44. if [[ "$1" = "" ]]; then

  45. echo "Usage: ./mk_cmake_pro.sh project_name"

  46. echo -ne "Please input the Project Name like [test] !"

  47. read Answer

  48. if [[ "$Answer" = "" ]]; then

  49. echo -e "test";

  50. PRO_NAME=test;

  51. else

  52. PRO_NAME=$Answer;

  53. fi

  54. else

  55. PRO_NAME=$1;

  56. fi

  57.  
  58. if [[ "$2" = "" ]]; then

  59. echo "Usage: ./mk_cmake_pro.sh project_name exe_name"

  60. echo -ne "Please input the exe name like [test] !"

  61. read Exename

  62. if [[ "$Exename" = "" ]]; then

  63. echo -e "test";

  64. EXE_NAME=test;

  65. else

  66. EXE_NAME=$Exename;

  67. fi

  68. else

  69. EXE_NAME=$2;

  70. fi

  71.  
  72. #创建目录

  73. echo "-------------Init Directory ...-------------"

  74. mkdir -p $PRO_NAME/build

  75. mkdir -p $PRO_NAME/include

  76. mkdir -p $PRO_NAME/lib

  77. #mkdir -p $PRO_NAME/${EXE_NAME}

  78.  
  79. #创建CMakeLists.txt

  80. echo "-------------Create CMakeLists.txt-------------"

  81. cd $PRO_NAME

  82.  
  83. echo "cmake_minimum_required (VERSION 2.8)

  84.  
  85. PROJECT($PRO_NAME)

  86.  
  87. #ADD_SUBDIRECTORY($EXE_NAME obj)

  88.  
  89. include(CheckCXXCompilerFlag)

  90. CHECK_CXX_COMPILER_FLAG(\"-std=c++11\" COMPILER_SUPPORTS_CXX11)

  91. CHECK_CXX_COMPILER_FLAG(\"-std=c++0x\" COMPILER_SUPPORTS_CXX0X)

  92. if(COMPILER_SUPPORTS_CXX11)

  93. SET(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=c++11\")

  94. elseif(COMPILER_SUPPORTS_CXX0X)

  95. SET(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=c++0x\")

  96. else()

  97. message(STATUS \"The compiler \${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.\")

  98. endif()

  99.  
  100. # The version number.

  101. set (VERSION_MAJOR 0)

  102. set (VERSION_MINOR 0)

  103. set (VERSION_PATCH 0)

  104. set (VERSION_BUILD 1)

  105.  
  106. # configure a header file to pass some of the CMake settings to the source code

  107. configure_file (

  108. \"\${PROJECT_SOURCE_DIR}/version.h.in\"

  109. \"\${PROJECT_BINARY_DIR}/version.h\"

  110. )

  111.  
  112. SET(CMAKE_INSTALL_PREFIX \${PROJECT_BINARY_DIR})

  113. install(FILES \${PROJECT_SOURCE_DIR}/config.json \${PROJECT_SOURCE_DIR}/${EXE_NAME}d DESTINATION \${PROJECT_BINARY_DIR}/bin)

  114.  
  115.  
  116. #添加${EXE_NAME}的项目构建信息

  117.  
  118. #添加当前目录CPP文件

  119. AUX_SOURCE_DIRECTORY(\${PROJECT_SOURCE_DIR} EXE_SRC_LIST)

  120.  
  121. #添加 include 搜索路径

  122. INCLUDE_DIRECTORIES(\${PROJECT_SOURCE_DIR}

  123. \${PROJECT_SOURCE_DIR}/include)

  124.  
  125. #添加version的搜索路径

  126. INCLUDE_DIRECTORIES(\${PROJECT_BINARY_DIR})

  127.  
  128. #添加 lib 搜索路径

  129. LINK_DIRECTORIES(\${PROJECT_SOURCE_DIR}/lib

  130. /usr/local/lib)

  131.  
  132. #设置目标文件生成目录

  133. set(EXECUTABLE_OUTPUT_PATH \${PROJECT_BINARY_DIR}/bin)

  134.  
  135. #目标文件名

  136. ADD_EXECUTABLE(${EXE_NAME} \${EXE_SRC_LIST})

  137.  
  138. #链接lib库

  139. #TARGET_LINK_LIBRARIES(play \${PROJECT_SOURCE_DIR}/lib/srs_librtmp.a) # 显示指定链接静态库

  140. #TARGET_LINK_LIBRARIES(${EXE_NAME})

  141. " > CMakeLists.txt

  142.  
  143. #创建version.h.in

  144. echo "-------------Create version.h.in-------------"

  145.  
  146. echo "#define VERSION_MAJOR @VERSION_MAJOR@

  147. #define VERSION_MINOR @VERSION_MINOR@

  148. #define VERSION_PATCH @VERSION_PATCH@

  149. #define VERSION_BUILD @VERSION_BUILD@

  150. " > version.h.in

  151.  
  152. #创建 config.json

  153. echo "-------------Create config.json-------------"

  154.  
  155. echo "{

  156. \"name\":\"${EXE_NAME}\"

  157. }" > config.json

  158.  
  159. echo "Create ${EXE_NAME}d"

  160.  
  161. echo "#!/bin/bash

  162. # @Author: ifree2017

  163. # @Date: `date "+%Y-%m-%d %H:%M:%S"`

  164. # @Last Modified by: ifree2017

  165. # @Last Modified time: `date "+%Y-%m-%d %H:%M:%S"`

  166. # @processname: /etc/init.d/${EXE_NAME}d

  167.  
  168. # Source function library.

  169. . /etc/init.d/functions

  170.  
  171. if [ \$2 == \"-d\" ] ; then

  172. EXEC_PATH=\`pwd\`

  173. else

  174. EXEC_PATH=/usr/local/${EXE_NAME}

  175. fi

  176.  
  177. EXEC=${EXE_NAME}

  178. PID_FILE=/var/run/\${EXEC}.pid

  179. DAEMON=\${EXEC_PATH}/\${EXEC}

  180.  
  181. if ! [ -x \${EXEC_PATH}/\${EXEC} ] ; then

  182. echo \"ERROR: \${EXEC_PATH}/\${EXEC} not found\"

  183. exit 1

  184. fi

  185.  
  186. if ! [ -x \${EXEC_PATH}/log ] ; then

  187. echo \"mkdir log\"

  188. mkdir -p \${EXEC_PATH}/log

  189. fi

  190.  
  191. logfilename=\"\${EXEC_PATH}/log/\${EXEC}_info_\`date +%Y%m%d_%H%M%S\`.log\"

  192. stop()

  193. {

  194. echo \"Stoping \${EXEC} ...\"

  195. killall \${DAEMON} >/dev/null

  196. usleep 100

  197. echo \"Shutting down \${EXEC}: [ OK ]\"

  198. }

  199.  
  200. start()

  201. {

  202. echo \"Starting \${EXEC} ...\"

  203. nohup \${DAEMON} 2>&1 >> \${logfilename} 2>&1 /dev/null &

  204. echo \"Starting \${EXEC}: [ OK ]\"

  205. usleep 100

  206. }

  207.  
  208. restart()

  209. {

  210. stop

  211. start

  212. }

  213. case \$1 in

  214. start)

  215. start

  216. ;;

  217. stop)

  218. stop

  219. ;;

  220. restart)

  221. start

  222. ;;

  223. status)

  224. ps aux|grep ${EXEC}

  225. ;;

  226. *)

  227. echo \"Usage: service \${EXEC} {start|stop|restart|status}\"

  228. exit 1

  229. ;;

  230. esac

  231.  
  232. exit \$?" > ${EXE_NAME}d

  233.  
  234. chmod a+x ${EXE_NAME}d

  235.  
  236. #cd $EXE_NAME

  237.  
  238. #创建main.cc

  239. echo "Create main.cc"

  240.  
  241. echo "#include \"version.h\"

  242. #include <stdio.h>

  243.  
  244. int main(int argc, char const *argv[])

  245. {

  246. /* code */

  247. printf(\"Hello ${EXE_NAME}!\r\n\");

  248. printf(\"version:%d.%d.%d.%d!\r\n\", VERSION_MAJOR, VERSION_MINOR,

  249. VERSION_PATCH, VERSION_BUILD);

  250. return 0;

  251. }

  252. " > main.cc

  253.  
  254. echo "-------------All Done!-------------"

 脚本如下,使用时执行

./mk_cmake_pro.sh testpro test

创建成功后
 

 
  1. cd testpro/build

  2.  
  3. cmake ..

  4.  
  5. make

  6.  
  7. make install

  8.  
  9. cd bin

  10.  
  11. ./test 或者 ./testd start|stop|restart -d

Over!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值