https://blog.csdn.net/fly_520/article/details/81984057
手动写Makefile太麻烦,然后选择CMake,但是用CMake还是要写CMakeList.txt,于是自己写了个shell脚本来实现快速创建CMake项目。
-
#!/bin/sh
-
#-------------
-
# Module : mk_cmake_pro.sh
-
# Author : Shunli Guo
-
# Created : 2018.6.12
-
# Modify :
-
# Version : 1.0
-
# Usage : ./mk_cmake_pro.sh
-
# Description : 创建一个cmake的工程
-
#---------------
-
# 默认情况下运行本程序,会生成如下目录和文件
-
# test
-
# ├── build
-
# ├── CMakeLists.txt
-
# ├── config.json
-
# ├── include
-
# ├── lib
-
# ├── test
-
# │ └── main.cc
-
# └── version.h.in
-
#
-
# 4 directories, 4 files
-
#
-
# 其中:
-
# 1. CMakeLists.txt是CMake的描述文件
-
# 2. build是编译目录
-
# 3. config.json是配置文件
-
# 4. include文件夹是头文件搜索路径
-
# 5. lib文件夹是库文件搜索路径
-
# 6. main.cc是主程序
-
#
-
# 编译操作过程:
-
# cd build
-
# cmake ..
-
# make
-
# 使用make生成exe输出在test文件夹中
-
# make install
-
# 将配置文件等其他相关文件拷贝到test文件夹中
-
# make clean
-
PWD=$(pwd)
-
cd $PWD
-
if [[ "$1" = "" ]]; then
-
echo "Usage: ./mk_cmake_pro.sh project_name"
-
echo -ne "Please input the Project Name like [test] !"
-
read Answer
-
if [[ "$Answer" = "" ]]; then
-
echo -e "test";
-
PRO_NAME=test;
-
else
-
PRO_NAME=$Answer;
-
fi
-
else
-
PRO_NAME=$1;
-
fi
-
if [[ "$2" = "" ]]; then
-
echo "Usage: ./mk_cmake_pro.sh project_name exe_name"
-
echo -ne "Please input the exe name like [test] !"
-
read Exename
-
if [[ "$Exename" = "" ]]; then
-
echo -e "test";
-
EXE_NAME=test;
-
else
-
EXE_NAME=$Exename;
-
fi
-
else
-
EXE_NAME=$2;
-
fi
-
#创建目录
-
echo "-------------Init Directory ...-------------"
-
mkdir -p $PRO_NAME/build
-
mkdir -p $PRO_NAME/include
-
mkdir -p $PRO_NAME/lib
-
#mkdir -p $PRO_NAME/${EXE_NAME}
-
#创建CMakeLists.txt
-
echo "-------------Create CMakeLists.txt-------------"
-
cd $PRO_NAME
-
echo "cmake_minimum_required (VERSION 2.8)
-
PROJECT($PRO_NAME)
-
#ADD_SUBDIRECTORY($EXE_NAME obj)
-
include(CheckCXXCompilerFlag)
-
CHECK_CXX_COMPILER_FLAG(\"-std=c++11\" COMPILER_SUPPORTS_CXX11)
-
CHECK_CXX_COMPILER_FLAG(\"-std=c++0x\" COMPILER_SUPPORTS_CXX0X)
-
if(COMPILER_SUPPORTS_CXX11)
-
SET(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=c++11\")
-
elseif(COMPILER_SUPPORTS_CXX0X)
-
SET(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=c++0x\")
-
else()
-
message(STATUS \"The compiler \${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.\")
-
endif()
-
# The version number.
-
set (VERSION_MAJOR 0)
-
set (VERSION_MINOR 0)
-
set (VERSION_PATCH 0)
-
set (VERSION_BUILD 1)
-
# configure a header file to pass some of the CMake settings to the source code
-
configure_file (
-
\"\${PROJECT_SOURCE_DIR}/version.h.in\"
-
\"\${PROJECT_BINARY_DIR}/version.h\"
-
)
-
SET(CMAKE_INSTALL_PREFIX \${PROJECT_BINARY_DIR})
-
install(FILES \${PROJECT_SOURCE_DIR}/config.json \${PROJECT_SOURCE_DIR}/${EXE_NAME}d DESTINATION \${PROJECT_BINARY_DIR}/bin)
-
#添加${EXE_NAME}的项目构建信息
-
#添加当前目录CPP文件
-
AUX_SOURCE_DIRECTORY(\${PROJECT_SOURCE_DIR} EXE_SRC_LIST)
-
#添加 include 搜索路径
-
INCLUDE_DIRECTORIES(\${PROJECT_SOURCE_DIR}
-
\${PROJECT_SOURCE_DIR}/include)
-
#添加version的搜索路径
-
INCLUDE_DIRECTORIES(\${PROJECT_BINARY_DIR})
-
#添加 lib 搜索路径
-
LINK_DIRECTORIES(\${PROJECT_SOURCE_DIR}/lib
-
/usr/local/lib)
-
#设置目标文件生成目录
-
set(EXECUTABLE_OUTPUT_PATH \${PROJECT_BINARY_DIR}/bin)
-
#目标文件名
-
ADD_EXECUTABLE(${EXE_NAME} \${EXE_SRC_LIST})
-
#链接lib库
-
#TARGET_LINK_LIBRARIES(play \${PROJECT_SOURCE_DIR}/lib/srs_librtmp.a) # 显示指定链接静态库
-
#TARGET_LINK_LIBRARIES(${EXE_NAME})
-
" > CMakeLists.txt
-
#创建version.h.in
-
echo "-------------Create version.h.in-------------"
-
echo "#define VERSION_MAJOR @VERSION_MAJOR@
-
#define VERSION_MINOR @VERSION_MINOR@
-
#define VERSION_PATCH @VERSION_PATCH@
-
#define VERSION_BUILD @VERSION_BUILD@
-
" > version.h.in
-
#创建 config.json
-
echo "-------------Create config.json-------------"
-
echo "{
-
\"name\":\"${EXE_NAME}\"
-
}" > config.json
-
echo "Create ${EXE_NAME}d"
-
echo "#!/bin/bash
-
# @Author: ifree2017
-
# @Date: `date "+%Y-%m-%d %H:%M:%S"`
-
# @Last Modified by: ifree2017
-
# @Last Modified time: `date "+%Y-%m-%d %H:%M:%S"`
-
# @processname: /etc/init.d/${EXE_NAME}d
-
# Source function library.
-
. /etc/init.d/functions
-
if [ \$2 == \"-d\" ] ; then
-
EXEC_PATH=\`pwd\`
-
else
-
EXEC_PATH=/usr/local/${EXE_NAME}
-
fi
-
EXEC=${EXE_NAME}
-
PID_FILE=/var/run/\${EXEC}.pid
-
DAEMON=\${EXEC_PATH}/\${EXEC}
-
if ! [ -x \${EXEC_PATH}/\${EXEC} ] ; then
-
echo \"ERROR: \${EXEC_PATH}/\${EXEC} not found\"
-
exit 1
-
fi
-
if ! [ -x \${EXEC_PATH}/log ] ; then
-
echo \"mkdir log\"
-
mkdir -p \${EXEC_PATH}/log
-
fi
-
logfilename=\"\${EXEC_PATH}/log/\${EXEC}_info_\`date +%Y%m%d_%H%M%S\`.log\"
-
stop()
-
{
-
echo \"Stoping \${EXEC} ...\"
-
killall \${DAEMON} >/dev/null
-
usleep 100
-
echo \"Shutting down \${EXEC}: [ OK ]\"
-
}
-
start()
-
{
-
echo \"Starting \${EXEC} ...\"
-
nohup \${DAEMON} 2>&1 >> \${logfilename} 2>&1 /dev/null &
-
echo \"Starting \${EXEC}: [ OK ]\"
-
usleep 100
-
}
-
restart()
-
{
-
stop
-
start
-
}
-
case \$1 in
-
start)
-
start
-
;;
-
stop)
-
stop
-
;;
-
restart)
-
start
-
;;
-
status)
-
ps aux|grep ${EXEC}
-
;;
-
*)
-
echo \"Usage: service \${EXEC} {start|stop|restart|status}\"
-
exit 1
-
;;
-
esac
-
exit \$?" > ${EXE_NAME}d
-
chmod a+x ${EXE_NAME}d
-
#cd $EXE_NAME
-
#创建main.cc
-
echo "Create main.cc"
-
echo "#include \"version.h\"
-
#include <stdio.h>
-
int main(int argc, char const *argv[])
-
{
-
/* code */
-
printf(\"Hello ${EXE_NAME}!\r\n\");
-
printf(\"version:%d.%d.%d.%d!\r\n\", VERSION_MAJOR, VERSION_MINOR,
-
VERSION_PATCH, VERSION_BUILD);
-
return 0;
-
}
-
" > main.cc
-
echo "-------------All Done!-------------"
脚本如下,使用时执行
./mk_cmake_pro.sh testpro test
创建成功后
-
cd testpro/build
-
cmake ..
-
make
-
make install
-
cd bin
-
./test 或者 ./testd start|stop|restart -d
Over!