summaryrefslogtreecommitdiff
path: root/java.mvn.mk
blob: c044103d5c4c6c68bcf086b89e8a3dc0380cba1e (plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
.SUFFIXES: .java .class

ARTIFACT_ID  != xmllint --xpath "/*[local-name()='project']/*[local-name()='artifactId']/text()" pom.xml
VERSION      != xmllint --xpath "/*[local-name()='project']/*[local-name()='version']/text()"    pom.xml
JAVA_VERSION != xmllint --xpath "/*[local-name()='project']/*[local-name()='properties']/*[local-name()='maven.compiler.release']/text()"    pom.xml

JC           = JAVA_VERSION=${JAVA_VERSION} javac
MVN          = mvn
JAVA         = JAVA_VERSION=${JAVA_VERSION} java -classpath `cat .classpath`
JDB          = jdb

# Directories
BUILD_DIR    = target
CLASSES_DIR      = ${BUILD_DIR}/classes
TEST_CLASSES_DIR = ${BUILD_DIR}/test-classes
SRC_PATH         = src
MAIN_SRC_PATH    = ${SRC_PATH}/main/java
TEST_SRC_PATH    = ${SRC_PATH}/test/java
LIB_DIR          = ${BUILD_DIR}/libs

JAR          = ${BUILD_DIR}/${ARTIFACT_ID}-${VERSION}.jar
MVN_FLAGS    =
DBG_PORT     = 1044

MAIN_SRC    != find ${MAIN_SRC_PATH} -name '*.java'
TEST_SRC    != [ -d ${TEST_SRC_PATH} ] && find ${TEST_SRC_PATH} -name '*.java'

MAIN_OBJ    != echo ${MAIN_SRC} | sed -E 's|${MAIN_SRC_PATH}|${CLASSES_DIR}|g' \
	| sed 's|\.java|\.class|g'
TEST_OBJ    != echo ${TEST_SRC} | sed -E 's|${TEST_SRC_PATH}|${TEST_CLASSES_DIR}|g' \
	| sed 's|\.java|\.class|g'

DBG_PORT     = 1044
DBG_FLAGS    = -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${DBG_PORT}

all: ${CLASSES_DIR} .classpath ${MAIN_OBJ} ${TEST_OBJ} ${LIB_DIR}

dist: ${LIB_DIR} ${BUILD_DIR}/dist/${NAME}.sh

${BUILD_DIR}/dist:
	@mkdir -p ${BUILD_DIR}/dist
	@cp -R ${CLASSES_DIR}/* ${BUILD_DIR}/dist/
	@cp -R ${LIB_DIR} ${BUILD_DIR}/dist/

${BUILD_DIR}/dist/${NAME}.sh: ${BUILD_DIR}/dist .main-class
	@echo '#!/bin/sh' > $@
	@echo '' >> $@
	@echo 'BASEDIR=$$(dirname $$(realpath $$0))' >> $@
	@echo 'java -classpath $$BASEDIR:$$BASEDIR/libs/* '`cat .main-class`' $$@' >> $@
	@echo '' >> $@
	@chmod +x $@

${CLASSES_DIR}:
	@mkdir -p $@
	${JC} -classpath `cat .classpath` `find ${SRC_PATH} -name '*.java'`

run: .classpath .main-class
	${JAVA} `cat .main-class` ${ARGS}

debug: .classpath .main-class
	${JAVA} ${DBG_FLAGS} `cat .main-class` ${ARGS}

debugger:
	${JDB} -sourcepath ${MAIN_SRC_PATH} -attach ${DBG_PORT}

${LIB_DIR}: pom.xml
	${MVN} install dependency:copy-dependencies -DexcludeScope=provided -DoutputDirectory=${BUILD_DIR}/libs

.main-class:
	@echo ${MAIN_SRC} | tr ' ' '\n' | fzf | sed -E 's/.*java\/(.*)\.java/\1/g' | tr '/' '.' > $@

.classpath: pom.xml
	${MVN} ${MVN_FLAGS} dependency:build-classpath -Dmdep.outputFile=$@
	@echo -n ':'target/classes >> $@

.classes: ${MAIN_SRC}
	for jar in `cat .classpath | tr ':' '\n' | grep -E '\.jar$$'`; do \
		jar tvf $$jar | awk '{ print $$8 }'; \
	done | grep -E '\.class$$' | grep -v package-info.class | sed -E 's/\$$[0-9]*//g' | sort | uniq > $@
	@echo ${MAIN_SRC} | tr ' ' '\n' >> $@

clean:
	@rm -rf ${BUILD_DIR}
	@find ${SRC_PATH} -name '*.class' -exec rm -f {} \;

buildmk:
	@for i in `find src -name *.java`; do \
		echo -n $$i | sed -E 's/^src\/main\/java(.*).java/target\/classes\1\.class: /g' | sed -E 's/^src\/test\/java(.*).java/target\/test-classes\1\.class: /g'; \
		echo $$i; \
		echo -n '	$${JC} -classpath `cat .classpath` '; \
		echo $$i; \
		echo '	mkdir -p `dirname $$@`'; \
		echo -n '	mv ';\
		echo $$i | sed 's/\.java$$/.class $$@/g'; \
		echo ''; \
	done > objs.mk

.tags:
	exctags -Rnf $@

.java.class:
	${JC} -classpath `cat .classpath` $<

${MAIN_OBJ}: ${MAIN_SRC} ${TEST_SRC}
	@mkdir -p ${CLASSES_DIR}
	@make `echo $@ | sed -E 's|${CLASSES_DIR}|${MAIN_SRC_PATH}|g'`
	@mkdir -p `dirname $@`
	@cp `echo $@ | sed -E 's|${CLASSES_DIR}|${MAIN_SRC_PATH}|g'` $@

${TEST_OBJ}: ${MAIN_SRC} ${TEST_SRC}
	@mkdir -p ${CLASSES_DIR}
	@make `echo $@ | sed -E 's|${TEST_CLASSES_DIR}|${TEST_SRC_PATH}|g'`
	@mkdir -p `dirname $@`
	@cp `echo $@ | sed -E 's|${TEST_CLASSES_DIR}|${TEST_SRC_PATH}|g'` $@