aboutsummaryrefslogtreecommitdiffstats
path: root/make/gluegen-cpptasks-base.xml
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-07-11 03:05:41 +0200
committerSven Gothel <[email protected]>2014-07-11 03:05:41 +0200
commitf5c48efcf546ba4e08e197ccced6df83b57e1755 (patch)
treeadd2ce9506acb35ce3a34c763afb6d2b91a5081e /make/gluegen-cpptasks-base.xml
parentbe61c7f33ec8e4f3214e8d2969ee88cd327fce9d (diff)
Bug 1024: Add fallback for native-jar-file location via classpath
In situations, where the native-jar file is not located within the same parent URI as it's java-jar file, our location mechanism fails. This patch adds a classloader based native-jar file location mechanism as a fallback, requiring the native jar file to be included in the users CLASSPATH. Classloader based location algorithm in JNILibLoaderBase.addNativeJarLibsImpl(..): - Extract the 'module-name' from the given classFromJavaJar's package name, i.e. the last package-part: 'jogamp.common.Debug' -> 'common' Hence it is important to pass a 'classFromJavaJar', which last package segment reflects the module-name! - <os.and.arch> -> <os_and_arch_dot>, e.g. linux-amd64 -> linux.amd64 (linux/amd64) - Locate class 'jogamp.nativetag.<module-name>.<os_and_arch_dot>.TAG', e.g. 'jogamp.nativetag.common.linux.amd64.TAG' - Use located class's JarFile URI .. continue as usual Injection of above mentioned TAG class via gluegen-cpptasks-base.xml macro 'native.tag.jar': - Creates dummy TAG.java code - Compiles TAG.java - Creates the native-jar file Example: <native.tag.jar objdir="${build}/obj" nativejarfile="${build}/gluegen-rt-natives-${os.and.arch}.jar" manifestfile="${build}/Manifest-rt-natives.temp" module="common" includelibs="*gluegen-rt.${native.library.suffix}" /> Note that the manifest file uses a matching Extension-Name: Extension-Name: jogamp.nativetag.common
Diffstat (limited to 'make/gluegen-cpptasks-base.xml')
-rwxr-xr-xmake/gluegen-cpptasks-base.xml64
1 files changed, 63 insertions, 1 deletions
diff --git a/make/gluegen-cpptasks-base.xml b/make/gluegen-cpptasks-base.xml
index 8b8b82e..911df8a 100755
--- a/make/gluegen-cpptasks-base.xml
+++ b/make/gluegen-cpptasks-base.xml
@@ -177,6 +177,10 @@
<echo message="os.version=${os.version}" />
<echo message="os.arch=${os.arch}" />
+ <property name="nativejartag.package" value="jogamp.nativetag" />
+ <property name="nativejartag.prefix" value="jogamp/nativetag" />
+ <echo message="nativejartag.prefix = ${nativejartag.prefix}" />
+
<!-- NOTE: the value of the debug attribute will not be overridden if already set externally -->
<property name="c.compiler.debug" value="false" />
<condition property="c.compiler.use-debug"><istrue value="${c.compiler.debug}"/></condition>
@@ -707,7 +711,19 @@
</target>
<target name="gluegen.cpptasks.detect.os.2" depends="gluegen.cpptasks.detect.os.refine,gluegen.cpptasks.detect.os.freebsd,gluegen.cpptasks.detect.os.hpux,gluegen.cpptasks.detect.os.linux,gluegen.cpptasks.detect.os.osx,gluegen.cpptasks.detect.os.solaris,gluegen.cpptasks.detect.os.unix,gluegen.cpptasks.detect.os.windows" unless="gluegen.cpptasks.detected.os.2">
- <echo message="os and arch: ${os.and.arch}" />
+ <propertyregex property="os.and.arch.dot"
+ input="${os.and.arch}"
+ regexp="-"
+ replace="."
+ global="true" />
+ <propertyregex property="os.and.arch.slash"
+ input="${os.and.arch}"
+ regexp="-"
+ replace="/"
+ global="true" />
+ <echo message="os and arch: ${os.and.arch}" />
+ <echo message="os and arch.dot: ${os.and.arch.dot}" />
+ <echo message="os and arch.slash: ${os.and.arch.slash}" />
</target>
<target name="gluegen.cpptasks.detect.os" depends="gluegen.properties.load.user,gluegen.cpptasks.detect.os.custom,gluegen.cpptasks.detect.os.1,gluegen.cpptasks.detect.os.2">
@@ -1539,4 +1555,50 @@
</exec>
</sequential>
</macrodef>
+
+ <macrodef name="native.tag.jar">
+ <attribute name="objdir" />
+ <attribute name="nativejarfile" />
+ <attribute name="manifestfile" />
+ <attribute name="module" />
+ <attribute name="includelibs" />
+ <attribute name="excludelibs" default="" />
+ <sequential>
+
+ <var name="nativejarfile.basename" unset="true"/>
+ <var name="nativejarfile.tmpdir" unset="true"/>
+ <var name="nativejarfile.tmpdir.natives" unset="true"/>
+ <basename property="nativejarfile.basename" file="@{nativejarfile}"/>
+ <property name="nativejarfile.tmpdir" value="@{objdir}/${nativejarfile.basename}.d" />
+ <property name="nativejarfile.tmpdir.natives" value="${nativejarfile.tmpdir}/jar" />
+ <!-- In case we like to switch to a natives subfolder 'natives/${os.and.arch}' use the following -->
+ <!-- property name="nativejarfile.tmpdir.natives" value="${nativejarfile.tmpdir}/jar/natives/${os.and.arch}" /-->
+
+ <mkdir dir="${nativejarfile.tmpdir}/java" />
+ <mkdir dir="${nativejarfile.tmpdir.natives}" />
+ <copy todir="${nativejarfile.tmpdir.natives}">
+ <fileset dir="@{objdir}"
+ includes="@{includelibs}"
+ excludes="@{excludelibs}"/>
+ </copy>
+ <echo message='package ${nativejartag.package}.@{module}.${os.and.arch.dot}; public final class TAG { }' file="${nativejarfile.tmpdir}/java/${nativejartag.prefix}/@{module}/${os.and.arch.slash}/TAG.java"/>
+ <javac destdir="${nativejarfile.tmpdir}/jar"
+ includes="${nativejartag.prefix}/@{module}/**"
+ includeAntRuntime="false"
+ encoding="UTF-8"
+ source="${target.sourcelevel}"
+ target="${target.targetlevel}"
+ bootclasspath="${target.rt.jar}">
+ <src path="${nativejarfile.tmpdir}/java" />
+ </javac>
+ <jar destfile="@{nativejarfile}" manifest="@{manifestfile}" filesonly="true">
+ <fileset dir="${nativejarfile.tmpdir}/jar">
+ <include name="**" />
+ </fileset>
+ </jar>
+ <delete includeEmptyDirs="true">
+ <fileset dir="${nativejarfile.tmpdir}" />
+ </delete>
+ </sequential>
+ </macrodef>
</project>