Makefile fixes for native targets.
[panamaz] / java.make
index 1986121..d904985 100644 (file)
--- a/java.make
+++ b/java.make
 # 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
 # -------
@@ -198,42 +197,72 @@ $(foreach module,$(java_MODULES) $(native_MODULES),$(eval $(call common_variable
 # ######################################################################
 
 all: jar
-bin:
 gen:
 native:
 
-.PHONY: all clean jar bin gen $(java_MODULES)
+.PHONY: all clean jar gen $(java_MODULES)
 clean:
        rm -rf bin
 
 include $(foreach module,$(java_MODULES),$(wildcard src/$(module)/gen/gen.make))
 include $(foreach module,$(java_MODULES) $(native_MODULES),$(wildcard src/$(module)/native/native.make))
 
+# staging only, not for modules, not sure here?
+define bin_files_targets=
+bin/status/$1.classes: $(patsubst src/$1/bin/%,bin/$(TARGET)/bin/%,$($1_SCRIPTS))
+bin/$(TARGET)/bin/%: src/$1/bin/%
+       install -vD -m 0755 $$< $$@
+endef
+define lib_files_targets=
+bin/status/$1.classes: $(patsubst src/$1/lib/%,bin/$(TARGET)/lib/%,$($1_DATA))
+bin/$(TARGET)/lib/%: src/$1/lib/%
+       install -vD -m 0644 $$< $$@
+endef
+
+#$(foreach module,$(java_MODULES),$(if $($(module)_SCRIPTS),$(info $(call bin_files_targets,$(module)))))
+#$(foreach module,$(java_MODULES),$(if $($(module)_DATA),$(info $(call lib_files_targets,$(module)))))
+
+$(foreach module,$(java_MODULES),$(if $($(module)_SCRIPTS),$(eval $(call bin_files_targets,$(module)))))
+$(foreach module,$(java_MODULES),$(if $($(module)_DATA),$(eval $(call lib_files_targets,$(module)))))
+
+$(error)
+
 # ######################################################################
 # Java
 # ######################################################################
 
+# Targets used to manage dependencies:
+
+# bin/status/<module>.classes          Source compilation target.  Depends on dependent jars, sources, generated sources.
+# $(java_jardir)/<module>.jar          Binary compilation target.  Depends on compiled classes and resources.
+# $(java_jardir)/<module>.jmod         Binary compilation target.  Depends on compiled classes, resources, and native libraries.
+
 define java_targets=
 # Rules for module $(1)
-$(1)_JAVA_generated = $$(addprefix $$($(1)_genjavadir)/,$$($(1)_JAVA_GENERATED))
+$(1)_JAVA_generated = $$(addprefix $$($1_genjavadir)/,$$($1_JAVA_GENERATED))
+
+#$(java_jardir)/$1.jar: $(patsubst %,$(java_jardir)/%.jar,$(filter $($1_JDEPMOD), $(java_MODULES)))
+$(java_jardir)/$1.jar: $(patsubst %,$(java_jardir)/%.jar,$($1_JDEPMOD))
+
+#bin/status/$1.classes: $(patsubst %,bin/status/%.classes,$(filter $($1_JDEPMOD), $(java_MODULES))) $$($1_JAVA) $$($1_JAVA_generated)
+bin/status/$1.classes: $(patsubst %,$(java_jardir)/%.jar,$(filter $($1_JDEPMOD), $(java_MODULES))) $$($1_JAVA) $$($1_JAVA_generated)
 
-bin/status/$(1).data: $$($(1)_RESOURCES)
-bin/status/$(1).classes: $(patsubst %,bin/status/%.classes,$(filter $($(1)_JDEPMOD), $(java_MODULES))) $$($(1)_JAVA) $$($(1)_JAVA_generated)
-bin/status/$(1).scripts: $$($(1)_DATA) $$($(1)_SCRIPTS)
-jar $(1): $(java_jardir)/$(1).jar $(java_jmoddir)/$(1).jmod bin/status/$(1).scripts $($(1)_JDEPMOD)
-bin: bin/status/$(1).classes bin/status/$(1).data bin/status/$(1).scripts
+jar $1: $(java_jardir)/$1.jar $(java_jmoddir)/$1.jmod
+$1: $(filter $($1_JDEPMOD), $(native_MODULES))
 sources: $(java_jardir)/$(1)-sources.zip
 gen: $$($(1)_JAVA_generated)
 
+$(java_jardir)/$1.jar $(java_jmoddir)/$1.jmod: bin/status/$1.classes $(patsubst src/$1/classes/%,%,$($1_RESOURCES))
+
 # Create modular jar
-$(java_jardir)/$(1).jar: bin/status/$(1).classes bin/status/$(1).data
+$(java_jardir)/$1.jar:
        @install -d $$(@D)
        $(JAR) cf $$@ \
          $(JARFLAGS) $$($(1)_JARFLAGS) \
          -C bin/modules/$(1) .
 
 # Create a jmod
-$(java_jmoddir)/$(1).jmod: bin/status/$(1).classes bin/status/$(1).data
+$(java_jmoddir)/$1.jmod:
        rm -f $$@
        @install -d $$(@D)
        $$(JMOD) create \
@@ -247,54 +276,35 @@ $(java_jmoddir)/$(1).jmod: bin/status/$(1).classes bin/status/$(1).data
          $$@
 
 # Create an IDE source zip, paths have to match --module-source-path
-$(java_jardir)/$(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)))
-
-endef
+               $$(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)))
 
