make-java

An attempt to build java project using Makefiles

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
JAVAC ?= javac
SCALAC ?= scalac
JAR ?= jar

JAVA ?= java
SCALA ?= scala

TARGET_MAIN = myjavaprogram.Main

# Repos
MAVEN = https://repo1.maven.org/maven2

JVM_TARGET_VESRION ?= 1.8
LIB_DIR ?= out/lib
BIN_DIR ?= out/bin

ifeq ($(OS),Windows_NT)
	RM = del /s /q
	# TODO check whether it's working
	RMDIR = rmdir /s /q
	MKDIR = mkdir
else
	RM = rm -rf
	RMDIR = rm -rf
	MKDIR = mkdir -p
endif
DOWNLOAD = curl -fLs
FINAL_PROGRAM = $(PROGRAM)-$(VERSION)

empty:=
space := $(empty) $(empty)
$(space) := $(space)

LIBS = $(wildcard $(LIB_DIR)/*.jar)

JARFILES := $(foreach DEP, $(DEPS), \
	   $(subst :,-,$(notdir $(DEP).jar)) \
)

pkgver = $(lastword $(subst :,$(space), $(1)))

pkgname = $(firstword $(subst :, $(space), $(1)))

maven_url = $(MAVEN)/$(call pkgname, $(1))/$(call pkgver, $(1))/$(notdir $(call pkgname, $(1)))-$(call pkgver, $(1)).jar

jarfile = $(notdir $(subst :,-, $(1))).jar

$(LIB_DIR)/%: setup
	$(info > Downloading '$*' into $(LIB_DIR)/)
	@$(DOWNLOAD) $(call maven_url, $*) --output "$(LIB_DIR)/$(call jarfile, $*)"

CLASSPATH := $(subst $(space),:,$(wildcard $(LIB_DIR)/*.jar))

deps: $(foreach DEP, $(DEPS), $(LIB_DIR)/$(DEP))

%.class: %.scala
	$(SCALAC) $< -sourcepath $(SRC) -classpath $(CLASSPATH) -target:jvm-$(JVM_TARGET_VESRION)

DEPLOY_BIN = $(BIN_DIR)/$(FINAL_PROGRAM)
$(DEPLOY_BIN).jar: $(BIN_DIR)/$(PROGRAM).jar
	$(info > Building '$(DEPLOY_BIN)')
	# $(MKDIR) $(BIN_DIR)/classes
	# $(foreach JARFILES, $(wildcard $(LIB_DIR)/*.jar), \
	# 	cd $(BIN_DIR)/classes; $(JAR) xvf $(realpath $(JARFILES)) \
	# )
	echo "$(SCALA) -classpath "$(CLASSPATH):$(FINAL_PROGRAM).jar" $(TARGET_MAIN) $$*" > $(DEPLOY_BIN)
	cd $(BIN_DIR)/classes; $(JAR) xvf $(realpath $(BIN_DIR)/$(PROGRAM)).jar
	cd $(BIN_DIR)/classes && $(JAR) cvf $(realpath $(DEPLOY_BIN)).jar *
	chmod +x $(DEPLOY_BIN)


$(BIN_DIR)/$(PROGRAM).jar: $(SRC)
	@make setup
	$(info > Building '$(BIN_DIR)/$(PROGRAM)')
	@$(SCALAC) -classpath "${CLASSPATH}" $^ -d $@ -target:jvm-$(JVM_TARGET_VESRION)
	@echo "$(SCALA) -classpath "$(CLASSPATH):$(PROGRAM).jar" $(TARGET_MAIN) $$*" > $(BIN_DIR)/$(PROGRAM)
	@chmod +x $(BIN_DIR)/$(PROGRAM)

deploy: $(BIN_DIR)/$(PROGRAM)-$(VERSION).jar

setup:
	@$(MKDIR) $(BIN_DIR)
	@$(MKDIR) $(LIB_DIR)