1 cmake_minimum_required (VERSION 2.8) 2 3 #指定项目的名称(CMAKE_PROJECT_NAME) 4 #在cmake中有两个预定义变量:< projectname >_BINARY_DIR以及< projectname >_SOURCE_DIR 5 6 project(NetLib) 7 8 if(NOT CMAKE_BUILD_TYPE) 9 set(CMAKE_BUILD_TYPE "Release") 10 endif() 11 12 set(CMAKE_CXX_COMPILER "g++") 13 set(CMAKE_CXX_FLAGS "-std=c++11 -Wall") 14 set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") 15 set(CMAKE_CXX_FLAGS_RELEASE "-O3") 16 17 #PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR 18 #内部构建情况下两个变量值相同。 19 #在外部构建的情况下,PROJECT_SOURCE_DIR指向的目录同内部构建相同,为CMakeList.txt所在的目录(假定为workDirectory), 20 #而PROJECT_BINARY_DIR则有所不同,指向workDirectory/build/release目录。(因为外部构建是在release文件夹里面调用cmake..) 21 22 23 #CMAKE_BUILD_TYPE=$BUILD_TYPE=release 24 message(STATUS "BUILD_TYPE: " ${CMAKE_BUILD_TYPE}) 25 #这是一个转化为大写的命令,把CMAKE_BUILD_TYPE的值大写后写入BUILD_TYPE 26 string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE) 27 #CXXFLAGS = -std=c++11 -Wall -03,这是存放一些g++的后缀,std=c++11这是要包含的库 28 message(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}}) 29 30 #可以通过 SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置 31 #PROJECT_BINARY_DIR=workDirectory/build/release 32 #库文件 33 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 34 #可执行文件 35 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 36 37 #INCLUDE_DIRECTORIES类似gcc中的编译参数“-I”,指定编译过程中编译器搜索头文件的路径 38 include_directories(${PROJECT_SOURCE_DIR}/src) 39 40 #设定源文件和头文件就在这四个文件夹内 41 set(SRC_LIST "log" "base" "net" "http") 42 43 foreach(SUB_DIR ${SRC_LIST}) 44 #搜集在指定路径下的所有源文件的文件名,将输出结果列表储存在指定的变量(SUB_LIST)中。 45 aux_source_directory(src/${SUB_DIR} SUB_LIST) 46 #和add_executable类似,生成库文件,SHARED代表动态库,STATIC代表静态库, 最后一个参数代表此库的源文件列表,此指令只有三个参数 47 #这里是生成库,名字是NetLib_${SUB_DIR} 48 add_library(NetLib_${SUB_DIR} ${SUB_LIST}) 49 #参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,可能是可执行二进制、动态库、静态库。 50 #因为DESTINATION没有用绝对路径,所以用的是CMAKE_INSTALL_PREFIX,也就是release/../release-install/lib 51 #这里我们把库安装好,放到../release-install/lib里面去 52 install(TARGETS NetLib_${SUB_DIR} DESTINATION lib) 53 #DIRECTORY后面连接的是所在Source目录的相对路径,这里把所有的头文件都安装好 54 #install(FILES flie DESTINATION dir_path) #执行make install时,把file拷贝到dir_path 55 #这里把src/${SUB_DIR}的文件里面的.h文件都安装好,放在../release-install/include里面去 56 install(DIRECTORY src/${SUB_DIR}/ DESTINATION include FILES_MATCHING PATTERN "*.h") 57 endforeach() 58 59 #target_link_libraries(target_name lib_name ...) 60 #给目标添加依赖库,类似与gcc -l lib_name,此指令有两个用处,一个是给可执行target_name 添加库依赖,二是给库target_name 添加库依赖。 61 #这里相当于生成库文件名字是NetLib_base和NetLib_net,这里的库需要依赖pthread 62 target_link_libraries(NetLib_base pthread) 63 target_link_libraries(NetLib_net pthread) 64 65 #项目最终编译生成的可执行文件名称则是由ADD_EXECUTABLE命令来指定的。 66 add_executable(main src/main.cc) 67 target_link_libraries(main NetLib_http pthread) 68 69 #这是调用下面这两个目录里的cmakelist.txt 70 #用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置(由binary_dir指定)。 71 add_subdirectory(src/log/tests) 72 add_subdirectory(src/net/tests)