CMake多级目录下工程实现

0. CMake多级目录下工程实现

本文记录了某工程项目中cmake的学习过程及结果,主要涉及cmake的安装,cmake示例编写和平台构建;
源码下载地址:https://download.csdn.net/download/dodonei/10306612

  • CMake 下载安装
  • 示例工程目录结构
  • CMake Linux 平台构建工程项目
  • *CMake Windows平台构建工程项目

1. Cmake安装

  1. Linux安装

    (1)下载 https://cmake.org/
    (2) 可以通过下载源码,在你的机器上编译安装,最简单方法,是下载二进制安装后的包,拷备到你的机器上解压,设置PATH环境变量即可开始使用;

  2. Windows安装

2. 示例工程目录结构

MSLayer为一个静态库,iMM_Cache也为一个静态库,均为动态库,CMakelist的具体实现,清参考源码,include和src中放的源码是示例,你编译时可以放入你自己源码。

MM_SDK/
├── AudioCache
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── AudioCacheAPI.h
│ │ └── StrategySelect.h
│ └── src
│     ├── AudioCacheAPI.cpp
│     └── StrategySelect.cpp
├── CMakeLists.txt
├── EngineCommon
│ ├── adpcm.cpp
│ └── voc_vox.cpp
├── MM_Audio
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── audiolib.h
│ │ └── resource.h
│ └── src
│     ├── audiolib.cpp
│     └── toaulaw.cpp
├── MM_EB9
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── eMMAgent.h
│ │ └── resource.h
│ └── src
│     ├── backaudio.cpp
│     └── Win_Linux_file_func.cpp
├── MM_ML
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── jt_license_rsa.h
│ │ └── tts_proxy_uuid.h
│ └── src
│     ├── jt_license_rsa.cpp
│     └── tts_proxy_uuid.cpp
├── MM_Session
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── audiolib.h
│ │ └── stdafx.h
│ └── src
│     ├── Config.cpp
│     └── tovox.cpp
├── MM_USyn
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── MM_USyn.h
│ │ ├── resource.h
│ │ └── USynAPI.h
│ └── src
│     ├── backaudio.cpp
│     └── MM_USyn.cpp
├── MM_VW
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── MM_VW.h
│ │ └── text_parser.h
│ └── src
│     ├── backaudio.cpp
│     └── text_parser.cpp
└── XXLayer
    ├── CMakeLists.txt
    ├── include
    │ ├── audio_jtts.h
    │ └── UtilStrTool.h
    └── src
        ├── audio_jtts.cpp
        └── UtilStrTool.cpp

3. iMM_SDK

PROJECT(iMM_SDK)

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)

SET(SERVER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../../service)
SET(DEPENDS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../../depends)
SET(DEPENDS_NEW ${CMAKE_CURRENT_SOURCE_DIR}/../../../../depends_new)
SET(TTS_SDK_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})


SET(TTS_SDK_LIB_PATH ${TTS_SDK_ROOT_PATH}/../deploy/lib)
SET(TTS_SDK_BIN_PATH ${TTS_SDK_ROOT_PATH}/../deploy/bin)

MESSAGE(STATUS "Project root directory:" ${SERVER_ROOT_PATH}) 


if(DEBUG_FLAG)
    SET(DEBUG_FLAG "-g")
    SET(BUILD_CONFIGURATION_ "debug")
else()
    SET(DEBUG_FLAG "-DNDEBUG")
    SET(BUILD_CONFIGURATION "release")
endif()

SET(HCI_WARNINGS_SETTING "-Wall -Wextra -Wno-missing-field-initializers -Wno-deprecated -Wno-unused-parameter -Wno-deprecated-declarations -Wno-unused-function -Wno-unused-variable")
SET(C_CPP_FLAGS_ "${C_CPP_FLAGS_} -static-libstdc++ -std=c++14 -pthread -fPIC -Wl,--no-undefined -O3 -DUSE_COMMON_LIB ${DEBUG_FLAG} ${OS_FLAG} ${HCI_WARNINGS_SETTING}")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${C_CPP_FLAGS_}")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_CPP_FLAGS_}")



ADD_SUBDIRECTORY(MSLayer)
ADD_SUBDIRECTORY(iMM_Audio)
ADD_SUBDIRECTORY(iMM_ML)
ADD_SUBDIRECTORY(iMM_Session)
ADD_SUBDIRECTORY(iMM_USyn)
ADD_SUBDIRECTORY(iMM_VW)

4. MSLayer

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)

SET(MODULE_NAME MSLayer)

INCLUDE_DIRECTORIES(
    ${DEPENDS_NEW}/apache-log4cxx-0.10.0/linux_x64/shared/include
    ${SERVER_ROOT_PATH}/log_wrapper/include
    ${SERVER_ROOT_PATH}/common/include
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${SERVER_ROOT_PATH}/include
)

LINK_DIRECTORIES(
    ${TTS_SDK_BIN_PATH}
    ${TTS_SDK_LIB_PATH}
    ${SERVER_ROOT_PATH}/deploy/common/bin
    ${SERVER_ROOT_PATH}/build/common
)

SET(LIBS
    common
)

AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCFILE)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")

ADD_LIBRARY(
    ${MODULE_NAME}
    STATIC
    ${SRCFILE}
)

TARGET_LINK_LIBRARIES(${MODULE_NAME} ${LIBS})

5. iM_VW

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)

