# GNUMake snippet for java compilation and execution
#
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2024-2025 Jonas Smedegaard <dr@jones.dk>
#
# Setup:
# In main Makefile...
#  * set variable PROJECT
#  * set variables PROJECT_FLAVORS CLASSPATHS MODULEPATHS JAVAMODULES
#    if needed
#  * include this make snippet

STEMS = $(PROJECT) $(PROJECT_FLAVORS:%=$(PROJECT)%) $(EXTRASTEMS)
CLASSES = $(STEMS:=.class)

# 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)))
_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)))

# defaults overridable at make invocation
JAVAC ?= javac
JAVA ?= java
JAVACFLAGS ?= $(strip $(_java_common_flags) -Xlint -Xdoclint -implicit:none)
JAVAFLAGS ?= $(strip $(_java_common_flags))

all:: run-$(PROJECT)

clean::
	rm -f $(CLASSES)

$(STEMS:%=check-%): check-%:
	checkstyle -c ./_checkstyle/checks.xml $*.java

$(STEMS:%=run-%): run-%: %.class
	$(or $(RUNTIME_ENV_$*),$(RUNTIME_ENV)) $(JAVA) $(JAVAFLAGS) $*.java $(or $(RUNTIME_ARGS_$*),$(RUNTIME_ARGS))

%.class: %.java
	$(JAVAC) $(JAVACFLAGS) $<

.PHONY: all clean $(STEMS:%=run-%)