关于mysql:CMAKE编译时如何自动下载第三方库并解压安装到指定目录

41次阅读

共计 4047 个字符,预计需要花费 11 分钟才能阅读完成。

  • GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。

导语

在日常开发过程中难免会应用到第三方库或者须要将局部库拆散另外存储,如果将库与代码放在一起难免会造成工程宏大,此时就能够采纳将库与源码拆散的形式,在编译时依据状况来判断是否须要下载。

步骤

上面来解析下具体操作步骤,以下以 oracle oci 库下载为例。

UNSET 命令初始化本次编译用到的参数变量

   #初始化 oci 库压缩包门路参数 LOCAL_OCI_LIB_ZIP

   UNSET(LOCAL_OCI_LIB_ZIP CACHE)

   #初始化 oci 库解压门路参数 LOCAL_OCI_LIB_DIR

​    UNSET(LOCAL_OCI_LIB_DIR CACHE)

​    #初始化 oci 库压缩包下载门路参数 LOCAL_OCI_LIB_ZIP_DL_DIR

​    UNSET(LOCAL_OCI_LIB_ZIP_DL_DIR CACHE)

SET 命令设置参数初始门路或名称

   #设置 oci 库存放文件夹名称

   SET(OCI_LIB_NAME "oci_x86_lib")

​    # 设置 oci 库压缩包解压文件夹名称

​    SET(OCI_LIB_UNZIP_DIR_NAME ${OCI_LIB_NAME})

​    #设置 oci 库头文件寄存文件夹名称

​    SET(LOCAL_OCI_INCLUDE_DIR_NAME "oci_include")

​    #设置 oci 库压缩包名称

​    SET(OCI_LIB_ZIP_NAME "oci_lib.tar.gz")

​    #设置 oci 库近程下载地址 URL

​    SET(OCI_LIB_DOWNLOAD_URL "http://xxxxxx/oci_lib.tar.gz")

​    #设置 oci 库近程下载超时工夫

​    SET(DOWNLOAD_OCI_LIB_TIMEOUT 600 CACHE STRING "Timeout in seconds when downloading oci_lib.")

FIND_FILE 命令在门路下查找对应名称文件或文件夹是否存在,判断库是否曾经下载或解压

​    #判断压缩包在文件夹 ora_oci_lib 下是否曾经存在

​         FIND_FILE(LOCAL_OCI_LIB_ZIP

​              NAMES ${OCI_LIB_ZIP_NAME}

​              PATHS "ora_oci_lib"

​              NO_DEFAULT_PATH

​            )

​       #判断压缩包在文件夹 ora_oci_lib 下是否曾经解压

​        FIND_FILE(LOCAL_OCI_LIB_DIR

​              NAMES ${OCI_LIB_NAME}

​              PATHS "ora_oci_lib"

​              NO_DEFAULT_PATH

​            )

​       #判断压缩包下载门路

​       FIND_FILE(LOCAL_OCI_LIB_ZIP_DL_DIR

​              NAMES ""​              PATHS"ora_oci_lib"

​              NO_DEFAULT_PATH

​            )

MESSAGE 命令输入相应步骤的提示信息

​     #输入以后正进行的操作步骤信息

​     MESSAGE(STATUS "Checking dblink ${OCI_LIB_UNZIP_DIR_NAME} + ${LOCAL_OCI_LIB_ZIP} .....")

判断以后压缩包是否存在,如果不存在则开始依据设定的 URL 地址进行下载

​     #判断压缩包是否曾经存在

​      IF(NOT LOCAL_OCI_LIB_ZIP)

​           #不存在则进行下载操作,输入操作提示信息

​            MESSAGE(STATUS "Downloading ${OCI_LIB_ZIP_NAME} to ${LOCAL_OCI_LIB_ZIP_DL_DIR}")

​           #从设定 URL 地址下载相应的压缩包

​            FILE(DOWNLOAD ${OCI_LIB_DOWNLOAD_URL}

​            ${LOCAL_OCI_LIB_ZIP_DL_DIR}/${OCI_LIB_ZIP_NAME}

​            TIMEOUT ${DOWNLOAD_OCI_LIB_TIMEOUT}

​            STATUS ERR

​            SHOW_PROGRESS 

​             )

​       #判断下载是否存在谬误

​       IF(ERR EQUAL 0)

​          #如果下载无谬误则设置压缩包名称标记下载胜利

​           SET(LOCAL_OCI_LIB_ZIP "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${OCI_LIB_ZIP_NAME}")

​        ELSE()

​            #下载谬误输入相干的提示信息

​            MESSAGE(STATUS "Download failed, error: ${ERR}")

