Skip to content

Instantly share code, notes, and snippets.

@positron
Created February 13, 2025 04:25
Show Gist options
  • Save positron/e10752bb0c7ea893e562a8560d339a59 to your computer and use it in GitHub Desktop.
Save positron/e10752bb0c7ea893e562a8560d339a59 to your computer and use it in GitHub Desktop.
Make

This doesn't work

The Problem: No Timestamp Comparison for Generated Files: The rules for $(STYX_SUBSCRIBER_PROTO_JAVA_SRC) and $(STYX_READER_PROTO_JAVA_SRC) specify the .proto files as prerequisites, but the targets themselves are lists of files, for example:

STYX_READER_PROTO_JAVA_SRC = \
	java-src/gen/styx/reader/StyxReader.java \
	java-src/gen/styx/reader/FIBGrpc.java

Make does not expand wildcards in the target name, so the target is literally the string java-src/gen/styx/reader/StyxReader.java java-src/gen/styx/reader/FIBGrpc.java

JAVA_TIMESTAMP_FILE = .java-build-timestamp
STYX_SUBSCRIBER_PROTO_SRC = proto/styx.proto
STYX_READER_PROTO_SRC = proto/styx-reader.proto
STYX_SUBSCRIBER_PROTO_JAVA_SRC = \
java-src/gen/styx/subscriber/StyxReader.java \
java-src/gen/styx/subscriber/FIBGrpc.java
STYX_READER_PROTO_JAVA_SRC = \
java-src/gen/styx/reader/StyxReader.java \
java-src/gen/styx/reader/FIBGrpc.java
PROTOC_GEN_GRPC_JAVA := $(shell which protoc-gen-grpc-java)
# Check if the executable was found and error if not
ifeq ($(PROTOC_GEN_GRPC_JAVA),)
$(error protoc-gen-grpc-java not found in PATH)
endif
PROTOC_CMD=protoc --plugin=protoc-gen-grpc-java=$(PROTOC_GEN_GRPC_JAVA) \
--java_out=java-src \
--grpc-java_out=java-src \
--proto_path=proto
$(STYX_READER_PROTO_JAVA_SRC): $(STYX_READER_PROTO_SRC)
mkdir -p java-src
$(PROTOC_CMD) $<
$(STYX_SUBSCRIBER_PROTO_JAVA_SRC): $(STYX_SUBSCRIBER_PROTO_SRC)
mkdir -p java-src
$(PROTOC_CMD) $<
# Use marker file, both for ease of making this makefile and because it generates dozens of files
java: $(JAVA_TIMESTAMP_FILE)
$(JAVA_TIMESTAMP_FILE): $(STYX_SUBSCRIBER_PROTO_JAVA_SRC) $(STYX_READER_PROTO_JAVA_SRC)
@echo "Building java sources"
clj -T:build compile-java
@touch $(JAVA_TIMESTAMP_FILE)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment