Skip to content

Commit

Permalink
simplify Makefile
Browse files Browse the repository at this point in the history
- use git to check for out-of-date generated files, avoids all the temp files and manual diff in the Makefile.
- not specify version for protoc-gen-go, it will use the version from go.mod
- do not copy over the protoc binary. Call it directly from unzipped path. So it can find the includes automatically, and we don't need the -I or --go_opts=Mxxx flags.
- use paths=source_relative to generate go files directly into destination, avoid the copy.
- simplify the sed command used to extract "csi.proto" file.
  • Loading branch information
huww98 committed Feb 29, 2024
1 parent 88a5080 commit 4421b74
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 68 deletions.
1 change: 1 addition & 0 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ jobs:
run: |
touch spec.md # Ensure its timestamp is newer than any generated files
make
git diff --exit-code || (echo "Generated files are out of date. Please run 'make' and commit the changes." && exit 1)
37 changes: 8 additions & 29 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,22 @@ CSI_SPEC := spec.md
CSI_PROTO := csi.proto
## Build go language bindings
CSI_A := csi.a
CSI_GO := lib/go/csi/csi.pb.go
CSI_PKG := lib/go/csi

# This is the target for building the temporary CSI protobuf file.
#
# The temporary file is not versioned, and thus will always be
# built on GitHub Actions.
$(CSI_PROTO).tmp: $(CSI_SPEC) Makefile
echo "// Code generated by make; DO NOT EDIT." > "$@"
cat $< | sed -n -e '/```protobuf$$/,/^```$$/ p' | sed '/^```/d' >> "$@"

# This is the target for building the CSI protobuf file.
#
# This target depends on its temp file, which is not versioned.
# Therefore when built on GitHub Actions the temp file will always
# be built and trigger this target. On GitHub Actions the temp file
# is compared with the real file, and if they differ the build
# will fail.
#
# Locally the temp file is simply copied over the real file.
$(CSI_PROTO): $(CSI_PROTO).tmp
ifeq (true,$(GITHUB_ACTIONS))
diff "$@" "$?"
else
cp -f "$?" "$@"
endif
$(CSI_PROTO): $(CSI_SPEC) Makefile
echo "// Code generated by make; DO NOT EDIT." > "$@"
sed -n -e '/```protobuf$$/,/^```$$/ {//!p;}' $< >> "$@"

build: check build_cpp build_go

build_cpp:
$(MAKE) -C lib/cxx

# The file exists, but could be out-of-date.
$(CSI_GO): $(CSI_PROTO)
$(MAKE) -C lib/go csi/csi.pb.go
$(CSI_PKG)/%.pb.go: $(CSI_PROTO)
$(MAKE) -C lib/go

