1#
2# Makefile to build the Polo library
3#
4
5# Main target
6#   polo:        creates a jar containing the protocol (default)
7#   poloJava:    compiles the java sources
8#   proto:       compiles the protocol buffers
9
10.PHONY: proto polo poloJava clean cleanProto default
11
12default: polo
13
14###############
15# DEFINITIONS #
16###############
17# Sources top directory
18JAVA_SRC_TOP := src
19
20# Package name
21PACKAGE_NAME := com/google/polo
22
23# Complete path to sources
24JAVA_SRC_DIR := $(JAVA_SRC_TOP)/$(PACKAGE_NAME)
25
26JAVA_SRC := $(shell find $(JAVA_SRC_DIR) -name '*.java')
27
28# .class targets
29JAVA_SRC_CLASSES = $(patsubst %.java,%.class,$(JAVA_SRC))
30
31# Classpath 
32JAVA_CLASSPATH := $(subst jar ,jar:,$(strip "bin:$(wildcard jar/*.jar)"))
33
34# Location to put the generated .class
35JAVA_OUT := bin
36
37# Name for the jar that will be created
38JAR_NAME := polo.jar
39
40####################
41# PROTOCOL BUFFERS #
42####################
43# Sources directory for protocols buffers
44PROTO_SRC_DIR := ../proto
45
46# Location for the java files generated by the proto compiler
47PROTO_JAVA_OUT := proto_out
48
49# Creates the needed directories
50$(PROTO_JAVA_OUT) $(JAVA_OUT):
51	-mkdir -p $@
52
53# Definition of the .proto and the corresponding java generated files.
54$(PROTO_JAVA_OUT)/$(PACKAGE_NAME)/wire/protobuf/PoloProto.java: $(PROTO_SRC_DIR)/polo.proto
55	$(genproto)
56
57# All java files generated from proto.
58ALL_GENPROTOS := \
59	$(PROTO_JAVA_OUT)/$(PACKAGE_NAME)/wire/protobuf/PoloProto.java
60
61# Rule to build a .proto in the proto/ directory
62define genproto
63	protoc \
64	  --java_out=$(PROTO_JAVA_OUT) \
65	  -I $(PROTO_SRC_DIR) \
66	  $<
67endef
68
69# Compiles the proto
70proto: $(PROTO_JAVA_OUT) $(ALL_GENPROTOS)
71
72#################
73# JAVA COMPILER #
74#################
75# compiles a java source
76%.class: %.java
77	javac \
78	  -sourcepath "$(JAVA_SRC_TOP):$(PROTO_JAVA_OUT)" \
79	  -classpath $(JAVA_CLASSPATH) \
80	  -d $(JAVA_OUT)/ \
81	  $?
82
83#################
84# PROJECT RULES #
85#################
86# Compiles the java sources for the project
87poloJava: $(JAVA_OUT) proto $(JAVA_SRC_CLASSES)
88
89# Cleans the generated protocol buffers
90cleanProto:
91	-rm -rf $(PROTO_JAVA_OUT)
92
93# Cleans the project
94clean: cleanProto
95	-rm -rf $(JAVA_OUT)
96	-rm $(JAR_NAME)
97
98# Complete and clean build of the project returns a jar.
99polo: clean poloJava
100	jar cf $(JAR_NAME) -C $(JAVA_OUT) $(shell ls $(JAVA_OUT))
101