惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
量子位
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
AWS News Blog
AWS News Blog
T
Threat Research - Cisco Blogs
博客园 - Franky
Vercel News
Vercel News
H
Help Net Security
Martin Fowler
Martin Fowler
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Cyberwarzone
Cyberwarzone
W
WeLiveSecurity
V2EX - 技术
V2EX - 技术
C
CERT Recently Published Vulnerability Notes
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog RSS Feed
H
Hacker News: Front Page
P
Proofpoint News Feed
博客园 - 聂微东
N
News and Events Feed by Topic
C
Cybersecurity and Infrastructure Security Agency CISA
D
Docker
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
S
Security @ Cisco Blogs
博客园 - 【当耐特】
F
Fortinet All Blogs
The Register - Security
The Register - Security
A
About on SuperTechFans
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
NISL@THU
NISL@THU
Attack and Defense Labs
Attack and Defense Labs
Help Net Security
Help Net Security
Cisco Talos Blog
Cisco Talos Blog
月光博客
月光博客
IT之家
IT之家
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
Hugging Face - Blog
Hugging Face - Blog

博客园 - xcywt

IT人备考心得分享 一个大龄程序员的回乡记 一种刚接触的语法。只在linux可用 固件打包流程 malloc底层实现以及和new的比较 C++异步调用 future async promise packaged_task 如果在单例模式中返回share_ptr ??? 记录一道面试题(哈希表 稀疏矩阵) Qt实现自定义控件-按钮 一个线程池的例子 C++ 条件变量condition_variable的例子 C++中share_ptr中循环引用的问题 C++14的一些新特性 C++11的一些特性 ubuntu编译grpc & protobuf perf笔记 Linux下eCal测试计划及进度记录 windows编译ecal 记录一次重装gitlab
一个cmakelist的例子(自动处理多个proto)
xcywt · 2024-09-18 · via 博客园 - xcywt

背景:

由于项目需要,把所有的proto文件放在了统一的文件夹中,为了方便更新以及加快编译速度,要把这个proto自动转成.cc .pb.h文件,再编译成so。

为此,写了个cmakelist.txt。

主要功能:

1)自动遍历指定目录下所有proto文件,调用ptotoc生成.cc文件,如下图:cc文件存放在上一级目录,目录结构类似。

2)编译成so。

目录结构:

 其中common、geometry等文件夹里面放的都是.proto

上代码CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
project(dros_proto)

set(dp_MAJOR_VERSION 0)
set(dp_MINOR_VERSION 2)
set(dp_PATCH_VERSION 0)
set(dp_VERSION "${dp_MAJOR_VERSION}.${dp_MINOR_VERSION}.${dp_PATCH_VERSION}")

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib)

file(GLOB protobuf_files
  ${CMAKE_CURRENT_SOURCE_DIR}/common/*.proto
  ${CMAKE_CURRENT_SOURCE_DIR}/geometry/*.proto
  ${CMAKE_CURRENT_SOURCE_DIR}/navigation/*.proto
  ${CMAKE_CURRENT_SOURCE_DIR}/sensor/*.proto
  ${CMAKE_CURRENT_SOURCE_DIR}/tutorials/*.proto
)

set(3rd_DIR "${PROJECT_SOURCE_DIR}/../../thirdparty")
set(Protobuf_DIR "${3rd_DIR}/protobuf3.14.0.0")

set(PROTO_META_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../proto_cpp)
list(APPEND PROTO_FLAGS -I${CMAKE_CURRENT_SOURCE_DIR}/ -I${Protobuf_DIR}/src/)

if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
  set(ARCH_TYPE x64)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
  set(ARCH_TYPE arm64)
endif()
message("arch type: ${CMAKE_SYSTEM_PROCESSOR}")

set(PROTOC_EXE ${Protobuf_DIR}/bin/${ARCH_TYPE}/protoc-3.14.0.0)
message("proto_exe = ${PROTOC_EXE}")

foreach(FIL ${protobuf_files})
  get_filename_component(FIL_WE ${FIL} NAME_WE)

  string(REGEX REPLACE ".+/(.+)\\..*" "\\1" FILE_NAME ${FIL})
  string(REGEX REPLACE "(.+)\\${FILE_NAME}.*" "\\1" FILE_PATH ${FIL})

  string(REGEX MATCH "(/proto/.*)" MATCH_PATH ${FILE_PATH})
  # message("DDD: ${FILE_PATH}: ${MATCH_PATH}")
  string(REPLACE "/proto/" "/" OUT_PATH ${MATCH_PATH})

  # message("SRC_CPP: ${PROTO_META_BASE_DIR}:${OUT_PATH}:${FIL_WE}.pb.cc")

  set(PROTO_SRCS "${PROTO_SRCS};${PROTO_META_BASE_DIR}${OUT_PATH}${FIL_WE}.pb.cc")
  set(PROTO_HDRS "${PROTO_HDRS};${PROTO_META_BASE_DIR}${OUT_PATH}${FIL_WE}.pb.h")

  EXECUTE_PROCESS(
    COMMAND ${PROTOC_EXE} ${PROTO_FLAGS} --cpp_out=${PROTO_META_BASE_DIR} ${FIL}
  )
endforeach()

include_directories(${Protobuf_DIR}/src)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../proto_cpp)

add_library(${PROJECT_NAME} SHARED
  ${PROTO_SRCS}
  ${PROTO_HDRS}
)
set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${dp_VERSION} SOVERSION ${dp_MAJOR_VERSION})