Bump to jdk 13.
[nativez] / java.make
index c7074ab..ee876b1 100644 (file)
--- a/java.make
+++ b/java.make
 # <module>_JARFLAGS
 # <module>_JMODFLAGS
 
+# <module>_JAVA                        Java sources.  If not set it is found from src/<module>/classes/(*.java)
+# <module>_RESOURCES           .jar resources.  If not set it is found from src/<module>/classes/(not *.java)
+# <module>_JAVA_GENERATED      Java generated sources.  These must be relative to the package name.
 
-# <module>_JAVA                Java sources.  This is set internally.
-# <module>_RESOURCES   .jar resources.  This is set internally.
+# Variables for use in fragments
+
+# gen.make and jni.make can additionally make use of these variables
+
+# <module>_gendir      Location for files used in Java generation process (per project).
+# <module>_genjavadir  Location where _JAVA_GENERATED .java files will be created (per project).
+# <module>_jnidir      Location for jni generated files (per target).
+# <module>_objdir      Location for c objects (per target).
+# <module>_incdir      Location for output includes, .jmod staging.
+# <module>_libdir      Location for output libraries, .jmod staging.  May point to _bindir.
+# <module>_bindir      Location for output commands, .jmod staging.
 
 # Define libraries
 # ----------------
@@ -81,6 +93,7 @@
 
 # <library>_SOURCES    .c, .cc, .C - source files for library.  Paths are relative to src/<module>/jni.
 # <library>_HEADERS    header files for jmod
+# <library>_COMMANDS   commands/bin/scripts for jmod
 
 # <library>_LDFLAGS    link flags
 # <library>_LIBADD     extra objects to add to link line
 
 # <library>_DEPENDENCIES       A list of other objects on which this library depends before linking.
 
+# <library>_DEFS       A list of .def files for nativez-gen.
+# <library>_DEFSFLAGS  Flags for nativez-gen invocation.
+
 # .c files have dependencies automatically generated
 
+# Targets
+# -------
+
+# make gen             only generate java sources
+# make clean           rm -rf bin
+# make dist            create dist tar in bin/
+# make | make jar      make all jars and jmods
+# make bin             make everything but jars and mods
 
 # Outputs
 # -------
 #  bin/gen/<module>/gen/       .c, exe files for generator     free use
 #  bin/gen/<module>/classes/   .java files from generator      <module>_JAVA_GENERATED
 
+# Working files
 #  bin/status/                 marker files for makefile
 
-#  bin/<module>/<module>.jar   .jar modular
-
-# Native code
-
 #  bin/<module>/<target>/lib   .so librareies for jmod         <module>_LIBRARIES = libname
 #  bin/<module>/<target>/obj   .o, .d files for library        <libname>_SOURCES
 #  bin/<module>/<target>/include .h files for jmod             <libname>_HEADERS
 #  bin/<module>/<target>/<module>.jmod .jmod module
 
+# Output files
+#  bin/<target>/lib/           modular jar files and shared libraries for GNU/linux dev
+#  bin/<target>/include/       header files for exported shared libraries
+#  bin/<target>/bin/           shared libraries for microsoft dev
+#  bin/<target>/jmods/         jmod files for 'jlink' use.
+
 # ######################################################################
 
 E:=