SET(MODULE_NAME iMM_VW)
INCLUDE_DIRECTORIES(
    ${TTS_SDK_ROOT_PATH}/EngineCommon
    ${TTS_SDK_ROOT_PATH}/iMM_Session/include
    ${TTS_SDK_ROOT_PATH}/MSLayer/include
    ${TTS_SDK_ROOT_PATH}/iMM/include
    ${TTS_SDK_ROOT_PATH}/iMM_ML/include
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${DEPENDS_PATH}/ACE_5_6_6/ACE_wrappers
    ${DEPENDS_PATH}/iconv/include
    ${TTS_SDK_ROOT_PATH}/depends/VW/include
)

LINK_DIRECTORIES(
    ${TTS_SDK_BIN_PATH}
    ${TTS_SDK_LIB_PATH}
    ${SERVER_ROOT_PATH}/build/log_wrapper
    ${SERVER_ROOT_PATH}/build/common
)

SET(LIBS 
    log_wrapper
    common
    ACE
    OSLayer
    iMM
    dl
)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -DUSE_DUMMY_SDK_ -DUSE_DUMMY_SLB_")

AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCFILE )
ADD_LIBRARY(${MODULE_NAME} SHARED ${SRCFILE})
TARGET_LINK_LIBRARIES(${MODULE_NAME} ${LIBS})

6. iMM_ML

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)

SET(MODULE_NAME iMM_ML)
INCLUDE_DIRECTORIES(
    ${TTS_SDK_ROOT_PATH}/EngineCommon
    ${DEPENDS_PATH}/ACE_5_6_6/ACE_wrappers
    ${DEPENDS_NEW}/apache-log4cxx-0.10.0/linux_x64/shared/include
    ${DEPENDS_NEW}/libevent-2.1.8/linux_x64/static/include
    ${DEPENDS_NEW}/protobuf-2.5.0/linux_x64/static/include
    ${DEPENDS_NEW}/openssl-1.0.2l/linux_x64/static/include
    ${DEPENDS_NEW}/jsoncpp-1.8.3/linux_x64/static/include
    ${DEPENDS_NEW}/tinyxml-2.6.2/linux_x64/static/include
    ${SERVER_ROOT_PATH}/log_wrapper/include
    ${SERVER_ROOT_PATH}/common/include
    ${SERVER_ROOT_PATH}/tcpclient_synch/include
    ${SERVER_ROOT_PATH}/hcicloud_protocol/include
    ${SERVER_ROOT_PATH}/network/include
    ${SERVER_ROOT_PATH}/modules/liblicense_server/include
    ${SERVER_ROOT_PATH}/LicenseServerTool/jtRSA/include
    ${SERVER_ROOT_PATH}/LicenseServerTool/depends/rockey/include
    ${SERVER_ROOT_PATH}/liblicense_server_sdk_public/include
    ${TTS_SDK_ROOT_PATH}/iMM_ML/include
    ${TTS_SDK_ROOT_PATH}/iMM_Session/include
    ${TTS_SDK_ROOT_PATH}/OSLayer/include
    ${TTS_SDK_ROOT_PATH}/iMM_Audio/include
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${DEPENDS_PATH}/iconv/include
)

LINK_DIRECTORIES(
    ${TTS_SDK_BIN_PATH}
    ${TTS_SDK_LIB_PATH}
    ${DEPENDS_NEW}/jsoncpp-1.8.3/linux_x64/static/lib
    ${DEPENDS_NEW}/zlib-1.2.11/linux_x86_64/shared/lib
    ${SERVER_ROOT_PATH}/build/log_wrapper
    ${SERVER_ROOT_PATH}/deploy/common/bin
    ${SERVER_ROOT_PATH}/build/common
    ${SERVER_ROOT_PATH}/LicenseServerTool/depends/rockey/lib/linux_x64
    ${SERVER_ROOT_PATH}/LicenseServerTool/depends/rockey/lib/linux_x64
    ${DEPENDS_NEW}/openssl-1.0.2l/linux_x64/static/lib
    ${DEPENDS_NEW}/jsoncpp-1.8.3/linux_x64/static/lib
    ${DEPENDS_NEW}/libevent-2.1.8/linux_x64/static/lib
    ${SERVER_ROOT_PATH}/build/network
    ${DEPENDS_NEW}/tinyxml-2.6.2/linux_x64/static/lib
    ${SERVER_ROOT_PATH}/build/tcpclient_synch
    ${DEPENDS_NEW}/protobuf-2.5.0/linux_x64/static/lib
    ${SERVER_ROOT_PATH}/build/hcicloud_protocol
)

SET(LIBS
    hcicloud_protocol   
    protobuf
    tinyxml
    crypto
    common
    iMM_Session
    dl
    z
)


#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -DUSE_DUMMY_SDK_ -DUSE_DUMMY_SLB_")

AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCFILE )
ADD_LIBRARY(${MODULE_NAME} SHARED ${SRCFILE})
TARGET_LINK_LIBRARIES(${MODULE_NAME} ${LIBS})
SET(LOG_FILE "log.txt")
ADD_CUSTOM_COMMAND(
    OUTPUT ${LOG_FILE}
    COMMAND ${DEPENDS_NEW}/tools/patchelf --set-rpath ${GLIBC_RPATH}  --force-rpath ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME} 2>/dev/null
    COMMAND mkdir -p ${TTS_SDK_SO_PATH} && cp -rf ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME} ${TTS_SDK_SO_PATH}
)

猜你喜欢

转载自blog.csdn.net/dodonei/article/details/79576495
今日推荐