123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- # -*- mode: makefile; -*-
- # Copyright The OpenTelemetry Authors
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- # This Makefile.protos has rules to generate go code for otlp
- # exporter. It does it by copying the proto files from
- # `exporters/otlp/internal/opentelemetry-proto` (which is a
- # submodule that needs to be checked out) into `gen/proto`, changing
- # the go_package option to a valid string, generating the go files and
- # finally copying the files into the module. The files are not
- # generated in place, because protoc generates a too-deep directory
- # structure.
- #
- # Currently, all the generated code is in
- # `exporters/otlp/internal/opentelemetry-proto-gen`.
- #
- # Prereqs: wget (for downloading the zip file with protoc binary),
- # unzip (for unpacking the archive), rsync (for copying back the
- # generated files).
-
- PROTOC_VERSION := 3.14.0
-
- TOOLS_DIR := $(abspath ./.tools)
- TOOLS_MOD_DIR := ./internal/tools
- PROTOBUF_VERSION := v1
- OTEL_PROTO_SUBMODULE := exporters/otlp/internal/opentelemetry-proto
- GEN_TEMP_DIR := gen
- SUBMODULE_PROTO_FILES := $(wildcard $(OTEL_PROTO_SUBMODULE)/opentelemetry/proto/*/$(PROTOBUF_VERSION)/*.proto) $(wildcard $(OTEL_PROTO_SUBMODULE)/opentelemetry/proto/collector/*/$(PROTOBUF_VERSION)/*.proto)
-
- ifeq ($(strip $(SUBMODULE_PROTO_FILES)),)
- $(error Submodule at $(OTEL_PROTO_SUBMODULE) is not checked out, use "git submodule update --init")
- endif
-
- PROTOBUF_GEN_DIR := exporters/otlp/internal/opentelemetry-proto-gen
- PROTOBUF_TEMP_DIR := $(GEN_TEMP_DIR)/pb-go
- PROTO_SOURCE_DIR := $(GEN_TEMP_DIR)/proto
- SOURCE_PROTO_FILES := $(subst $(OTEL_PROTO_SUBMODULE),$(PROTO_SOURCE_DIR),$(SUBMODULE_PROTO_FILES))
-
- .DEFAULT_GOAL := protobuf
-
- UNAME_S := $(shell uname -s)
- UNAME_M := $(shell uname -m)
-
- ifeq ($(UNAME_S),Linux)
-
- PROTOC_OS := linux
- PROTOC_ARCH := $(UNAME_M)
-
- else ifeq ($(UNAME_S),Darwin)
-
- PROTOC_OS := osx
- PROTOC_ARCH := x86_64
-
- endif
-
- PROTOC_ZIP_URL := https://github.com/protocolbuffers/protobuf/releases/download/v$(PROTOC_VERSION)/protoc-$(PROTOC_VERSION)-$(PROTOC_OS)-$(PROTOC_ARCH).zip
-
- $(TOOLS_DIR)/PROTOC_$(PROTOC_VERSION):
- @rm -f "$(TOOLS_DIR)"/PROTOC_* && \
- touch "$@"
-
- # Depend on a versioned file (like PROTOC_3.14.0), so when version
- # gets bumped, we will depend on a nonexistent file and thus download
- # a newer version.
- $(TOOLS_DIR)/protoc/bin/protoc: $(TOOLS_DIR)/PROTOC_$(PROTOC_VERSION)
- echo "Fetching protoc $(PROTOC_VERSION)" && \
- rm -rf $(TOOLS_DIR)/protoc && \
- wget -O $(TOOLS_DIR)/protoc.zip $(PROTOC_ZIP_URL) && \
- unzip $(TOOLS_DIR)/protoc.zip -d $(TOOLS_DIR)/protoc-tmp && \
- rm $(TOOLS_DIR)/protoc.zip && \
- touch $(TOOLS_DIR)/protoc-tmp/bin/protoc && \
- mv $(TOOLS_DIR)/protoc-tmp $(TOOLS_DIR)/protoc
-
- $(TOOLS_DIR)/protoc-gen-gogofast: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go
- cd $(TOOLS_MOD_DIR) && \
- go build -o $(TOOLS_DIR)/protoc-gen-gogofast github.com/gogo/protobuf/protoc-gen-gogofast && \
- go mod tidy
-
- # Return a sed expression for replacing the go_package option in proto
- # file with a one that's valid for us.
- #
- # Example: $(call get-sed-expr,$(PROTOBUF_GEN_DIR))
- define get-sed-expr
- 's,go_package = "github.com/open-telemetry/opentelemetry-proto/gen/go,go_package = "go.opentelemetry.io/otel/$(1),'
- endef
-
- .PHONY: protobuf
- protobuf: protobuf-source gen-protobuf copy-protobufs
-
- .PHONY: protobuf-source
- protobuf-source: $(SOURCE_PROTO_FILES)
-
- # This copies proto files from submodule into $(PROTO_SOURCE_DIR),
- # thus satisfying the $(SOURCE_PROTO_FILES) prerequisite. The copies
- # have their package name replaced by go.opentelemetry.io/otel.
- $(PROTO_SOURCE_DIR)/%.proto: $(OTEL_PROTO_SUBMODULE)/%.proto
- @ \
- mkdir -p $(@D); \
- sed -e $(call get-sed-expr,$(PROTOBUF_GEN_DIR)) "$<" >"$@.tmp"; \
- mv "$@.tmp" "$@"
-
- .PHONY: gen-protobuf
- gen-protobuf: $(SOURCE_PROTO_FILES) $(TOOLS_DIR)/protoc-gen-gogofast $(TOOLS_DIR)/protoc/bin/protoc
- @ \
- mkdir -p "$(PROTOBUF_TEMP_DIR)"; \
- set -e; for f in $^; do \
- if [[ "$${f}" == $(TOOLS_DIR)/* ]]; then continue; fi; \
- echo "protoc $${f#"$(PROTO_SOURCE_DIR)/"}"; \
- PATH="$(TOOLS_DIR):$${PATH}" $(TOOLS_DIR)/protoc/bin/protoc --proto_path="$(PROTO_SOURCE_DIR)" --gogofast_out="plugins=grpc:$(PROTOBUF_TEMP_DIR)" "$${f}"; \
- done
-
- .PHONY: copy-protobufs
- copy-protobufs:
- @rsync -a $(PROTOBUF_TEMP_DIR)/go.opentelemetry.io/otel/exporters .
-
- .PHONY: clean
- clean:
- rm -rf $(GEN_TEMP_DIR)
|