TarsCpp依赖的第三方库、工具,说多确实不多,说少也确实有点少,少归少,也包括了HTTP2、ProtoBuffer、OpenSSL、zipkin/opentracing、MySQL、gtest、gperf、curl、cmake等,还是有不少学习成本。虽然不一定需要全部使用到,但抱着学习的目的,为了能够看得懂TarsCpp使用的第三方库、工具的代码和用法,达到快速入门TarsCpp的目的,会陆续编写相关文章,但重点只是聚焦TarsCpp使用到的知识点,不然展开面太大了,不好收场。
该篇文章就是针对Tars依赖CMake进行构建,所以针对TarsCpp里面使用的CMake知识进行展开。大概率,在一个篇幅里面是无法说完的,因此针对CMake还会有后文。
好了,进入正题吧。
1、CMake语言
CMake是一门语言,完全具备图灵完备性。
CMkae源文件包括CMakeLists.txt和.cmake两种格式,.cmake强调的是模块化复用。
1、CMake版本要求
如果当前安装的CMake版本低于工程要求的版本,则CMake会停止继续构建。
主要了为了防止项目使用到的一些语法、函数、宏是低版本不支持的。
cmake_minimum_required(VERSION 3.10)
格式:
cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])
2、工程名
设置工程名,最顶层的CMakeLists.txt文件必须包含该命令。
project(example_hello)
格式:
project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[LANGUAGES <language-name>...])
如果仅仅为设置工程名,没必要单独拿出来讲的,关键CMake还据根这个设置命令,额外给我们维护了一些非常有用的变量,包括:
PROJECT_SOURCE_DIR
<PROJECT-NAME>_SOURCE_DIR
PROJECT_BINARY_DIR
<PROJECT-NAME>_BINARY_DIR
PROJECT_VERSION,
<PROJECT-NAME>_VERSION
PROJECT_VERSION_MAJOR
<PROJECT-NAME>_VERSION_MAJOR
PROJECT_VERSION_MINOR
<PROJECT-NAME>_VERSION_MINOR
PROJECT_VERSION_PATCH
<PROJECT-NAME>_VERSION_PATCH
PROJECT_VERSION_TWEAK
<PROJECT-NAME>_VERSION_TWEAK
CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE
虽然说以上变量非常有用,可能有点言过其实了,只是了解了CMake维护了这些变量,我们需要用到时就可以直接使用,不用通过别的方式艰难实现,即一个子工程可很方便使用另外字工程或者当前工程的一些属性,包括:
代码目录:
PROJECT_SOURCE_DIR
<PROJECT-NAME>_SOURCE_DIR
生成执行文件目录:
PROJECT_BINARY_DIR
<PROJECT-NAME>_BINARY_DIR
版本信息:
PROJECT_VERSION,
<PROJECT-NAME>_VERSION
PROJECT_VERSION_MAJOR
<PROJECT-NAME>_VERSION_MAJOR
PROJECT_VERSION_MINOR
<PROJECT-NAME>_VERSION_MINOR
PROJECT_VERSION_PATCH
<PROJECT-NAME>_VERSION_PATCH
PROJECT_VERSION_TWEAK
<PROJECT-NAME>_VERSION_TWEAK
包含CMake语言文件或者模块:
CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE
3、构建子目录
添加子目录一起构建,子目录必须存在CMake源文件CMakeLists.txt,另外一般包含源代码,当然也可以没有,看具体使用。
add_subdirectory(hello)
格式:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
到目前为止,我们来看看TarsCpp的使用情况。
说明:我使用的是我公司内部维护版本。
以example示例为例子,example作为顶层目录,按照CMake规范,顶层目录必须存在CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 3.10)
project(example)
if (NOT TARS_CMAKE_BATCH)
set(TARS_INSTALL_DIR "" CACHE STRING "Tars Install Path")
# 默认安装路径
if (TARS_INSTALL_DIR STREQUAL "")
if(WIN32)
set(TARS_INSTALL_DIR "c:/tars/cpp")
else()
set(TARS_INSTALL_DIR "/usr/local/tars/cpp")
endif()
endif()
set(TARS_PATH ${TARS_INSTALL_DIR})
include (${TARS_INSTALL_DIR}/cmake/tars.cmake)
endif()
set(TARS_CMAKE_BATCH ON)
add_subdirectory(bussiness_coroutine)
add_subdirectory(coroutine)
add_subdirectory(custom_protocol)
add_subdirectory(hello)
add_subdirectory(http)
add_subdirectory(http2)
add_subdirectory(logger)
add_subdirectory(proxy)
add_subdirectory(push)
add_subdirectory(simplehttp)
add_subdirectory(socket)
add_subdirectory(ssl)
add_subdirectory(stress)
add_subdirectory(udp)
add_subdirectory(tars_encode)
add_subdirectory(tup_encode)
add_subdirectory(tars_protocol)
add_subdirectory(tup_protocol)
再看看每个子目录的目录结构,这里以hello示例为例:
example作为顶层目录,hello作为二级目录,再看看hello目录下的CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.10)
project(example_hello)
if (NOT TARS_CMAKE_BATCH)
set(TARS_INSTALL_DIR "" CACHE STRING "Tars Install Path")
# 默认安装路径
if (TARS_INSTALL_DIR STREQUAL "")
if(WIN32)
set(TARS_INSTALL_DIR "c:/tars/cpp")
else()
set(TARS_INSTALL_DIR "/usr/local/tars/cpp")
endif()
endif()
set(TARS_PATH ${TARS_INSTALL_DIR})
include (${TARS_INSTALL_DIR}/cmake/tars.cmake)
endif()
set(TARS_CMAKE_BATCH ON)
add_subdirectory(server)
add_subdirectory(client)
example作为顶层目录,hello作为二级目录,server作为三级目录,再看看server目录下的CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.10)
project(example_hello_server)
if (NOT TARS_CMAKE_BATCH)
set(TARS_INSTALL_DIR "" CACHE STRING "Tars Install Path")
# 默认安装路径
if (TARS_INSTALL_DIR STREQUAL "")
if(WIN32)
set(TARS_INSTALL_DIR "c:/tars/cpp")
else()
set(TARS_INSTALL_DIR "/usr/local/tars/cpp")
endif()
endif()
set(TARS_PATH ${TARS_INSTALL_DIR})
include (${TARS_INSTALL_DIR}/cmake/tars.cmake)
endif()
add_subdirectory(src)
example作为顶层目录,hello作为二级目录,server作为三级目录,src作为四级目录,即最后一层目录,再看看src目录下的CMakeLists.txt内容:
tars_build_server("example" "HelloServer")
上面提到example作为顶层目录,hello作为二级目录,server作为三级目录,实际上,任何一层都可以当作顶层目录来使用,比如将server作为顶层目录,可以单独构建该项目,方便针对单个项目构建、编码和调试。但如果你想同时构建hello的server和client,那就以hello作为顶层目录,构建时就会同时构建server和client。如果你想构建所有的示例,那就以example作为顶层目录,构建时就会同时构建所有示例了。
好了,不要篇幅太长了,写得难受,看着也难受,看后文吧。
本文暂时没有评论,来添加一个吧(●'◡'●)