通用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 "表示就能夠了.linux

make --trace選項能夠打印編譯過程。編譯的過程是依賴以下: make all -> OBJS ->SRC -> PROTOFILEc++

II.shell

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制定編譯結果的目錄。ruby

Referencesbabel

https://yq.aliyun.com/articles/653475
相關文章
相關標籤/搜索