@@ -129,24 +156,38 @@ java_JARS=$(foreach module,$(java_MODULES),$(if $(wildcard src/$(module)/jni/jni
 # Modules with generated java source
 java_JGEN=$(foreach module,$(java_MODULES),$(if $(wildcard src/$(module)/gen/gen.make),$(module)))
 
-# Define per-module source and resource variables
-$(foreach module,$(java_MODULES),$(eval $(module)_JAVA := $(shell find src/$(module)/classes -type f -name '*.java')))
-$(foreach module,$(java_MODULES),$(eval $(module)_RESOURCES := $(shell find src/$(module)/classes -type f \! -name '*.java')))
+# Define some useful variables before including fragments
+define java_variables=
+$(1)_gendir:=bin/gen/$(1)/gen
+$(1)_genjavadir:=bin/gen/$(1)/classes
+$(1)_jnidir:=bin/$(1)/$(TARGET)/jni
+$(1)_objdir:=bin/$(1)/$(TARGET)/obj
+$(1)_incdir:=bin/$(1)/$(TARGET)/include
+$(1)_libdir:=$$(if $$(filter windows-%,$(TARGET)),bin/$(1)/$(TARGET)/bin,bin/$(1)/$(TARGET)/lib)
+$(1)_bindir:=bin/$(1)/$(TARGET)/bin
+ifndef $(1)_JAVA
+$(1)_JAVA := $$(shell find src/$(1)/classes -type f -name '*.java')
+endif
+ifndef $(1)_RESOURCES
+$(1)_RESOURCES := $$(shell find src/$(1)/classes -type f \! -name '*.java')
+endif
+endef
 
-# external jni deps
-$(foreach mod,$(java_MODULES),$(eval $(mod)_JDEPMOD_JNI=$(foreach jdep,$($(mod)_JDEPMOD),$(if $(wildcard src/$(mod)/jni),$(jdep)))))
+java_libdir:=$(if $(filter windows-%,$(TARGET)),bin/$(TARGET)/bin,bin/$(TARGET)/lib)
+java_bindir:=bin/$(TARGET)/bin
+java_jardir:=bin/$(TARGET)/lib
+java_incdir:=bin/$(TARGET)/include
+java_jmoddir:=bin/$(TARGET)/jmods
 
-# Make some of the setup dirs (should it be a target?)
-$(shell install -d bin/status bin/modules)
+$(foreach module,$(java_MODULES),$(eval $(call java_variables,$(module))))
 
 # ######################################################################
 
 all: jar
 bin:
-jni:
-sources:
+gen:
 
-.PHONY: all clean jar jni bin sources
+.PHONY: all clean jar bin gen
 clean:
        rm -rf bin
 
@@ -159,21 +200,24 @@ include $(patsubst %,src/%/jni/jni.make,$(java_JMODS))
 
 define java_targets=
 # Rules for module $(1)
+$(1)_JAVA_generated = $$(addprefix $$($(1)_genjavadir)/,$$($(1)_JAVA_GENERATED))
+
 bin/status/$(1).data: $$($(1)_RESOURCES)
-bin/status/$(1).classes: $(patsubst %,bin/status/%.classes,$($(1)_JDEPMOD)) $$($(1)_JAVA)
-jar $(1): bin/$(1)/$(1).jar $(if $(wildcard src/$(1)/jni/jni.make),bin/$(1)/$(TARGET)/$(1).jmod)
+bin/status/$(1).classes: $(patsubst %,bin/status/%.classes,$($(1)_JDEPMOD)) $$($(1)_JAVA) $$($(1)_JAVA_generated)
+jar $(1): $(java_jardir)/$(1).jar $(java_jmoddir)/$(1).jmod
 bin: bin/status/$(1).classes bin/status/$(1).data
-sources: bin/$(1)/$(1)-sources.zip
+sources: $(java_jardir)/$(1)-sources.zip
+gen: $$($(1)_JAVA_generated)
 
 # Create modular jar
-bin/$(1)/$(1).jar: bin/status/$(1).classes bin/status/$(1).data
+$(java_jardir)/$(1).jar: bin/status/$(1).classes bin/status/$(1).data
        @install -d $$(@D)
        $(JAR) cf $$@ \
          $(JARFLAGS) $$($(1)_JARFLAGS) \
          -C bin/modules/$(1) .
 
 # Create a jmod
-bin/$(1)/$(TARGET)/$(1).jmod: bin/status/$(1).classes bin/status/$(1).data
+$(java_jmoddir)/$(1).jmod: bin/status/$(1).classes bin/status/$(1).data
        rm -f $$@
        @install -d $$(@D)
        $$(JMOD) create \
@@ -182,11 +226,13 @@ bin/$(1)/$(TARGET)/$(1).jmod: bin/status/$(1).classes bin/status/$(1).data
          --class-path bin/modules/$(1) \
          $$(if $$(wildcard bin/$(1)/$(TARGET)/include),--header-files bin/$(1)/$(TARGET)/include) \
          $$(if $$(wildcard src/$(1)/legal),--legal-notices src/$(1)/legal) \
-         $$($(TARGET)_JMOD_LIBS) bin/$(1)/$(TARGET)/lib \
+         $$(if $$(wildcard bin/$(1)/$(TARGET)/bin),--cmds bin/$(1)/$(TARGET)/bin) \
+         $$(if $$(wildcard bin/$(1)/$(TARGET)/lib),--libs bin/$(1)/$(TARGET)/lib) \
          $$@
 
 # Create an IDE source zip, paths have to match --module-source-path
-bin/$(1)/$(1)-sources.zip: bin/status/$(1).classes
+$(java_jardir)/$(1)-sources.zip: bin/status/$(1).classes
+       @install -d $$(@D)
        jar -c -f $$@ -M \
                $$(patsubst src/$(1)/classes/%,-C src/$(1)/classes %,$$(filter src/$(1)/classes/%,$$($(1)_JAVA))) \
                $$(patsubst bin/gen/$(1)/classes/%,-C bin/gen/$(1)/classes %,$$(filter bin/gen/$(1)/classes/%,$$($(1)_JAVA)))
@@ -201,6 +247,7 @@ $(foreach module,$(java_MODULES),$(eval $(call java_targets,$(module))))
 
 # Stage resources
 bin/status/%.data:
+       @install -d $(@D)
        for data in $(patsubst src/$*/classes/%,"%",$($*_RESOURCES)) ; do \
                install -vDC "src/$*/classes/$$data" "bin/modules/$*/$$data" || exit 1 ; \
        done
@@ -208,13 +255,15 @@ bin/status/%.data:
 
 # Compile one module.  This only updates (javac -h) headers if they changed.
 bin/status/%.classes:
+       @install -d $(@D)
        $(JAVAC) \
                --module-source-path "src/*/classes:bin/gen/*/classes" \
+               $(if $(JAVAMODPATH),--module-path $(subst $(S),:,$(JAVAMODPATH))) \
                $(JAVACFLAGS) $($*_JAVACFLAGS) \
                -h bin/inc \
                -d bin/modules \
                -m $* \
-               $($*_JAVA)
+               $($*_JAVA) $($*_JAVA_generated)
        if [ -d bin/inc/$* ] ; then \
                install -DC -t bin/include/$* bin/inc/$*/*.h ; \
        fi
@@ -228,45 +277,72 @@ SUFFIXES=.c .C .cc
 SO=$($(TARGET)_SO)
 LIB=$($(TARGET)_LIB)
 
-library-path=bin/$(1)/$(TARGET)/lib/$(LIB)$(2)$(SO)
-library-dir=bin/$(1)/$(TARGET)/lib/
+# functions to find cross-module stuff $(call library-path,modname,libname)
+library-path=$($(1)_libdir)/$(LIB)$(2)$(SO)
+library-dir=$($(1)_libdir)/
 
 define jni_library=
 # Rule for library $(2) in module $(1)
-$(2)_OBJS = $(foreach sx,$(SUFFIXES),$(patsubst %$(sx), bin/$(1)/$(TARGET)/obj/%.o, $(filter %$(sx),$($(2)_SOURCES))))
+$(2)_OBJS = $(foreach sx,$(SUFFIXES),$(patsubst %$(sx), $($(1)_objdir)/%.o, $(filter %$(sx),$($(2)_SOURCES))))
 $(2)_SRCS = $(addprefix src/$(1)/jni/,$($(2)_SOURCES))
+$(2)_SO = $($(1)_libdir)/$(LIB)$(2)$(SO)
 
-bin/$(1)/$(TARGET)/lib/$(LIB)$(2)$(SO): $$($(2)_OBJS) $($(2)_LIBADD) $($(2)_DEPENDENCIES)
+$($(1)_libdir)/$(LIB)$(2)$(SO): $$($(2)_OBJS) $($(2)_LIBADD) $($(2)_DEPENDENCIES)
        @install -d $$(@D)
        $($(TARGET)_CC) -o $$@ -shared \
                $($(TARGET)_LDFLAGS) $($(2)_LDFLAGS) $$($(2)_OBJS) $($(2)_LIBADD) $($(TARGET)_LDLIBS) $($(2)_LDLIBS)
 
-bin/$(1)/$(TARGET)/obj/%.o: src/$(1)/jni/%.c bin/status/$(1).classes
+$(java_libdir)/%: $($(1)_libdir)/%
+       install -DC $$< $$@
+$(java_bindir)/%: $($(1)_bindir)/%
+       install -DC $$< $$@
+$(java_incdir)/%: $($(1)_incdir)/%
+       install -DC $$< $$@
+
+$($(1)_objdir)/%.o: src/$(1)/jni/%.c
        @install -d $$(@D)
-       $($(TARGET)_CC) -Isrc/$(1)/jni -Ibin/include/$(1) $($(TARGET)_CPPFLAGS) $($(2)_CPPFLAGS) \
+       $($(TARGET)_CC) -Isrc/$(1)/jni -Ibin/include/$(1) -I$($(1)_jnidir) \
+               $($(TARGET)_CPPFLAGS) $($(2)_CPPFLAGS) \
                $($(TARGET)_CFLAGS) $($(2)_CFLAGS) -c -o $$@ $$<
 
-bin/$(1)/$(TARGET)/include/%.h: src/$(1)/jni/%.h
-       install -D $$< $$@
+$($(1)_incdir)/%.h: src/$(1)/jni/%.h
+       install -DC $$< $$@
 
-bin/$(1)/$(TARGET)/obj/%.d: src/$(1)/jni/%.c bin/status/$(1).classes
+# auto-dependencies for c files
+$($(1)_objdir)/%.d: src/$(1)/jni/%.c bin/status/$(1).classes
        @install -d $$(@D)
        @rm -f $$@
        @$($(TARGET)_CC) -MM -MT "bin/$(1)/$(TARGET)/obj/$$*.o" -Isrc/$(1)/jni -Ibin/include/$(1) \
                $($(TARGET)_CPPFLAGS) $($(2)_CPPFLAGS) $$< -o $$@.d 2>/dev/null
        @sed 's,\($$*\.o\) *:,\1 $$@ : ,g' $$@.d > $$@ ; rm $$@.d
 
-bin jni $(1) bin/$(1)/$(TARGET)/$(1).jmod: bin/$(1)/$(TARGET)/lib/$(LIB)$(2)$(SO) $(addprefix bin/$(1)/$(TARGET)/include/,$($(2)_HEADERS))
-
-$(if $(filter clean dist,$(MAKECMDGOALS)),,-include $$($(2)_OBJS:.o=.d))
+# .def files for nativez mapping
+$($(1)_jnidir)/%.h: src/$(1)/jni/%.def
+       @install -d $$(@D)
+       $(NATIVEZ_HOME)/bin/nativez-gen -J $($(2)_DEFSFLAGS) $$< > $$@ || ( rm $$@ ; exit 1)
+
+bin jni $(1) $(java_jmoddir)/$(1).jmod: \
+       $($(1)_libdir)/$(LIB)$(2)$(SO) \
+       $(java_libdir)/$(LIB)$(2)$(SO) \
+       $(addprefix $($(1)_incdir)/,$($(2)_HEADERS)) \
+       $(addprefix $(java_incdir)/,$($(2)_HEADERS)) \
+       $(addprefix $($(1)_bindir)/,$($(2)_COMMANDS)) \
+       $(addprefix $(java_bindir)/,$($(2)_COMMANDS)) \
+       $(addprefix $($(1)_libdir)/,$($(2)_LIBRARIES))
+
+$(if $(filter clean dist gen,$(MAKECMDGOALS)),,-include $$($(2)_OBJS:.o=.d))
 endef
 
 #$(foreach module,$(java_JMODS),$(foreach library,$($(module)_JNI_LIBRARIES),$(info $(call jni_library,$(module),$(library)))))
 $(foreach module,$(java_JMODS),$(foreach library,$($(module)_JNI_LIBRARIES),$(eval $(call jni_library,$(module),$(library)))))
 
+#$(foreach module,$(java_JMODS),$(foreach library,$($(module)_JNI_LIBRARIES),$(foreach def,$($(library)_DEFS),$(info $($(module)_objdir)/$(def:.def=.o): $($(module)_jnidir)/$(def:.def=.h)))))
+$(foreach module,$(java_JMODS),$(foreach library,$($(module)_JNI_LIBRARIES),$(foreach def,$($(library)_DEFS),$(eval $($(module)_objdir)/$(def:.def=.o): $($(module)_jnidir)/$(def:.def=.h)))))
+
 # ######################################################################
 
 dist:
+       @install -d bin
        tar cfz bin/$(dist_NAME)-$(dist_VERSION).tar.gz \
         --transform=s,^,$(dist_NAME)-$(dist_VERSION)/, \
         config.make java.make Makefile src             \