-#$(foreach module,$(java_MODULES),$(info $(call java_targets,$(module))))
-$(foreach module,$(java_MODULES),$(eval $(call java_targets,$(module))))
+# resources
+bin/modules/$1/%: src/$1/classes/%
+       install -vDC $$< $$@
 
-# ######################################################################
-# Global pattern rules
-
-# 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
-       touch $@
-
-# Stage scripts and data
-bin/status/%.scripts:
-       @install -d $(@D)
-       for data in $(patsubst src/$*/lib/%,"%",$($*_DATA)) ; do \
-               install -vDC -m 0644 "src/$*/lib/$$data" "bin/$(TARGET)/lib/$$data" || exit 1 ; \
-       done
-       for data in $(patsubst src/$*/bin/%,"%",$($*_SCRIPTS)) ; do \
-               install -vDC -m 0755 "src/$*/bin/$$data" "bin/$(TARGET)/bin/$$data" || exit 1 ; \
-       done
-       touch $@
-
-# Compile one module.
-bin/status/%.classes:
-       @install -d $(@D)
+# Compile module.
+bin/status/$1.classes:
+       @install -d $$(@D)
        $(JAVAC) \
                --module-source-path "src/*/classes:bin/gen/*/classes" \
                $(if $(JAVAMODPATH),--module-path $(subst $(S),:,$(JAVAMODPATH))) \
-               $(JAVACFLAGS) $($*_JAVACFLAGS) \
+               $(JAVACFLAGS) $($1_JAVACFLAGS) \
                -d bin/modules \
-               -m $* \
-               $($*_JAVA) $($*_JAVA_generated)
-       touch $@
+               -m $1 \
+               $($1_JAVA) $($1_JAVA_generated)
+       touch $$@
+endef
+
+#$(foreach module,$(java_MODULES),$(info $(call java_targets,$(module))))
+$(foreach module,$(java_MODULES),$(eval $(call java_targets,$(module))))
 
 # setup run-* targets
 define run_targets=
-run-$1/$2: $1
+run-$1/$2: $(java_jardir)/$1.jar
        LD_LIBRARY_PATH=$(FFMPEG_HOME)/lib \
        $(JAVA) \
                $(if $(JAVAMODPATH) $($1_JAVAMODPATH),--module-path $(subst $(S),:,$(JAVAMODPATH) $($1_JAVAMODPATH))) \
@@ -308,7 +318,7 @@ endef
 $(foreach module,$(java_MODULES),$(foreach main,$($(module)_JMAIN),$(eval $(call run_targets,$(module),$(main)))))
 
 # ######################################################################
-# nativez jdk.foreign export tool via _API variables
+# notzed.nativez jdk.foreign export tool via _API variables
 # ######################################################################
 
 # <module>_API                 List of api's to include
