aboutsummaryrefslogtreecommitdiff
path: root/_make/java.mk
blob: 0362192ca246c6c477683068ce23403b7f21fed7 (plain)
  1. # GNUMake snippet for java compilation and execution
  2. #
  3. # SPDX-License-Identifier: GPL-3.0-or-later
  4. # SPDX-FileCopyrightText: 2024-2025 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # Setup:
  7. # In main Makefile...
  8. # * set variable JAVA_PROJECTMODULES, or PROJECT for one simply named
  9. # * set variable JAVA_MAINCLASSES with at least one main()-method class,
  10. # where the first one listed will be used by default
  11. # * set variables JAVA_CLASSPATHS JAVA_MODULEPATHS JAVA_MODULESOURCEPATH
  12. # JAVA_ROOT JAVA_EXTRACLASSES JAVA_MODULES JAR_FILE
  13. # if needed,
  14. # * include this make snippet
  15. #
  16. # Variables may add suffix _$(PROJECTMODULE), in full or "host-only",
  17. # e.g. JAVA_MODULES_org.example.mydemo or JAVA_MODULES_mydemo.
  18. # defaults overridable at make invocation
  19. JAVA_ROOT ?= src/main/java
  20. JAVAC ?= javac
  21. JAVA ?= java
  22. JAR ?= jar
  23. # account for one annoyingly popular class of non-POSIX system
  24. _java_path_separator := $(if $(filter Windows%,$($(shell uname))),;,:)
  25. _java_module_separator = ,
  26. # expansions optionally stem- or last-word-of-stem-based
  27. # first try fully suffixed, then "host"-suffixed, then bare variable
  28. _java_projvar = $(strip $(foreach v,$1,$(or \
  29. $(if $(or $2,$*),$(or \
  30. $(value $v_$(or $2,$*)),\
  31. $(value $v_$(lastword $(subst ., $(),$(or $2,$*)))))),\
  32. $(value $v))))
  33. _java_root = $(call _java_projvar,JAVA_ROOT)
  34. _java_flag = $(eval x = $(call _java_projvar,$2))$(strip $(if $4$x$5,\
  35. --$1 $(subst $() ,$(value _java_$3_separator),$(strip $4 $x $5))))
  36. _java_common_flags = $(strip \
  37. $(call _java_flag,class-path,JAVA_CLASSPATHS,path) \
  38. $(call _java_flag,module-path,JAVA_MODULEPATHS,path) \
  39. $(call _java_flag,add-modules,JAVA_MODULES,module))
  40. _java_projects_main = $(strip \
  41. $(foreach p,$(JAVA_PROJECTMODULES),\
  42. $(if $(call _java_projvar,JAVA_MAINCLASSES,$p),$p)))
  43. _java_projects_extra = $(strip \
  44. $(foreach p,$(JAVA_PROJECTMODULES),\
  45. $(foreach c,$($wordlist 1,9,$(call _java_projvar,JAVA_MAINCLASSES,$p),\
  46. $p:$c))))
  47. # TODO: formally define a builddir, and drop that on clean
  48. #clean::
  49. # rm -f $(CLASSES)
  50. $(JAVA_PROJECTMODULES:%=build-%): build-%:
  51. rm -rf mods/$*
  52. $(JAVAC) $(strip \
  53. $(call _java_flag,module-source-path,JAVA_MODULESOURCEPATH) \
  54. $(_java_common_flags) -Xlint -Xdoclint -implicit:none \
  55. $(call _java_projvar,JAVACFLAGS) \
  56. -d mods/$* \
  57. $(wildcard $(_java_root)/module-info.java) \
  58. $(foreach c,\
  59. $(call _java_projvar,JAVA_MAINCLASSES JAVA_EXTRACLASSES),\
  60. $(_java_root)/$(subst .,/,$*)/$c.java))
  61. $(JAVA_PROJECTMODULES:%=check-%): check-%:
  62. checkstyle -c _checkstyle/checks.xml $(strip \
  63. $(foreach c,\
  64. $(call _java_projvar,JAVA_MAINCLASSES JAVA_EXTRACLASSES),\
  65. $(_java_root)/$(subst .,/,$*)/$c.java))
  66. $(JAVA_PROJECTMODULES:%=jar-%): jar-%: build-%
  67. $(JAR) --create $(strip \
  68. --file $(or $(call _java_projvar,JAR_FILE),$*.jar) \
  69. $(addprefix --main-class $*.,\
  70. $(firstword $(call _java_projvar,JAVA_MAINCLASSES))) \
  71. $(call _java_projvar,JARFLAGS) \
  72. -C mods/$* .)
  73. $(addprefix runsrc-,$(_java_projects_main)): runsrc-%:
  74. $(strip \
  75. $(call _java_projvar,JAVA_RUNTIME_ENV) \
  76. $(JAVA) \
  77. $(_java_common_flags) \
  78. $(call _java_projvar,JAVAFLAGS) \
  79. $(patsubst %,$(_java_root)/$(subst .,/,$*)/%.java,\
  80. $(firstword $(call _java_projvar,JAVA_MAINCLASSES))) \
  81. $(call _java_projvar,JAVA_RUNTIME_ARGS))
  82. $(addprefix runclass-,$(_java_projects_main)): runclass-%: build-%
  83. $(eval JAVA_MODULEPATHS_$* = mods/$* $(call _java_projvar,JAVA_MODULEPATHS))\
  84. $(strip \
  85. $(call _java_projvar,JAVA_RUNTIME_ENV) \
  86. $(JAVA) \
  87. --module-path mods/$* \
  88. $(_java_common_flags) \
  89. $(call _java_projvar,JAVAFLAGS) \
  90. -m $*/$*.$(firstword $(call _java_projvar,JAVA_MAINCLASSES)) \
  91. $(call _java_projvar,JAVA_RUNTIME_ARGS))
  92. $(addprefix runjar-,$(_java_projects_main)): runjar-%: jar-%
  93. $(strip \
  94. $(call _java_projvar,JAVA_RUNTIME_ENV) \
  95. $(JAVA) \
  96. $(call _java_flag,class-path,JAVA_CLASSPATHS,path) \
  97. $(call _java_flag,module-path,JAVA_MODULEPATHS,path,\
  98. $(or $(call _java_projvar,JAR_FILE),$*.jar)) \
  99. $(call _java_projvar,JAVAFLAGS) \
  100. --module $* \
  101. $(call _java_projvar,JAVA_RUNTIME_ARGS))
  102. .PHONY: \
  103. $(foreach p,$(JAVA_PROJECTMODULES),build-$p check-$p) \
  104. $(foreach p,$(_java_projects_main),runclass-$p runsrc-$p runjar-$p)