diff options
author | Jonas Smedegaard <dr@jones.dk> | 2025-04-27 12:52:15 +0200 |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2025-04-27 12:55:37 +0200 |
commit | c20aa9d2cf4e85f895f6c02e299d2b8ca176ae2b (patch) | |
tree | e63ede83bbb85f4a8d524e9e97cbaf4e99280f2b /_make/java.mk | |
parent | e4a0762c7a2ac3afb8e33bf24fd7495553b5819f (diff) |
rewrite make snippet for java
Diffstat (limited to '_make/java.mk')
-rw-r--r-- | _make/java.mk | 117 |
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) |