@@ -316,12 +326,19 @@ $(foreach module,$(java_MODULES),$(foreach main,$($(module)_JMAIN),$(eval $(call
 # <module>_<api>_APIFLAGS      Extra flags to pass to export-api for each api
 
 define export_targets=
-gen: bin/status/$2.export
+bin/status/$2.export: $(NATIVEZ_HOME)/lib/notzed.nativez.jar # hack for in-tree notzed.nativez?
 bin/status/$1.classes: bin/status/$2.export
-bin/status/$2.export: src/$1/gen/$2.api src/$1/gen/$2.h $(NATIVEZ_HOME)/bin/export-api
+bin/status/$2.export:
        mkdir -p bin/gen/$1/gen bin/status
-       $(NATIVEZ_HOME)/bin/export-api -w bin/gen/$1/gen -d bin/gen/$1/classes $($1_APIFLAGS) $($1_$2_APIFLAGS) $$<
+       $(NATIVEZ_HOME)/bin/export-api \
+               -w bin/gen/$1/gen -d bin/gen/$1/classes $($1_APIFLAGS) $($1_$2_APIFLAGS) src/$1/gen/$2.api
        touch $$@
+
+bin/status/$2.export.d:
+       @$(NATIVEZ_HOME)/bin/export-api -M -MT "$$(@:.d=) $$@" -MF $$@ \
+               -w bin/gen/$1/gen -d bin/gen/$1/classes $($1_APIFLAGS) $($1_$2_APIFLAGS) src/$1/gen/$2.api 2>/dev/null
+
+$(if $(filter clean dist gen,$(MAKECMDGOALS)),,-include bin/status/$2.export.d)
 endef
 
 #$(foreach module,$(java_MODULES),$(if $($(module)_API),$(foreach api,$($(module)_API),$(info $(call export_targets,$(module),$(api))))))
@@ -379,19 +396,17 @@ $($(1)_libdir)/%: src/$(1)/native/%
 $($(1)_objdir)/%.d: src/$(1)/native/%.c
        @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
+       @$($(TARGET)_CC) -MM -MT "$$(@:.d=.o) $$@" -Isrc/$(1)/jni -Ibin/include/$(1) \
+               $($(TARGET)_CPPFLAGS) $($(2)_CPPFLAGS) $$< -o $$@ 2>/dev/null
 
 # auto-dependencies for c++ files
 $($(1)_objdir)/%.d: src/$(1)/native/%.cc
        @install -d $$(@D)
        @rm -f $$@
-       @$($(TARGET)_CXX) -MM -MT "bin/$(1)/$(TARGET)/obj/$$*.o" -Isrc/$(1)/jni -Ibin/include/$(1) \
-               $($(TARGET)_CPPFLAGS) $($(2)_CPPFLAGS) $$< -o $$@.d
-       @sed 's,\($$*\.o\) *:,\1 $$@ : ,g' $$@.d > $$@ ; rm $$@.d
+       @$($(TARGET)_CXX) -MM -MT "$$(@:.d=.o) $$@" -Isrc/$(1)/jni -Ibin/include/$(1) \
+               $($(TARGET)_CPPFLAGS) $($(2)_CPPFLAGS) $$< -o $$@ 2>/dev/null
 
-bin native $(1) $(java_jmoddir)/$(1).jmod: \
+$(java_jardir)/$(1).jar: \
        $($(1)_libdir)/$(LIB)$(2)$(SO) \
        $(java_libdir)/$(LIB)$(2)$(SO) \
        $(addprefix $($(1)_incdir)/,$($(2)_HEADERS)) \
@@ -406,6 +421,14 @@ endef
 #$(foreach module,$(java_MODULES) $(native_MODULES),$(foreach library,$($(module)_NATIVE_LIBRARIES),$(info $(call native_library,$(module),$(library)))))
 $(foreach module,$(java_MODULES) $(native_MODULES),$(foreach library,$($(module)_NATIVE_LIBRARIES),$(eval $(call native_library,$(module),$(library)))))
 
+# small hack: native-only modules have a phony jar target
+define native_targets=
+.PHONY: $(java_jardir)/$(1).jar
+$1 jar: $(java_jardir)/$(1).jar
+endef
+#$(foreach module,$(native_MODULES),$(info $(call native_targets,$(module))))
+$(foreach module,$(native_MODULES),$(eval $(call native_targets,$(module))))
+
 # ######################################################################
 
 dist: