I'm writing an Makefile to build a JNI header and .so file. The .java files needed to generate .class and then the .h file are on svn. I can copy the svn files (.java) but this would generate dupplicate code on svn since this Makefile goes to the same svn but on different tree location.
The svn design is this way because java people uses different tree of mine (the C guy), but when JNI comes in place this gets dirty..
The problem is: After export .java files the next rule gives-me an error (No rule to make target). If then I run make again it compiles the .java files. I think that gmake is stating the target files for that rule prior executing the exporting rule, but I'm not aware of gmake internals to have shure.
Here is the Makefile
Code:
CLASSES = build/class/com/csi/arm/base/digital/Input.class \
build/class/com/csi/arm/base/digital/Output.class
HEADERS = build/com_csi_arm_base_digital_Output.h \
build/com_csi_arm_base_digital_Input.h
JAVA_HOME = /opt/java6
JAVAC ?= $(JAVA_HOME)/bin/javac
JAR ?= $(JAVA_HOME)/bin/jar
JAVA ?= $(JAVA_HOME)/bin/java
JAVAH ?= $(JAVA_HOME)/bin/javah
JFLAGS ?= -g -source 5 -target 5 -bootclasspath $(JAVA_HOME)/jre/lib/rt.jar
JAVADOC ?= $(JAVA_HOME)/bin/javadoc
.PHONY: all clean
all: build/class build/src/com/csi/arm/base/digital $(CLASSES) $(HEADERS)
build/class:
mkdir -p $(CURDIR)/build/class
build/src/com/csi/arm/base/digital:
svn export http://X.X.X.X/svn/root/CSI/Arm/software/code1/trunk/armcomcsi/src/com/csi/arm/base/digital/ build/src/com/csi/arm/base/digital/
clean:
rm -rf build
# ------------------ RULES -------------------------- #
build/class/com/csi/arm/base/digital/%.class: build/src/com/csi/arm/base/digital/%.java
$(JAVAC) $(JFLAGS) -d build/class -cp 'build/class:lib/*' $<
build/com_csi_arm_base_digital_%.h: build/class/com/csi/arm/base/digital/%.class
$(JAVAH) -classpath 'build/class' -bootclasspath $(JAVA_HOME)/jre/lib/rt.jar -jni -d build/ com.csi.arm.base.digital.$*
Here is the output, from a fresh start:
Code:
[geckos@arch digitalio]$ make
mkdir -p /home/geckos/Embedded/mx6-software/jni-layer/digitalio/build/class
svn export http://X.X.X.X/svn/root/CSI/Arm/software/code1/trunk/armcomcsi/src/com/csi/arm/base/digital/ build/src/com/csi/arm/base/digital/
A build/src/com/csi/arm/base/digital
A build/src/com/csi/arm/base/digital/Input.java
A build/src/com/csi/arm/base/digital/Output.java
Exported revision 13467.
make: *** No rule to make target 'build/class/com/csi/arm/base/digital/Input.class', needed by 'all'. Stop.
[geckos@arch digitalio]$
[geckos@arch digitalio]$
[geckos@arch digitalio]$ make
/opt/java6/bin/javac -g -source 5 -target 5 -bootclasspath /opt/java6/jre/lib/rt.jar -d build/class -cp 'build/class:lib/*' build/src/com/csi/arm/base/digital/Input.java
/opt/java6/bin/javac -g -source 5 -target 5 -bootclasspath /opt/java6/jre/lib/rt.jar -d build/class -cp 'build/class:lib/*' build/src/com/csi/arm/base/digital/Output.java
/opt/java6/bin/javah -classpath 'build/class' -bootclasspath /opt/java6/jre/lib/rt.jar -jni -d build/ com.csi.arm.base.digital.Output
/opt/java6/bin/javah -classpath 'build/class' -bootclasspath /opt/java6/jre/lib/rt.jar -jni -d build/ com.csi.arm.base.digital.Input
[geckos@arch digitalio]$
[geckos@arch digitalio]$
[geckos@arch digitalio]$ make
make: Nothing to be done for 'all'.
Any ideas?
Thanks in advance, best regards!