编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

7、Tars C++系列之依赖CMake(一)(commons-codec依赖)

wxchong 2024-07-08 01:18:14 开源技术 18 ℃ 0 评论

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作为顶层目录,构建时就会同时构建所有示例了。

好了,不要篇幅太长了,写得难受,看着也难受,看后文吧。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表