zoukankan      html  css  js  c++  java
  • 通用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
  • 相关阅读:
    使用 asp.net mvc和 jQuery UI 控件包
    ServiceStack.Redis 使用教程
    HTC T8878刷机手册
    Entity Framework CodeFirst 文章汇集
    2011年Mono发展历程
    日志管理实用程序LogExpert
    使用 NuGet 管理项目库
    WCF 4.0路由服务Routing Service
    精进不休 .NET 4.0 (1) asp.net 4.0 新特性之web.config的改进, ViewStateMode, ClientIDMode, EnablePersistedSelection, 控件的其它一些改进
    精进不休 .NET 4.0 (7) ADO.NET Entity Framework 4.0 新特性
  • 原文地址:https://www.cnblogs.com/wangzming/p/11494520.html
Copyright © 2011-2022 走看看