• 通用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 $@ -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
  • 相关阅读:
    穷举 迭代 while
    for 循环
    switch case
    if else 语句
    数据类型
    语句的输入、输出
    控件——DataGridview
    mysql-bin.000001文件的来源及处理方法
    /var/log目录下的20个Linux日志文件功能详解
    CountDownLatch
  • 原文地址:https://www.cnblogs.com/wangzming/p/11494520.html
Copyright © 2020-2023  润新知