Protobuf - 使用scons编译proto文件

 使用protobuf过程中,需要先对消息结构进行定义,文件以.proto格式结尾。然后要使用google提供的protoc命令行,把.proto文件转成对应的代码文件。
 protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR path/to/file.proto
 这个步骤看起来非常简单,但是在实际项目中,编译过程文件众多,不可能对这个进行单独生成和编译。新的代码文件要保证能随时更新引入。
 最后通过scons,研究了会builder,自己定义了protobuf的编译规则。在每次执行项目编译时,均会对.proto格式的文件进行代码生成,引入项目进行编译。
  
 下面附上编译脚本,适用于大多复杂项目:
  1 #!/usr/bin/python   
2 # -*- coding: UTF-8 -*-   
3   
4 import os  
5   
6 #--------------protobuf-------------------  
7 #proto file path  
8 SRC_DIR = ARGUMENTS.get("SRC_DIR","./")  
9 DST_DIR = ARGUMENTS.get("DST_DIR","./") 
10  
11 #construct proto 
12 PROTOC = Builder(action="protoc -I=" + SRC_DIR + " --cpp_out=" + DST_DIR + " " + SRC_DIR + "$SOURCES",src_surffix=".proto") 
13 ENV_PB = Environment(BUILDERS={'Protoc':PROTOC}) 
14 PROTOFILE = Glob('*.proto') 
15 CCFILE = Glob('*.cc') 
16 ENV_PB.Protoc(PROTOFILE) 
17  
18 #--------------cpp------------------- 
19 ENV_CPP = Environment(CC = 'g++') 
20  
21 #compile info 
22 TARGETNAME = 'Server' 
23 LIB = Split('pthread jsoncpp protobuf amqpcpp') 
24 FILELIST = Glob('*.cpp') 
25 FILELIST = FILELIST + CCFILE 
26 HEADFILEPATH = Split('../Thrid ../Common') 
27 LIB_DIR = Split('../Thrid/lib') 
28 FLAGS = Split('-std=c++11 -Wall -g -D _DEBUG') 
29  
30 #Program target 
31 TARGETFILE = ENV_CPP.Program(target = TARGETNAME,source = FILELIST,LIBS = LIB,CPPPATH = HEADFILEPATH,LIBPATH = LIB_DIR,CCFLAGS = FLAGS) 
32  
33 #install 
34 INSTALL = ENV_CPP.Install('../bin', TARGETFILE) 
35 ENV_CPP.Alias('install',INSTALL)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据科学与人工智能

【数据科学】数据科学中的 Spark 入门

本文由 伯乐在线 - zhique 翻译,xxmen 校稿。未经许可,禁止转载! 英文出处:Ram Sriharsha。欢迎加入翻译组。 Apache Spar...

1876
来自专栏杨建荣的学习笔记

生产环境大型sql语句调优实战第一篇(二) (r2笔记32天)

继续昨天的部分,上一篇的链接为: http://blog.itpub.net/23718752/viewspace-1217012/ 对这条大sql的性能瓶颈进...

2496
来自专栏乐沙弥的世界

Oracle 闪回区(Oracle Flash recovery area)

    Oracle闪回区已经有了好几载的岁月了,在10g的时候就被推出一直延续到现在。Oracle闪回区是为RMAN准备的,尽管抛开它我们可以同样完成数据库备...

471
来自专栏数据分析

SQL Server 性能优化之——T-SQL 临时表、表变量、UNION

这次看一下临时表,表变量和Union命令方面是否可以被优化呢? 一、临时表和表变量 很多数据库开发者使用临时表和表变量将代码分解成小块代码来简化复杂的逻辑。但是...

3664
来自专栏乐沙弥的世界

执行计划中各字段各模块描述

      在SQL语句的执行计划中,包含很多字段项和很多模块,其不同字段代表了不同的含义且在不同的情形下某些字段、模块显示或不显示,下 面的描述给出了执行计划...

734
来自专栏乐沙弥的世界

Heap size 80869K exceeds notification threshold (51200K)

      前阵子的alert日志获得了所需堆尺寸的大小超出指定阙值的提示,即Heap size 80869K exceeds notification thr...

793
来自专栏杨建荣的学习笔记

11g主库归档自动删除的小问题分析 (r8笔记第1天)

最近在无疑中查看一个数据库的日志的时候,发现里面有这么一段内容。 Sat Feb 06 10:07:25 2016 Deleted Oracle manag...

32911
来自专栏ASP.NET MVC5 后台权限管理系统

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]

似乎我们需要更多的模块了,我们有一个样例程序,可以帮助我们以后的系统开发做很多对照,我们稍后还有系统日志和系统异常的记录,这时浏览发生了困难,我们这一节来完成一...

2539
来自专栏k8s

k8s-组件-apiserver

K8s-apiserver组件是k8s集群核心组件,所有其他组件均需要与apiserver进行交互。apiserver提供rest服务,并对k8s资源进行操作。

3552
来自专栏hbbliyong

C#读取“我的文档”等特殊系统路径及环境变量

返回“我的文档”路径字符串 Environment.GetFolderPath(Environment.SpecialFolder.Personal) ? 本技...

3308

扫码关注云+社区