通用protoc Makefile

背景Makefile 不仅可以用来编译链接gcc程序,还可以根据自己的需要用指定命令处理项目中的文件。例如protoc,babel(js编译),meta数据的生成等。CMake可以完成这些内容,不过单纯的Makefile也可以适当编写达到比较好的效果。下面是两个用protoc通过proto文件编译生成pb.cc和pb.h文件的代码。需要在linux下安装protoc。I.来自Reference 1,经过裁剪
CXX=g++
ifeq ($(ver),debug)
CXXFLAGS=-std=c++11 -Wall -Wextra -g -O0 -DDEBUG
else
CXXFLAGS=-std=c++11 -Wall #-Wextra
endif
BIN=project

# 除去隐藏目录
ALLDIR=$(shell find . -type d | grep -E ‘/\.|proto|test‘ -v)
SRCS=$(foreach DIR,$(ALLDIR), $(wildcard $(DIR)/*.cpp))
OBJS=$(patsubst %.cpp,%.o, $(SRCS))
PROTODIR=$(shell find . -type d | grep -E ‘/proto$$‘)
PROTOFILE=$(wildcard $(PROTODIR)/*.proto)
PROTOSRC=$(patsubst %.proto,%.pb.cc,$(PROTOFILE)) #$(patsubst %.proto,%.grpc.pb.cc,$(PROTOFILE))
PROTOHEAD=$(patsubst %.cc,%.h,$(PROTOSRC))
PROTOOBJS=$(patsubst %.cc,%.o, $(PROTOSRC))

ALL: $(PROTOOBJS) $(OBJS)
        # $(CXX) $(CXXFLAGS) -o $(BIN) $^  -pthread -lprotobuf #-lgrpc++

%.o: %cc %.cpp
        $(CXX) $(CXXFLAGS) -o [email protected] -c $<

$(PROTOSRC): $(PROTOFILE)
        #cd $(PROTODIR);protoc --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` $(notdir $(PROTOFILE))
        cd $(PROTODIR);protoc --cpp_out=. $(notdir $(PROTOFILE))

说明:patsubst是模式替换函数(返回替换后的列表),wildcard是通配符函数(返回列表),$()表达式里如果要嵌套一个其他变量var,也用 "$var "表示就可以了.

make --trace选项可以打印编译过程。编译的过程是依赖如下: make all -> OBJS ->SRC -> PROTOFILE

II.

PROTO_CC :=  protoc
INCLUDE  :=  ../include
PROTO_FLAGS := --cpp_out=$(INCLUDE)

PROTO__SOURCES := $(wildcard *.proto)
obj-y          := $(PROTO__SOURCES:%.proto=$(INCLUDE)/%.pb.cc)
obj-y          += $(PROTO__SOURCES:%.proto=$(INCLUDE)/%.pb.h)

OBJECT      := #unused
##############################
#  change OBJECT to set execute file name
##############################

all : $(obj-y)

.PHONY: all
$(INCLUDE)/%.pb.cc: %.proto
        $(PROTO_CC) $(PROTO_FLAGS) $^
        @echo ‘generate file‘ $@

clean:
        rm -f $(obj-y)

 更简单的版本如上,只生成对应pb文件,通过INCLUDE制定编译结果的目录。

References

https://yq.aliyun.com/articles/653475

原文地址:https://www.cnblogs.com/wangzming/p/11494520.html

时间: 2024-10-16 05:10:29

通用protoc Makefile的相关文章

linux下面简单通用的Makefile模板

简单通用的Makefile模板: ############################################## # # 单目录通用Makefile # 目标文件可自己的设定 # 始须调试程序,修改 CFLAGS 变量为-Wall -g # # wuyq 20140825 ############################################## # EXECUTABLE为目标的可执行文件名, 可以根据具体的情况对其进行修改. EXECUTABLE := spi

Linux C编程学习4---多文件项目管理、Makefile、一个通用的Makefile

GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相应的更新.如果通过手动去完成这个工作的话,对于小型的项目可能还行,但是对于比较大型的项目就几乎是不可能的. 因此Linux 系统提供了一个自动维护和生成目标程序的工具 make,它可以根据各个模块的更改情况去重新编译连接目标代码 Make 工具的作用就是实现编译连接过程的自动化.它定义了一种语言,用

一个通用的Makefile (转)

据http://bbs.chinaunix.net/thread-2300778-1-1.html的讨论,发现还是有很多人在问通用Makefile的问题,这里做一个总结.也作为以后的参考. 笔者在写程序的时候会遇到这样的烦恼:一个项目中可能会有很多个应用程序,而新建一个应用程序则所有的Makefile都要重写一遍,虽然可以部分的粘帖复制,但还是感觉应该找到更好的解决途径:另外当一个应用程序中包含多个文件夹时通常要在每个目录下创建一个Makefile,当有数十个文件夹时,要创建如此多的Makefi

一个通用的Makefile

一 makefile的作用 Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信 息,在make时会决定在链接的时候需要重新编译哪些文件.Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件.当那些依赖文件有了改变,编译器会自动发现最终的生成文件已经过时,而应该重新编译相应的模块. makefile带来的好处就是—"自动化编译",一旦写好,只需要

编写一个通用的Makefile文件

1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe 1.2体验在VC下程序的编译 a.先编译,在链接 b.修改了哪个文件,就单独编译此文件,在链接 c.修改了哪个头文件,就单独编译使用该头文件的源文件,在链接 1.3在linux下实现上述要求 2.编写一个测试的Makefile 2.1直接编译链接 1 gcc -o test a.c b.c 缺点:改变其中一

一步一步写一个简单通用的makefile(三)

上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hellomake #Magnum, 2014-10-20 # 指令编译器和选项 CC=gcc CFLAGS=-Wall # 需要链接库的库名,比如libm.a,就是-lm,需要去掉前面的lib和后面的.a LIBS=-lm # 设置默认搜索头文件的路径,优先是这个,然后是系统路径 IncludeDir

Ubuntu下比较通用的makefile实例

本文转自http://blog.chinaunix.net/uid-20608849-id-360294.html 笔者在写程序的时候会遇到这样的烦恼:一个项目中可能会有很多个应用程序,而新建一个应用程序则所有的Makefile都要重写一遍,虽然可以部分的粘帖复制,但还是感觉应该找到更好的解决途径:另外当一个应用程序中包含多个文件夹时通常要在每个目录下创建一个Makefile,当有数十个文件夹时,要创建如此多的Makefile也是不胜其烦.那么为什么不用automake呢,诚然,对于一个很大的工

如何编写一个工程文件夹下通用的Makefile

新建工程文件夹,在里面新建 bsp.imx6ul.obj 和project 这 3 个文件夹,完成以后如图所示: 新建的工程根目录文件夹 其中 bsp 用来存放驱动文件:imx6ul 用来存放跟芯片有关的文件,比如 NXP 官方的 SDK库文件:obj 用来存放编译生成的.o 文件:project 存放 start.S 和 main.c 文件,也就是应用文件:将十二章实验中的 cc.h.fsl_common.h.fsl_iomuxc.h 和 MCIMX6Y2.h 这四个文件拷贝到文件夹 imx6

一个平时写程序通用的Makefile样例

//需要目标名和程序名字相同 .PHONY:clean all //伪目标 CC=gcc CFLAGS=-Wall -g BIN= //目标 all:$(BIN) %.o:%.c $(CC) $(CFLAGS) -c $< -o [email protected] clean: rm -f *.o $(BIN) 平时写程序肯定需要反复的修改,有了这样一个makefile程序会方便很多的.动手试一下.