aboutsummaryrefslogtreecommitdiff
path: root/_make/java.mk
blob: 475ac6b3a4fe140f7a97ab228212a1e7f6765381 (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. # projectmodules with default main function
  41. _java_mainclassmodules = $(strip \
  42. $(foreach p,$(JAVA_PROJECTMODULES),\
  43. $(if $(call _java_projvar,JAVA_MAINCLASSES,$p),$p)))
  44. # projectmodules with non-default main function expanded, dot-appended
  45. _java_extramainclassmodules = $(strip \
  46. $(foreach p,$(JAVA_PROJECTMODULES),\
  47. $(eval classes = $(call _java_projvar,JAVA_MAINCLASSES,$p))\
  48. $(foreach c,$(filter-out $(firstword $(classes)),$(classes)),\
  49. $p.$(subst /,.,$c))))
  50. # TODO: formally define a builddir, and drop that on clean
  51. #clean::
  52. # rm -f $(CLASSES)
  53. $(JAVA_PROJECTMODULES:%=build-%): build-%:
  54. rm -rf mods/$*
  55. $(JAVAC) $(strip \
  56. $(call _java_flag,module-source-path,JAVA_MODULESOURCEPATH) \
  57. $(_java_common_flags) -Xlint -Xdoclint -implicit:none \
  58. $(call _java_projvar,JAVACFLAGS) \
  59. -d mods/$* \
  60. $(wildcard $(_java_root)/module-info.java) \
  61. $(foreach c,\
  62. $(call _java_projvar,JAVA_MAINCLASSES JAVA_EXTRACLASSES),\
  63. $(_java_root)/$(subst .,/,$*)/$c.java))
  64. $(JAVA_PROJECTMODULES:%=check-%): check-%:
  65. checkstyle -c _checkstyle/checks.xml $(strip \
  66. $(foreach c,\
  67. $(call _java_projvar,JAVA_MAINCLASSES JAVA_EXTRACLASSES),\
  68. $(_java_root)/$(subst .,/,$*)/$c.java))
  69. $(JAVA_PROJECTMODULES:%=jar-%): jar-%: build-%
  70. $(JAR) --create $(strip \
  71. --file $(or $(call _java_projvar,JAR_FILE),$*.jar) \
  72. $(addprefix --main-class $*.,\
  73. $(firstword $(call _java_projvar,JAVA_MAINCLASSES))) \
  74. $(call _java_projvar,JARFLAGS) \
  75. -C mods/$* .)
  76. $(addprefix runsrc-,$(_java_mainclassmodules)): runsrc-%:
  77. $(strip \
  78. $(call _java_projvar,JAVA_RUNTIME_ENV) \
  79. $(JAVA) \
  80. $(_java_common_flags) \
  81. $(call _java_projvar,JAVAFLAGS) \
  82. $(patsubst %,$(_java_root)/%.java,\
  83. $(subst .,/,$(or \
  84. $(_java_main_class),\
  85. $*/$(firstword $(call _java_projvar,JAVA_MAINCLASSES))))) \
  86. $(call _java_projvar,JAVA_RUNTIME_ARGS))
  87. $(addprefix runclass-,$(_java_mainclassmodules)): runclass-%: build-%
  88. $(strip \
  89. $(eval JAVA_MODULEPATHS_$* = mods/$* $(call _java_projvar,JAVA_MODULEPATHS))\
  90. $(call _java_projvar,JAVA_RUNTIME_ENV) \
  91. $(JAVA) \
  92. $(_java_common_flags) \
  93. $(call _java_projvar,JAVAFLAGS) \
  94. -m $*/$(or $(_java_main_class),\
  95. $*.$(firstword $(call _java_projvar,JAVA_MAINCLASSES))) \
  96. $(call _java_projvar,JAVA_RUNTIME_ARGS))
  97. $(addprefix runjar-,$(_java_mainclassmodules)): runjar-%: jar-%
  98. $(strip \
  99. $(call _java_projvar,JAVA_RUNTIME_ENV) \
  100. $(JAVA) \
  101. $(call _java_flag,class-path,JAVA_CLASSPATHS,path) \
  102. $(call _java_flag,module-path,JAVA_MODULEPATHS,path,\
  103. $(or $(call _java_projvar,JAR_FILE),$*.jar)) \
  104. $(call _java_projvar,JAVAFLAGS) \
  105. --module $*$(_java_main_class:%=/%) \
  106. $(call _java_projvar,JAVA_RUNTIME_ARGS))
  107. $(addprefix runsrc-,$(_java_extramainclassmodules)): runsrc-%:
  108. $(strip _java_main_class=$* \
  109. $(MAKE) runsrc-$(strip $(foreach p,$(JAVA_PROJECTMODULES),\
  110. $(if $(filter $p%,$*),$p))))
  111. $(addprefix runclass-,$(_java_extramainclassmodules)): runclass-%:
  112. $(strip _java_main_class=$* \
  113. $(MAKE) runclass-$(strip $(foreach p,$(JAVA_PROJECTMODULES),\
  114. $(if $(filter $p%,$*),$p))))
  115. $(addprefix runjar-,$(_java_extramainclassmodules)): runjar-%:
  116. $(strip _java_main_class=$* \
  117. $(MAKE) runjar-$(strip $(foreach p,$(JAVA_PROJECTMODULES),\
  118. $(if $(filter $p%,$*),$p))))
  119. .PHONY: \
  120. $(foreach p,$(JAVA_PROJECTMODULES),build-$p check-$p) \
  121. $(foreach p,$(_java_mainclassmodules) $(_java_extramainclassmodules),\
  122. runclass-$p runsrc-$p runjar-$p)