.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: .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 $@ 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'` $@