​            MESSAGE(FATAL_ERROR

​              "You can try downloading ${OCI_LIB_DOWNLOAD_URL} manually"

​                "using curl/wget or a similar tool"

​            )

​           ENDIF()

​        ENDIF()

依据设定标记判断是否下载胜利,如果下载胜利则对压缩包文件进行初步的校验,无问题则进行解压缩操作

​        IF(LOCAL_OCI_LIB_ZIP)

​            #输入相应的提示信息校验解压门路等

​             MESSAGE(STATUS "Checking dblink ${OCI_LIB_UNZIP_DIR_NAME} + ${LOCAL_OCI_INCLUDE_DIR_NAME} + ${LOCAL_OTL_INCLUDE_DIR_NAME}")

​             IF(NOT EXISTS "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${OCI_LIB_UNZIP_DIR_NAME}" OR NOT EXISTS               "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${LOCAL_OCI_INCLUDE_DIR_NAME}" OR NOT EXISTS       "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${LOCAL_OTL_INCLUDE_DIR_NAME}" )

​            #输入提示信息筹备进行解压缩

​            MESSAGE(STATUS "cd ${LOCAL_OCI_LIB_ZIP_DL_DIR}; tar xfz ${LOCAL_OCI_LIB_ZIP}")

​            #获取已下载的压缩包大小做根本的判断

​            GET_FILE_SIZE(${LOCAL_OCI_LIB_ZIP} LOCAL_ZIP_SIZE)

​            #如果压缩包大小为 0 则输入对应的错误信息

​            IF(LOCAL_ZIP_SIZE EQUAL 0)

​                  #移除损坏压缩包,重置相应的参数

​                FILE(REMOVE ${LOCAL_OCI_LIB_ZIP})

​                 UNSET(LOCAL_OCI_LIB_ZIP)

​                UNSET(LOCAL_OCI_LIB_ZIP CACHE)

​                MESSAGE(FATAL_ERROR  "${OCI_LIB_ZIP_NAME} is zero length. Deleting it.")

​              ELSE()

​               #下载文件根本无问题,进入解压门路开始解压压缩包

​                 EXECUTE_PROCESS(​                  COMMAND ${CMAKE_COMMAND} -E tar xfz "${LOCAL_OCI_LIB_ZIP}"

​                   WORKING_DIRECTORY "${LOCAL_OCI_LIB_ZIP_DL_DIR}"

​                  RESULT_VARIABLE tar_result

​                   )

​               #判断解压是否胜利

​             IF (tar_result MATCHES 0)

​                 #解压胜利设置胜利标记参数

​                  SET(OCI_LIB_FOUND 1 CACHE INTERNAL "")

​             ELSE()

​                 #解压失败输入相应谬误提示信息

​                MESSAGE(STATUS "Failed to extract files.\n"

​                  "Please try downloading and extracting yourself.\n"

​                 "The url is: ${OCI_LIB_DOWNLOAD_URL}")

​             ENDIF()

​        ENDIF()

​       ENDIF()

​      ENDIF()        

至此第三方库曾经下载解压实现,后续能够依据本人源码,设置对应的链接门路进行编译

​      INCLUDE_DIRECTORIES 命令能够设置援用头文件包含门路

​     LINK_DIRECTORIES 命令能够设置援用第三方库文件所在门路 

编译实现后能够应用 INSTALL 命令将后续利用运行时须要应用的库,拷贝到指定的装置目录

   CMAKE_INSTALL_PREFIX 为设置的装置门路

   OCI_LIB_NAME 为库搁置文件夹

​     # copy  lib 

​     INSTALL(​       FILES ${allCopyFiles}  DESTINATION ${CMAKE_INSTALL_PREFIX}/${OCI_LIB_NAME}

​     )

Enjoy GreatSQL :)

文章举荐:

面向金融级利用的 GreatSQL 正式开源
https://mp.weixin.qq.com/s/cI…

Changes in GreatSQL 8.0.25 (2021-8-18)
https://mp.weixin.qq.com/s/qc…

MGR 及 GreatSQL 资源汇总
https://mp.weixin.qq.com/s/qX…

GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6…

在 Linux 下源码编译装置 GreatSQL/MySQL
https://mp.weixin.qq.com/s/WZ…

# 对于 GreatSQL

GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。

Gitee:

https://gitee.com/GreatSQL/Gr…

GitHub:

https://github.com/GreatSQL/G…

Bilibili:

https://space.bilibili.com/13…

微信 &QQ 群:

可搜寻增加 GreatSQL 社区助手微信好友,发送验证信息“加群”退出 GreatSQL/MGR 交换微信群

QQ 群:533341697

微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 公布!

正文完
 0