# 非招行开发人员不允许改动本文件!! if(RVC_VERSION) set(RVC_INTEGRATE_BUILD TRUE) set(RVC_INTEGRATE_BUILDV2 TRUE) set(DEVADAPTER_USING_CONAN TRUE) if(WITH_LOCAL_DEVLIB) set(DEVADAPTER_USING_CONAN FALSE) endif(WITH_LOCAL_DEVLIB) else() cmake_minimum_required (VERSION 3.8) project(DevAdapter) set(DEVADAPTER_VENDOR "demo") set(DEVADAPTER_VERSION "1.2.3.4") set(DEVADAPTER_PROJECT_NAME ${CMAKE_PROJECT_NAME}) set(DEVADAPTER_DESCRIPTION "describe what this version conatains") set(RVC_INTEGRATE_BUILD FALSE) set(DEVADAPTER_USING_CONAN FALSE) set(RVC_VENDOR_CONFIGV2 TRUE) if(RVC_VENDOR_CONFIGV2) set(JENKINS_ON FALSE) if(DEFINED ENV{JENKINS_HOME}) set(JENKINS_ON TRUE) endif(DEFINED ENV{JENKINS_HOME}) if(JENKINS_ON) set(DEVADAPTER_VENDOR $ENV{JOB_BASE_NAME}) set(DEVADAPTER_PROJECT_NAME $ENV{BUILD_TAG_ID}) string(TIMESTAMP tmVar "%Y%m%d") set(DEVADAPTER_VERSION "${tmVar}_$ENV{BUILD_NUMBER}") endif(JENKINS_ON) set(CMAKE_CXX_STANDARD 11) # Turn on solution folders (2.8.4+) for Visual Studio. set_property(GLOBAL PROPERTY USE_FOLDERS ON) if(NOT DEFINED CMAKE_CONFIGURATION_TYPES AND NOT DEFINED CMAKE_BUILD_TYPE) message(FATAL_ERROR "User should define CMAKE_CONFIGURATION_TYPES or CMAKE_BUILD_TYPE") elseif(DEFINED CMAKE_CONFIGURATION_TYPES AND NOT DEFINED CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE ${CMAKE_CONFIGURATION_TYPES}) elseif(DEFINED CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES) set(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE}) endif() # Enable 64bit file support on linux and FreeBSD. if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR FREEBSD) add_definitions("-D_FILE_OFFSET_BITS=64") endif() if(CMAKE_COMPILER_IS_GNUCC) if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686") CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64) if(IS_X86_64) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") message(STATUS "set -fPIC") else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686") message(STATUS "set -march=i686") endif() else() if(CMAKE_POSITION_INDEPENDENT_CODE) if(${CMAKE_VERSION} VERSION_LESS 2.8.9) message(STATUS "set -fPIC 2") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") endif() endif() endif() # active warning or gun c compiler would not burn warning if not necessary. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") endif() set(PACK_INSTALL_RUN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/release") set(RVC_VENDOR_PATH "dep") set(CMAKE_INSTALL_PREFIX ${PACK_INSTALL_RUN_DIR}) #clean the built dir which create from last compiling job. file(GLOB RVC_OLD_DEP_BIN_FILES "${PACK_INSTALL_RUN_DIR}/*") string(LENGTH "${RVC_OLD_DEP_BIN_FILES}" RVC_OLD_DEP_BIN_FILES_length) if(${RVC_OLD_DEP_BIN_FILES_length}) file(REMOVE_RECURSE ${RVC_OLD_DEP_BIN_FILES}) endif(${RVC_OLD_DEP_BIN_FILES_length}) endif(RVC_VENDOR_CONFIGV2) endif(RVC_VERSION) if(MSVC AND (CMAKE_SYSTEM_PROCESSOR MATCHES "i386|i686|x86|AMD64") ) set(DIFF_PLATFORM_SUB_DIR "msvc_x86") elseif((NOT MSVC) AND (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")) set(DIFF_PLATFORM_SUB_DIR "gcc_aarch64") elseif((NOT MSVC) AND (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")) set(DIFF_PLATFORM_SUB_DIR "gcc_x64") endif() message(STATUS "lib rely on directory: ${DIFF_PLATFORM_SUB_DIR}") if(RVC_INTEGRATE_BUILD) #include ErrorCode.h include_directories(${RVC_COMMON_INCLUDE_DIR}) if(SIMULATE_ON) rvc_set_library_output_dir("${RVC_INSTALL_PREFIX}${RVC_VENDOR_PATH}") endif(SIMULATE_ON) endif(RVC_INTEGRATE_BUILD) macro(rvc_traverse_sub_cmake_dirs) file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt") foreach(dir ${all_valid_subdirs}) if(${dir} MATCHES "^([^/]*)/+CMakeLists.txt") string(REGEX REPLACE "^([^/]*)/+CMakeLists.txt" "\\1" dir_trimmed ${dir}) message(STATUS "add module ${dir_trimmed}") add_subdirectory(${dir_trimmed}) endif() endforeach(dir) endmacro(rvc_traverse_sub_cmake_dirs) macro(rvc_define_dependen_dirs) set(VENDOR_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") # include vendor static libraries and comm header files in conan way. if(DEVADAPTER_USING_CONAN) STRING( REGEX REPLACE ".*/(.*)" "\\1" CURRENT_VENDOR_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} ) message(STATUS "vendor name : ${CURRENT_VENDOR_FOLDER}") string(TOUPPER ${CURRENT_VENDOR_FOLDER} CURRENT_VENDOR_FOLDER) #if defined conan dependency package for specified vendor if(${CURRENT_VENDOR_FOLDER}_CONAN_LIB_NAME) conan_cmake_run(REQUIRES ${${CURRENT_VENDOR_FOLDER}_CONAN_LIB_NAME} BASIC_SETUP CMAKE_TARGETS) # 如果使用Conan,则替换为Conan的路径引用 set(VENDOR_CURRENT_SOURCE_DIR ${CONAN_${CURRENT_VENDOR_FOLDER}_ROOT}) endif() endif(DEVADAPTER_USING_CONAN) # 放置有源码的适配器依赖库工程文件 set(VENDOR_CURRENT_DEPS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps") set(VENDOR_CURRENT_INCLUDE_DIR "${VENDOR_CURRENT_SOURCE_DIR}/include") set(VENDOR_CURRENT_ASSET_DIR "${VENDOR_CURRENT_SOURCE_DIR}/assets") set(VENDOR_CURRENT_LIB_DIR "${VENDOR_CURRENT_SOURCE_DIR}/lib/${DIFF_PLATFORM_SUB_DIR}") set(VENDOR_CURRENT_BIN_DIR "${VENDOR_CURRENT_SOURCE_DIR}/bin/${DIFF_PLATFORM_SUB_DIR}") endmacro(rvc_define_dependen_dirs) macro(rvc_aggerate_vendor_libs _vendor_name) # include vendor all devadapter libraries in conan way. if(DEVADAPTER_USING_CONAN) message(STATUS "vendor name v2 : ${_vendor_name}") string(TOUPPER ${_vendor_name} CURRENT_VENDOR) #if defined conan dependency package for specified vendor if(${CURRENT_VENDOR}_CONAN_ALL_LIB_NAME) conan_cmake_run(REQUIRES ${${CURRENT_VENDOR}_CONAN_ALL_LIB_NAME} BASIC_SETUP CMAKE_TARGETS) set(VENDOR_CURRENT_ALL_LIB_ROOT_DIR ${CONAN_${CURRENT_VENDOR}_ROOT}) set(VENDOR_ALL_DEPS_DIR "${VENDOR_CURRENT_ALL_LIB_ROOT_DIR}/dep") set(RVC_VENDOR_DEP_LIB_DIRS ${RVC_VENDOR_DEP_LIB_DIRS} ${VENDOR_ALL_DEPS_DIR}) endif() endif(DEVADAPTER_USING_CONAN) endmacro(rvc_aggerate_vendor_libs) macro(rvc_dev_define_module _module_name) set(MODULE_NAME "${_module_name}") string(TOUPPER "${MODULE_NAME}" MODULE_PREFIX) endmacro(rvc_dev_define_module) # 工程配置文件 macro(rvc_dev_config_library _module_name _module_prefix) set(${_module_prefix}_CHARACTERISTIC "${${_module_prefix}_VENDOR}.${${_module_prefix}_VERSION}.${${_module_prefix}_BATCH}") set(MODULE_FULL_NAME "${_module_name}_${${_module_prefix}_VENDOR}_${${_module_prefix}_VERSION}_${${_module_prefix}_BATCH}") if (MSVC AND RVC_INTEGRATE_BUILD) set (RC_VERSION_MAJOR ${${_module_prefix}_VERSION}) set (RC_VERSION_MINOR ${${_module_prefix}_BATCH}) set (RC_VERSION_BUILD ${MSVC_TOOLSET_VERSION}) set (RC_VERSION_PATCH ${MSVC_VERSION}) configure_file( ${CMAKE_SOURCE_DIR}/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc @ONLY) set ( ${_module_prefix}_SRCS ${${_module_prefix}_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/version.rc) endif() add_library(${MODULE_FULL_NAME} ${${_module_prefix}_SRCS}) set_target_properties(${MODULE_FULL_NAME} PROPERTIES COMPILE_DEFINITIONS "DEVICEBASE_EXPORTS") set_target_properties(${MODULE_FULL_NAME} PROPERTIES OUTPUT_NAME "${_module_name}.${${_module_prefix}_CHARACTERISTIC}") target_include_directories(${MODULE_FULL_NAME} PRIVATE ${DEVADAPTER_CURRENT_INCLUDES_DIR} ${VENDOR_CURRENT_INCLUDE_DIR}) target_link_directories(${MODULE_FULL_NAME} PRIVATE ${DEVADAPTER_CURRENT_LIB_DIR} ${VENDOR_CURRENT_LIB_DIR}) if(SIMULATE_ON) set_target_properties(${MODULE_FULL_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG "${RVC_INSTALL_PREFIX}${RVC_VENDOR_PATH}" LIBRARY_OUTPUT_DIRECTORY_RELEASE "${RVC_INSTALL_PREFIX}${RVC_VENDOR_PATH}" ) endif(SIMULATE_ON) if(MSVC) set_property(TARGET ${MODULE_FULL_NAME} PROPERTY FOLDER "devadapter/${CURRENT_VENDOR}/") endif(MSVC) endmacro(rvc_dev_config_library) # 该宏仅在招行的编译生成环境下才会应用 macro(rvc_dev_target_install _target) if(RVC_INTEGRATE_BUILD) if(MSVC) install(TARGETS ${_target} RUNTIME DESTINATION "${RVC_VENDOR_PATH}" COMPONENT devadapters ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}" COMPONENT develops EXCLUDE_FROM_ALL LIBRARY DESTINATION "${RVC_VENDOR_PATH}" COMPONENT devadapters ) else() install(TARGETS ${_target} RUNTIME DESTINATION "${RVC_VENDOR_PATH}" ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}" LIBRARY DESTINATION "${RVC_VENDOR_PATH}" COMPONENT libraries) endif(MSVC) elseif(RVC_VENDOR_CONFIGV2) install(TARGETS ${_target} RUNTIME DESTINATION "${RVC_VENDOR_PATH}" ARCHIVE DESTINATION "${RVC_VENDOR_PATH}" LIBRARY DESTINATION "${RVC_VENDOR_PATH}") endif(RVC_INTEGRATE_BUILD) endmacro(rvc_dev_target_install) # 用于收录厂商文件夹目录下 lib 下的 .so 库 或者 bin 下的 .dll 库 以及 资源文件 macro(rvc_aggereate_runtime_file) if(RVC_INTEGRATE_BUILD) set(RVC_VENDOR_DEP_LIB_DIRS ${RVC_VENDOR_DEP_LIB_DIRS} ${RVC_VENDOR_LIB_DIRS} ${VENDOR_CURRENT_BIN_DIR} ${VENDOR_CURRENT_ASSET_DIR} PARENT_SCOPE) if(NOT MSVC) set(RVC_VENDOR_DEP_LIB_DIRS ${RVC_VENDOR_DEP_LIB_DIRS} ${VENDOR_CURRENT_LIB_DIR} PARENT_SCOPE) endif(NOT MSVC) elseif(RVC_VENDOR_CONFIGV2) set(RVC_VENDOR_DEP_LIB_DIRS ${RVC_VENDOR_DEP_LIB_DIRS} ${RVC_VENDOR_LIB_DIRS} ${VENDOR_CURRENT_BIN_DIR} ${VENDOR_CURRENT_ASSET_DIR} PARENT_SCOPE) if(NOT MSVC) set(RVC_VENDOR_DEP_LIB_DIRS ${RVC_VENDOR_DEP_LIB_DIRS} ${VENDOR_CURRENT_LIB_DIR} PARENT_SCOPE) endif(NOT MSVC) endif(RVC_INTEGRATE_BUILD) endmacro(rvc_aggereate_runtime_file) set(DEVADAPTER_CURRENT_INCLUDES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) set(DEVADAPTER_CURRENT_ASSET_DIR "${CMAKE_CURRENT_SOURCE_DIR}/assets") set(DEVADAPTER_CURRENT_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib/${DIFF_PLATFORM_SUB_DIR}") set(DEVADAPTER_CURRENT_BIN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bin/${DIFF_PLATFORM_SUB_DIR}") # 用于收录每一个厂商目录下 bin/*.dll 和 lib/*.so 文件,先收集当前目录下统一的库文件以及资源文件 set(RVC_VENDOR_DEP_LIB_DIRS ${DEVADAPTER_CURRENT_BIN_DIR} ${DEVADAPTER_CURRENT_ASSET_DIR}) if(NOT MSVC) set(RVC_VENDOR_DEP_LIB_DIRS ${RVC_VENDOR_DEP_LIB_DIRS} ${DEVADAPTER_CURRENT_LIB_DIR}) endif(NOT MSVC) set(VENDOR_LOG_LIBRARY_NAME "cmblog4vendor") if(NOT RVC_INTEGRATE_BUILD) # 单独的库名称 set(VENDOR_LOG_LIB_NAME ${VENDOR_LOG_LIBRARY_NAME}) else() # 使用工程源码编译 if(MSVC) #合入目前全量包中的DEP文件内容 conan_cmake_run(REQUIRES VendorDLL/7.3.0@LR04.02_VendorLib/msvc BASIC_SETUP CMAKE_TARGETS) set(SELF_CONAN_LIB_NAME self/2024.0314.02@LR04.02_VendorLib/testing) add_subdirectory(self) endif(MSVC) set(VENDOR_LOG_LIB_NAME log4vendor) endif(NOT RVC_INTEGRATE_BUILD) message(STATUS "vendor log library: ${VENDOR_LOG_LIB_NAME}") # 通过conan的方式管理厂商库 if(DEVADAPTER_USING_CONAN) if(MSVC) if(RVC_INTEGRATE_BUILDV2) #厂商适配器兼容WIN的提交,需要将以前的ZIP链接转化为Conan依赖包,处理完之后这里填写内容进行拉取:Demo #set(CMB_CONAN_ALL_LIB_NAME cmb/2024.0315.20@LR04.02_VendorLib/msvc) #rvc_aggerate_vendor_libs(cmb) endif(RVC_INTEGRATE_BUILDV2) else() if(RVC_INTEGRATE_BUILDV2) set(KEBA_CONAN_ALL_LIB_NAME keba/2023.1222.22@LR04.02_VendorLib/stable) set(CW_CONAN_ALL_LIB_NAME cw/2023.1226.14@LR04.02_VendorLib/stable) set(SZZT_CONAN_ALL_LIB_NAME szzt/2023.1219.13@LR04.02_VendorLib/stable) set(GWI_CONAN_ALL_LIB_NAME gwi/2023.1128.10@LR04.02_VendorLib/stable) set(NANTIAN_CONAN_ALL_LIB_NAME nantian/2023.1206.1@LR04.02_VendorLib/stable) set(GRG_CONAN_ALL_LIB_NAME grg/2023.1213.24@LR04.02_VendorLib/stable) rvc_aggerate_vendor_libs(keba) rvc_aggerate_vendor_libs(cw) rvc_aggerate_vendor_libs(szzt) rvc_aggerate_vendor_libs(gwi) rvc_aggerate_vendor_libs(nantian) rvc_aggerate_vendor_libs(grg) endif(RVC_INTEGRATE_BUILDV2) endif(MSVC) endif(DEVADAPTER_USING_CONAN) file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt") foreach(dir ${all_valid_subdirs}) if(${dir} MATCHES "^([^/]*)/+CMakeLists.txt") string(REGEX REPLACE "^([^/]*)/+CMakeLists.txt" "\\1" dir_trimmed ${dir}) # remove 'self' sub directory bcz it would be added seperately if(DEVOPS_ON) string(FIND "self|cmbsz" ${dir_trimmed} found) else() string(FIND "self" ${dir_trimmed} found) endif(DEVOPS_ON) message(STATUS "found: ${found}") if((NOT RVC_INTEGRATE_BUILD) OR (${found} EQUAL -1)) message(STATUS "Adding vendor component ${dir_trimmed}") add_subdirectory(${dir_trimmed}) endif((NOT RVC_INTEGRATE_BUILD) OR (${found} EQUAL -1)) endif() endforeach(dir) if(RVC_INTEGRATE_BUILD) #安装VS2010下的厂商文件,先安装,防止旧的覆盖新的内容 if(CONAN_RES_DIRS_VENDORDLL) file(GLOB RVC_DEP_BIN_FILES "${CONAN_RES_DIRS_VENDORDLL}/*") install(FILES ${RVC_DEP_BIN_FILES} DESTINATION "${RVC_VENDOR_PATH}" COMPONENT devadapters) endif(CONAN_RES_DIRS_VENDORDLL) list(REMOVE_DUPLICATES RVC_VENDOR_DEP_LIB_DIRS) message(STATUS "dep_dirs:${RVC_VENDOR_DEP_LIB_DIRS}") foreach(dep_dir ${RVC_VENDOR_DEP_LIB_DIRS}) message(STATUS "dep_dir: ${dep_dir}") file(GLOB RVC_DEP_BIN_FILES "${dep_dir}/*") list(REMOVE_DUPLICATES RVC_DEP_BIN_FILES) message(STATUS "before file: ${RVC_DEP_BIN_FILES}") list(FILTER RVC_DEP_BIN_FILES EXCLUDE REGEX ".*\\.a$") message(STATUS "after file: ${RVC_DEP_BIN_FILES}") foreach(bin_file ${RVC_DEP_BIN_FILES}) if(IS_DIRECTORY ${bin_file}) string(REGEX MATCH ".*/grg$" GRG_LIB_DIR_NAME "${bin_file}") string(LENGTH "${GRG_LIB_DIR_NAME}" GRG_LIB_DIR_NAME_length) if(NOT ${GRG_LIB_DIR_NAME_length}) install(DIRECTORY "${bin_file}" DESTINATION "${RVC_VENDOR_PATH}" COMPONENT devadapters) else() message(STATUS "skip install dir: ${bin_file}") endif(NOT ${GRG_LIB_DIR_NAME_length}) else() install(PROGRAMS ${bin_file} DESTINATION "${RVC_VENDOR_PATH}" COMPONENT devadapters) endif() endforeach() endforeach() elseif(RVC_VENDOR_CONFIGV2) # 此列表中的文件已在终端应用中包含,所以要移除,TODO: Windows 需要兼容 set(USELESS_DEVADAPTER_FILE_NAMES liblog4cplus.so libcmblog4vendor.so ) list(REMOVE_DUPLICATES RVC_VENDOR_DEP_LIB_DIRS) foreach(dep_dir ${RVC_VENDOR_DEP_LIB_DIRS}) message(STATUS "dep_dir: ${dep_dir}") file(GLOB RVC_DEP_BIN_FILES "${dep_dir}/*") list(REMOVE_DUPLICATES RVC_DEP_BIN_FILES) message(STATUS "before file: ${RVC_DEP_BIN_FILES}") foreach(filter_elem ${USELESS_DEVADAPTER_FILE_NAMES}) set(filter_args ".*\\${filter_elem}$") list(FILTER RVC_DEP_BIN_FILES EXCLUDE REGEX ${filter_args}) endforeach() list(FILTER RVC_DEP_BIN_FILES EXCLUDE REGEX ".*\\.a$") message(STATUS "after file: ${RVC_DEP_BIN_FILES}") foreach(bin_file ${RVC_DEP_BIN_FILES}) if(IS_DIRECTORY ${bin_file}) install(DIRECTORY "${bin_file}" DESTINATION "${RVC_VENDOR_PATH}") else() install(PROGRAMS ${bin_file} DESTINATION "${RVC_VENDOR_PATH}") endif() endforeach() endforeach() endif(RVC_INTEGRATE_BUILD) if((NOT RVC_INTEGRATE_BUILD) AND RVC_VENDOR_CONFIGV2) if(NOT CPACK_GENERATOR) set(CPACK_GENERATOR "ZIP") message(STATUS "set zip package file type for matching head bank publish") endif() set(CPACK_PACKAGE_FILE_NAME "${DEVADAPTER_VENDOR}_${DEVADAPTER_PROJECT_NAME}_${DEVADAPTER_VERSION}") set(CPACK_PACKAGE_NAME "${DEVADAPTER_VENDOR}-${DEVADAPTER_PROJECT_NAME}") set(CPACK_PACKAGE_VENDOR "${DEVADAPTER_VENDOR}") set(CPACK_PACKAGE_VERSION ${DEVADAPTER_VERSION}) set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE TRUE) include(CPack) endif((NOT RVC_INTEGRATE_BUILD) AND RVC_VENDOR_CONFIGV2)