简易cmake多文件多目录工程模板

  今天心血来潮,想在服务器上试试写libevent的工程是什么感受,那第一步就是学会怎么用cmake建工程,之前也没接触过cmake,然后一上午,比较懵逼,下午看实验室哥们给的一个教程,然后,慢慢理解CMakeLists.txt怎么写,然后自己在一个多文件多目录的demo基础上,加入shell脚本,实现了现在的简易模板。

  先介绍一下模板的功能

  1.多目录,同一目录下生成一个静态库

  2.可配置target name,denpend lib

  3.shell脚本实现附加目录的清理与创建

  4.配置完成,./build.sh即可

 

一、文件目录

二、建立步骤

1.自动创建的目录

  bin 可执行文件输出目录

  lib 静态库输出目录

  inc shell脚本自动搜索src下的头文件,并按相对路径复制到inc

  build cmake构建目录

2.根目录

  将main.cpp 放在根目录 

#include <iostream>
#include "test1/test.h"//使用这种相对路径即可,此时头文件已经存在于inc目录
#include "test2/test2.h"
using namespace std;

int main(){
    
    testPrint("hello world");
    fun3("hello");
    return 0;
}

  CMakeLists.txt

#设置工程名称
PROJECT(CMAKEDemo)
#自己定制
SET(MY_TARGET demo)
SET(MY_LINK test1 test2)


#设置CMAKE最小版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#设置编译器
SET(CMAKE_CXX_COMPILER "g++")
#设置构建类型,及相应的编译选项
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

#设置执行文件输出目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设置库输出路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

MESSAGE("++++++++++++++Start Build+++++++++++++++++")

#当前目录的文件
AUX_SOURCE_DIRECTORY(. SRC_LIST)
#添加子目录
ADD_SUBDIRECTORY(src)

#头文件搜索目录
INCLUDE_DIRECTORIES(inc)
#链接库搜索路径
LINK_DIRECTORIES(lib)
#设置链接库
#SET(EXTRA_LIBS ${EXTRA_LIBS} test1 test2)
SET(EXTRA_LIBS ${EXTRA_LIBS} ${MY_LINK})

#生成可执行文件
ADD_EXECUTABLE(${MY_TARGET} ${SRC_LIST})
#执行文件链接属性
TARGET_LINK_LIBRARIES(${MY_TARGET} ${EXTRA_LIBS})

  build.sh

#!/bin/bash  

set -e  

PROJ_ROOT=$PWD  
BUILD_ROOT=$PROJ_ROOT  
echo -e "\033[31m Current Build Root: $BUILD_ROOT \033[0m"  



BIN_PATH=$BUILD_ROOT/bin

if [ -d $BIN_PATH ];then
    cd $BIN_PATH
    rm -rf *
    cd ..
else
    mkdir -p $BIN_PATH  
fi

INC_PATH=$BUILD_ROOT/inc

if [ -d $INC_PATH ];then
    cd $INC_PATH
    rm -rf *
    cd ..
else
    mkdir -p $INC_PATH  
fi

#cp without path
#find ./src/ -name "*.h" |xargs -i cp {} ./inc/
DEST_PATH="./inc/"

headers=`find . -name *.h`
#echo $headers

for file in $headers
do
#echo $file
    temp=${file#*/}
    temp=${temp#*/}
    dstfile=$DEST_PATH$temp
    dstpath=${dstfile%/*}
    #echo $dstpath
    [ -d $dstpath ] || mkdir -p  $dstpath

    cp -R $file $dstfile

done

LIB_PATH=$BUILD_ROOT/lib

if [ -d $LIB_PATH ];then
    cd $LIB_PATH
    rm -rf *
    cd ..
else
    mkdir -p $LIB_PATH  
fi

BUILD_PATH=$BUILD_ROOT/build

if [ -d $BUILD_PATH ];then
    cd $BUILD_PATH
    rm -rf *
else
    mkdir -p $BUILD_PATH  
    cd $BUILD_PATH
fi

cmake  $PROJ_ROOT  
make -j4

3.src目录

  CMakeLists.txt

ADD_SUBDIRECTORY(test1)
ADD_SUBDIRECTORY(test2)

 

 test1/CMakeLists.txt

#所有的路径变量都不允许重名
AUX_SOURCE_DIRECTORY(. T1_SRC_LIST)
#设置成静态库
ADD_LIBRARY(test1 ${T1_SRC_LIST})

 

  test1/CMakeLists.txt

AUX_SOURCE_DIRECTORY(. T2_SRC_LIST)
ADD_LIBRARY(test2 ${T2_SRC_LIST})
  

 

click here

posted @ 2017-05-08 20:57  tla001  阅读(13539)  评论(0编辑  收藏  举报
个人网站 www.tla001.cn