$(CSI_A): $(CSI_GO)
$(CSI_A): $(CSI_PKG)/*.go
go mod download
go install ./$(CSI_PKG)
go build -o "$@" ./$(CSI_PKG)
Expand All @@ -53,10 +32,10 @@ clean:

clobber: clean
$(MAKE) -C lib/go $@
rm -f $(CSI_PROTO) $(CSI_PROTO).tmp
rm -f $(CSI_PROTO)

# check generated files for violation of standards
check: $(CSI_PROTO)
awk '{ if (length > 72) print NR, $$0 }' $? | diff - /dev/null

.PHONY: clean clobber check csi_go build_go build_cpp
.PHONY: clean clobber check build_go build_cpp
55 changes: 16 additions & 39 deletions lib/go/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,22 +41,24 @@ else ifeq (arm64,$(PROTOC_ARCH))
PROTOC_ARCH := aarch_64
endif

PROTOC := ./protoc
PROTOC_ZIP := protoc-$(PROTOC_VER)-$(PROTOC_OS)-$(PROTOC_ARCH).zip
PROTOC_URL := https://github.com/protocolbuffers/protobuf/releases/download/v$(PROTOC_VER)/$(PROTOC_ZIP)
PROTOC_TMP_DIR := .protoc
PROTOC_TMP_BIN := $(PROTOC_TMP_DIR)/bin/protoc
PROTOC := $(PROTOC_TMP_DIR)/bin/protoc

$(GOBIN)/protoc-gen-go: ../../go.mod
go install google.golang.org/protobuf/cmd/protoc-gen-go
$(GOBIN)/protoc-gen-go-grpc:
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0

$(PROTOC):
-go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.32.0 && \
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0 && \
mkdir -p "$(PROTOC_TMP_DIR)" && \
-mkdir -p "$(PROTOC_TMP_DIR)" && \
curl -L $(PROTOC_URL) -o "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" && \
unzip "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" -d "$(PROTOC_TMP_DIR)" && \
chmod 0755 "$(PROTOC_TMP_BIN)" && \
cp -f "$(PROTOC_TMP_BIN)" "$@"
chmod 0755 "$@"
stat "$@" > /dev/null 2>&1

PROTOC_ALL := $(GOBIN)/protoc-gen-go $(GOBIN)/protoc-gen-go-grpc $(PROTOC)

########################################################################
## PATH ##
Expand All @@ -71,49 +73,24 @@ export PATH := $(GOBIN):$(PATH)
## BUILD ##
########################################################################
CSI_PROTO := ../../csi.proto
CSI_PKG_ROOT := github.com/container-storage-interface/spec
CSI_PKG_SUB := $(shell cat $(CSI_PROTO) | sed -nE -e 's/^package.([^;]*).v[0-9]+;$$/\1/p'|tr '.' '/')
CSI_BUILD := $(CSI_PKG_SUB)/.build
CSI_PKG_SUB := csi
CSI_GO := $(CSI_PKG_SUB)/csi.pb.go
CSI_GRPC := $(CSI_PKG_SUB)/csi_grpc.pb.go
CSI_GRPC_TMP := $(CSI_BUILD)/$(CSI_PKG_ROOT)/lib/go/$(CSI_PKG_SUB)/csi_grpc.pb.go
CSI_GO_TMP := $(CSI_BUILD)/$(CSI_PKG_ROOT)/lib/go/$(CSI_PKG_SUB)/csi.pb.go

# This recipe generates the go language bindings to a temp area.
$(CSI_GO_TMP) $(CSI_GRPC_TMP): INCLUDE := -I../.. -I$(PROTOC_TMP_DIR)/include
$(CSI_GO_TMP) $(CSI_GRPC_TMP): $(CSI_PROTO) | $(PROTOC)
# This recipe generates the go language bindings
$(CSI_GO) $(CSI_GRPC): $(CSI_PROTO) $(PROTOC_ALL)
@mkdir -p "$(@D)"
$(PROTOC) $(INCLUDE) --go-grpc_out=$(CSI_BUILD) --go_out=$(CSI_BUILD) \
--go_opt=Mgoogle/protobuf/descriptor.proto=google.golang.org/protobuf/types/descriptorpb \
--go_opt=Mgoogle/protobuf/wrappers.proto=google.golang.org/protobuf/types/known/wrapperspb \
$(PROTOC) -I../.. --go-grpc_out=$(CSI_PKG_SUB) --go_out=$(CSI_PKG_SUB) \
--go_opt=paths=source_relative --go-grpc_opt=paths=source_relative \
"$(<F)"

# The temp language bindings are compared to the ones that are
# versioned. If they are different then it means the language
# bindings were not updated prior to being committed.
$(CSI_GO): $(CSI_GO_TMP)
ifeq (true,$(GITHUB_ACTIONS))
diff "$@" "$?"
else
@mkdir -p "$(@D)"
diff "$@" "$?" > /dev/null 2>&1 || cp -f "$?" "$@"
endif
$(CSI_GRPC): $(CSI_GRPC_TMP)
ifeq (true,$(GITHUB_ACTIONS))
diff "$@" "$?"
else
@mkdir -p "$(@D)"
diff "$@" "$?" > /dev/null 2>&1 || cp -f "$?" "$@"
endif


build: $(CSI_GO) $(CSI_GRPC)

clean:
go clean -i ./...
rm -rf "$(CSI_GO)" "$(CSI_GRPC)" "$(CSI_BUILD)"
rm -rf "$(CSI_PKG_SUB)"

clobber: clean
rm -fr "$(PROTOC)" "$(CSI_PKG_SUB)"
rm -fr "$(PROTOC_TMP_DIR)"

.PHONY: clean clobber

0 comments on commit 4421b74

Please sign in to comment.