cmake是项目管理工具:简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
在Linux平台下使用CMake生成Makefile并编译的流程如下:
A、编写CMake配置文件CMakeLists.txt
B、执行命令cmake PATH生成Makefile,PATH是CMakeLists.txt所在的目录。
C、使用make命令进行编译。
其中,A既是下文注释的文件,B、C都由muduo库中提供的build.sh完成,我们使用时只需要执行build.sh,这个bash脚本会帮我们完成B、C。
cmake_minimum_required(VERSION 2.6)
#cmake最小版本为2.6
project(muduo C CXX)
#project 用这个 定义工程名称,并指定工程支持的语言(可忽略)默认支持所有语言
enable_testing()
#设置生成Debug版本或者Release版本
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_BUILD_TYPE "Release")
endif()
#set指令可以用来显示的定义变量
#在cmake脚本中,设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。
#使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的:
#add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),
#而set命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的。
set(CXX_FLAGS
-g
# -DVALGRIND
# -DMUDUO_STD_STRING
-DCHECK_PTHREAD_RETURN_VALUE
-D_FILE_OFFSET_BITS=64
-Wall #大部分警告
-Wextra #一些额外的警告
-Werror #当出现警告时转为错误,停止编译
-Wconversion #一些可能改变值的隐式转换,给出警告
-Wno-unused-parameter #函数中出现未使用的参数,不给出警告
-Wold-style-cast #C风格的转换,给出警告
-Woverloaded-virtual #如果函数的声明隐藏住了基类的虚函数,就给出警告
-Wpointer-arith #对函数指针或者void *类型的指针进行算术操作时给出警告
-Wshadow #当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告
-Wwrite-strings #规定字符串常量的类型是const char[length],因此,把这样的地址复制给 non-const char *指针将产生警告.这些警告能够帮助你在编译期间发现企图写入字符串常量的代码
-march=native #指定cpu体系结构为本地平台
# -MMD
# -std=c++0x
-rdynamic
)
if(CMAKE_BUILD_BITS EQUAL 32)
list(APPEND CXX_FLAGS "-m32")
#添加新element到list中
endif()
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CXX_FLAGS}")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS_DEBUG "-O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -finline-limit=1000 -DNDEBUG")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
#EXECUTABLE_OUTPUT_PATH 设置二进制的输出路径
#LIBRARY_OUTPUT_PATH 设置库的输出的路径
#CMAKE_CXX_COMPILER 指定Cxx编译器
#CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo
#和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变
#量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串
#作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,
#工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项
#生成 Makefile。
#PROJECT_BINARY_DIR = 如果是 in source 编译,指得就是工程顶层目录,如果是 out-of-source 编译,指的是工程编译发生的目录。
#CMAKE_INSTALL_PREFIX 用于定义相对安装路径在build.sh中定义
find_package(Boost REQUIRED)
find_package(Protobuf)
find_package(CURL)
find_package(ZLIB)
find_path(CARES_INCLUDE_DIR ares.h)
#CARES_INCLUDE_DIR 代表找到的ares.h的全路径包括文件名
find_library(CARES_LIBRARY NAMES cares)
find_path(MHD_INCLUDE_DIR microhttpd.h)
find_library(MHD_LIBRARY NAMES microhttpd)
find_library(BOOSTTEST_LIBRARY NAMES boost_unit_test_framework)
find_library(BOOSTPO_LIBRARY NAMES boost_program_options)
find_path(TCMALLOC_INCLUDE_DIR gperftools/heap-profiler.h)
find_library(TCMALLOC_LIBRARY NAMES tcmalloc_and_profiler)
find_path(HIREDIS_INCLUDE_DIR hiredis/hiredis.h)
find_library(HIREDIS_LIBRARY NAMES hiredis)
find_path(GD_INCLUDE_DIR gd.h)
find_library(GD_LIBRARY NAMES gd)
find_program(THRIFT_COMPILER thrift)
find_path(THRIFT_INCLUDE_DIR thrift)
find_library(THRIFT_LIBRARY NAMES thrift)
#message指令用于向终端输出用户定义的信息,
#有三种类型:
#SEND_ERROR 产生错误,生产过程被跳过
#STATUS 输出前缀为-的信息
#FATAL_ERROR,立即终止所有cmake过程
if(CARES_INCLUDE_DIR AND CARES_LIBRARY)
message(STATUS "found cares")
endif()
if(CURL_FOUND)
message(STATUS "found curl")
endif()
if(PROTOBUF_FOUND)
message(STATUS "found protobuf")
endif()
if(TCMALLOC_INCLUDE_DIR AND TCMALLOC_LIBRARY)
message(STATUS "found tcmalloc")
endif()
if(ZLIB_FOUND)
message(STATUS "found zlib")
endif()
if(HIREDIS_INCLUDE_DIR AND HIREDIS_LIBRARY)
message(STATUS "found hiredis")
endif()
if(GD_INCLUDE_DIR AND GD_LIBRARY)
message(STATUS "found gd")
endif()
if(THRIFT_COMPILER AND THRIFT_INCLUDE_DIR AND THRIFT_LIBRARY)
message(STATUS "found thrift")
endif()
include_directories(${Boost_INCLUDE_DIRS})
include_directories(${PROJECT_SOURCE_DIR})
string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
message(STATUS "CXX_FLAGS = " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}})
#包含子目录
add_subdirectory(muduo/base)
#add_subdirectory(muduo/net)
#if(NOT CMAKE_BUILD_NO_EXAMPLES)
# add_subdirectory(contrib)
# add_subdirectory(examples)
#else()
# if(CARES_INCLUDE_DIR AND CARES_LIBRARY)
# add_subdirectory(examples/cdns)
# endif()
#endif()
#包含子目录
add_subdirectory(tests)
#子目录下的 CMakeLists.txt文件和源代码也会被处理 。