aboutsummaryrefslogtreecommitdiff
path: root/_make
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2025-04-27 12:52:15 +0200
committerJonas Smedegaard <dr@jones.dk>2025-04-27 12:55:37 +0200
commitc20aa9d2cf4e85f895f6c02e299d2b8ca176ae2b (patch)
treee63ede83bbb85f4a8d524e9e97cbaf4e99280f2b /_make
parente4a0762c7a2ac3afb8e33bf24fd7495553b5819f (diff)
rewrite make snippet for java
Diffstat (limited to '_make')
-rw-r--r--_make/java.mk117
1 files changed, 93 insertions, 24 deletions
diff --git a/_make/java.mk b/_make/java.mk
index 5e07732..0362192 100644
--- a/_make/java.mk
+++ b/_make/java.mk
@@ -5,42 +5,111 @@
#
# Setup:
# In main Makefile...
-# * set variable PROJECT
-# * set variables PROJECT_FLAVORS CLASSPATHS MODULEPATHS JAVAMODULES
-# if needed
+# * set variable JAVA_PROJECTMODULES, or PROJECT for one simply named
+# * set variable JAVA_MAINCLASSES with at least one main()-method class,
+# where the first one listed will be used by default
+# * set variables JAVA_CLASSPATHS JAVA_MODULEPATHS JAVA_MODULESOURCEPATH
+# JAVA_ROOT JAVA_EXTRACLASSES JAVA_MODULES JAR_FILE
+# if needed,
# * include this make snippet
+#
+# Variables may add suffix _$(PROJECTMODULE), in full or "host-only",
+# e.g. JAVA_MODULES_org.example.mydemo or JAVA_MODULES_mydemo.
-STEMS = $(PROJECT) $(PROJECT_FLAVORS:%=$(PROJECT)%) $(EXTRASTEMS)
-CLASSES = $(STEMS:=.class)
+# defaults overridable at make invocation
+JAVA_ROOT ?= src/main/java
+JAVAC ?= javac
+JAVA ?= java
+JAR ?= jar
# account for one annoyingly popular class of non-POSIX system
_java_path_separator := $(if $(filter Windows%,$($(shell uname))),;,:)
_java_module_separator = ,
-_java_flag = $(if $2,--$1 $(subst $() ,$3,$(strip $2)))
+# expansions optionally stem- or last-word-of-stem-based
+# first try fully suffixed, then "host"-suffixed, then bare variable
+_java_projvar = $(strip $(foreach v,$1,$(or \
+ $(if $(or $2,$*),$(or \
+ $(value $v_$(or $2,$*)),\
+ $(value $v_$(lastword $(subst ., $(),$(or $2,$*)))))),\
+ $(value $v))))
+_java_root = $(call _java_projvar,JAVA_ROOT)
+_java_flag = $(eval x = $(call _java_projvar,$2))$(strip $(if $4$x$5,\
+ --$1 $(subst $() ,$(value _java_$3_separator),$(strip $4 $x $5))))
_java_common_flags = $(strip \
- $(call _java_flag,class-path,$(CLASSPATHS),$(_java_path_separator)) \
- $(call _java_flag,module-path,$(MODULEPATHS),$(_java_path_separator)) \
- $(call _java_flag,add-modules,$(JAVAMODULES),$(_java_module_separator)))
+ $(call _java_flag,class-path,JAVA_CLASSPATHS,path) \
+ $(call _java_flag,module-path,JAVA_MODULEPATHS,path) \
+ $(call _java_flag,add-modules,JAVA_MODULES,module))
+_java_projects_main = $(strip \
+ $(foreach p,$(JAVA_PROJECTMODULES),\
+ $(if $(call _java_projvar,JAVA_MAINCLASSES,$p),$p)))
+_java_projects_extra = $(strip \
+ $(foreach p,$(JAVA_PROJECTMODULES),\
+ $(foreach c,$($wordlist 1,9,$(call _java_projvar,JAVA_MAINCLASSES,$p),\
+ $p:$c))))
-# defaults overridable at make invocation
-JAVAC ?= javac
-JAVA ?= java
-JAVACFLAGS ?= $(strip $(_java_common_flags) -Xlint -Xdoclint -implicit:none)
-JAVAFLAGS ?= $(strip $(_java_common_flags))
+# TODO: formally define a builddir, and drop that on clean
+#clean::
+# rm -f $(CLASSES)
+
+$(JAVA_PROJECTMODULES:%=build-%): build-%:
+ rm -rf mods/$*
+ $(JAVAC) $(strip \
+ $(call _java_flag,module-source-path,JAVA_MODULESOURCEPATH) \
+ $(_java_common_flags) -Xlint -Xdoclint -implicit:none \
+ $(call _java_projvar,JAVACFLAGS) \
+ -d mods/$* \
+ $(wildcard $(_java_root)/module-info.java) \
+ $(foreach c,\
+ $(call _java_projvar,JAVA_MAINCLASSES JAVA_EXTRACLASSES),\
+ $(_java_root)/$(subst .,/,$*)/$c.java))
-all:: run-$(PROJECT)
+$(JAVA_PROJECTMODULES:%=check-%): check-%:
+ checkstyle -c _checkstyle/checks.xml $(strip \
+ $(foreach c,\
+ $(call _java_projvar,JAVA_MAINCLASSES JAVA_EXTRACLASSES),\
+ $(_java_root)/$(subst .,/,$*)/$c.java))
-clean::
- rm -f $(CLASSES)
+$(JAVA_PROJECTMODULES:%=jar-%): jar-%: build-%
+ $(JAR) --create $(strip \
+ --file $(or $(call _java_projvar,JAR_FILE),$*.jar) \
+ $(addprefix --main-class $*.,\
+ $(firstword $(call _java_projvar,JAVA_MAINCLASSES))) \
+ $(call _java_projvar,JARFLAGS) \
+ -C mods/$* .)
-$(STEMS:%=check-%): check-%:
- checkstyle -c ./_checkstyle/checks.xml $*.java
+$(addprefix runsrc-,$(_java_projects_main)): runsrc-%:
+ $(strip \
+ $(call _java_projvar,JAVA_RUNTIME_ENV) \
+ $(JAVA) \
+ $(_java_common_flags) \
+ $(call _java_projvar,JAVAFLAGS) \
+ $(patsubst %,$(_java_root)/$(subst .,/,$*)/%.java,\
+ $(firstword $(call _java_projvar,JAVA_MAINCLASSES))) \
+ $(call _java_projvar,JAVA_RUNTIME_ARGS))
-$(STEMS:%=run-%): run-%: %.class
- $(or $(RUNTIME_ENV_$*),$(RUNTIME_ENV)) $(JAVA) $(JAVAFLAGS) $*.java $(or $(RUNTIME_ARGS_$*),$(RUNTIME_ARGS))
+$(addprefix runclass-,$(_java_projects_main)): runclass-%: build-%
+ $(eval JAVA_MODULEPATHS_$* = mods/$* $(call _java_projvar,JAVA_MODULEPATHS))\
+ $(strip \
+ $(call _java_projvar,JAVA_RUNTIME_ENV) \
+ $(JAVA) \
+ --module-path mods/$* \
+ $(_java_common_flags) \
+ $(call _java_projvar,JAVAFLAGS) \
+ -m $*/$*.$(firstword $(call _java_projvar,JAVA_MAINCLASSES)) \
+ $(call _java_projvar,JAVA_RUNTIME_ARGS))
-%.class: %.java
- $(JAVAC) $(JAVACFLAGS) $<
+$(addprefix runjar-,$(_java_projects_main)): runjar-%: jar-%
+ $(strip \
+ $(call _java_projvar,JAVA_RUNTIME_ENV) \
+ $(JAVA) \
+ $(call _java_flag,class-path,JAVA_CLASSPATHS,path) \
+ $(call _java_flag,module-path,JAVA_MODULEPATHS,path,\
+ $(or $(call _java_projvar,JAR_FILE),$*.jar)) \
+ $(call _java_projvar,JAVAFLAGS) \
+ --module $* \
+ $(call _java_projvar,JAVA_RUNTIME_ARGS))
-.PHONY: all clean $(STEMS:%=run-%)
+.PHONY: \
+ $(foreach p,$(JAVA_PROJECTMODULES),build-$p check-$p) \
+ $(foreach p,$(_java_projects_main),runclass-$p runsrc-$p runjar-$p)