maven-plugins/native/plugin.jelly
ltheussl 3f7d6ae692 PR: MPNATIVE-12
Create .lib with full name


git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@368490 13f79535-47bb-0310-9956-ffa450edef68
2006-01-12 22:04:55 +00:00

298 lines
14 KiB
XML

<?xml version="1.0"?>
<!--
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<project xmlns:j="jelly:core" xmlns:util="jelly:util" xmlns:ant="jelly:ant">
<!--==================================================================-->
<!-- Compile all source code -->
<!--==================================================================-->
<goal name="native" description="Native compiler" prereqs="native:compile"/>
<!--==================================================================-->
<!-- Compile all source code -->
<!--==================================================================-->
<goal name="native:compile" description="Compile the native compiler" prereqs="native:jniheader">
<path id="native.classpath">
<pathelement location="${plugin.getDependencyPath('ant-contrib:cpptasks')}" />
<pathelement location="${plugin.getDependencyPath('bcel:bcel')}" />
</path>
<taskdef name="cc" classname="net.sf.antcontrib.cpptasks.CCTask" classpathref="native.classpath"/>
<typedef name="linker" classname="net.sf.antcontrib.cpptasks.LinkerDef" classpathref="native.classpath"/>
<typedef name="compiler" classname="net.sf.antcontrib.cpptasks.CompilerDef" classpathref="native.classpath"/>
<ant:echo> Real Java Home = '${java.home}/..'
artifactId = '${pom.artifactId}' </ant:echo>
<mkdir dir="${maven.build.dir}/native"/>
<ant:available property="jniFilesPresent" file="${maven.build.dir}/native/jni"/>
<!-- for some reason '.' aren't allow as parameter for outfile-->
<!-- 17 Dec 2004 - baleineca
Checking for runtime property and adding it. Default to "dynamic" if not present.
Seems like this is the only way at time of writing to get ccTask to pass something else than the default /MD arg to cl.
-->
<j:set var="runtime" value="${maven.native.runtime}"/>
<j:if test="${runtime} == ''">
<j:set var="runtime" value="dynamic"/>
</j:if>
<cc outfile="${maven.build.dir}/native/_" link="${maven.native.link}" debug="${maven.native.debug}" runtime="${runtime}" rtti="${rtti}">
<compiler name="${maven.native.compiler.name}">
<compilerparam name="target" value="${maven.native.compiler.target}"/>
<util:tokenize var="argumentList" delim=" " trim="true">${maven.native.compiler.arg.start}</util:tokenize>
<j:forEach var="arg" items="${argumentList}">
<compilerarg location="start" value="${arg}"/>
</j:forEach>
<util:tokenize var="argumentList" delim=" " trim="true">${maven.native.compiler.arg.mid}</util:tokenize>
<j:forEach var="arg" items="${argumentList}">
<compilerarg location="mid" value="${arg}"/>
</j:forEach>
<util:tokenize var="argumentList" delim=" " trim="true">${maven.native.compiler.arg.end}</util:tokenize>
<j:forEach var="arg" items="${argumentList}">
<compilerarg location="end" value="${arg}"/>
</j:forEach>
</compiler>
<linker name="${maven.native.linker.name}">
<linkerparam name="target" value="${maven.native.linker.target}"/>
<util:tokenize var="argumentList" delim=" " trim="true">${maven.native.linker.arg.start}</util:tokenize>
<j:forEach var="arg" items="${argumentList}">
<linkerarg location="start" value="${arg}"/>
</j:forEach>
<util:tokenize var="argumentList" delim=" " trim="true">${maven.native.linker.arg.mid}</util:tokenize>
<j:forEach var="arg" items="${argumentList}">
<linkerarg location="mid" value="${arg}"/>
</j:forEach>
<util:tokenize var="argumentList" delim=" " trim="true">${maven.native.linker.arg.end}</util:tokenize>
<j:forEach var="arg" items="${argumentList}">
<linkerarg location="end" value="${arg}"/>
</j:forEach>
</linker>
<fileset dir="${maven.native.src}" includes="${maven.native.src.includes}" excludes="${maven.native.src.excludes}"/>
<j:if test="${jniFilesPresent == 'true'}">
<includepath location="${java.home}/../include"/>
<includepath location="${java.home}/../include/${maven.native.include.os}"/>
<includepath location="${maven.build.dir}/native/jni"/>
</j:if>
<util:tokenize var="includePathList" delim=" " trim="true">${maven.native.compile.includepath}</util:tokenize>
<j:forEach var="includePath" items="${includePathList}">
<includepath location="${includePath}"/>
</j:forEach>
<util:tokenize var="sysincludePathList" delim=" " trim="true">${maven.native.compile.sysincludepath}</util:tokenize>
<j:forEach var="sysincludePath" items="${sysincludePathList}">
<sysincludepath location="${sysincludePath}"/>
</j:forEach>
<!-- add depended libraries -->
<j:forEach var="lib" items="${pom.artifacts}">
<j:set var="dep" value="${lib.dependency}"/>
<!-- include static and dynamic libraries for various platforms (so, a, dll, lib) -->
<j:if test="${dep.type=='so' or dep.type=='dll' or dep.type=='a' or dep.type=='lib'}">
<j:set var="libname" value="${dep.artifactId}"/>
<!-- remove ${delim} prefix in the name -->
<!-- only 'so' and 'a' type, we could have a name starting with 'lib'. -->
<j:if test="${dep.type=='so' or dep.type=='a'}">
<j:set var="delim" value="lib"/>
<j:set var="libname" value="${libname.substring(delim.length())}"/>
</j:if>
<!-- use syslibst or libset -->
<j:if test="${dep.getProperty('native.syslib') != 'true'}">
<libset dir="${lib.file.parent}" libs="${libname}-${dep.version}"/>
</j:if>
<j:if test="${dep.getProperty('native.syslib') == 'true'}">
<syslibset dir="${lib.file.parent}" libs="${libname}-${dep.version}"/>
</j:if>
</j:if>
</j:forEach>
</cc>
<!-- just copy the file don't move because we don't want the compiler to compile if for no reason -->
<!-- so -->
<ant:available property="outputPresentSO" file="${maven.build.dir}/native/lib_.so"/>
<j:if test="${outputPresentSO == 'true'}">
<ant:copy file="${maven.build.dir}/native/lib_.so"
tofile="${maven.build.dir}/native/lib${pom.artifactId}-${pom.currentVersion}.so" overwrite="true"/>
<!-- needed if cygwin gcc is used -->
<j:if test="${context.getVariable('maven.native.include.os')=='win32'}">
<ant:move file="${maven.build.dir}/native/lib${pom.artifactId}-${pom.currentVersion}.so"
tofile="${maven.build.dir}/native/${pom.artifactId}-${pom.currentVersion}.dll"
overwrite="true"/>
</j:if>
</j:if>
<!-- dll -->
<ant:available property="outputPresentDLL" file="${maven.build.dir}/native/_.dll"/>
<j:if test="${outputPresentDLL == 'true'}">
<ant:copy file="${maven.build.dir}/native/_.dll"
tofile="${maven.build.dir}/native/${pom.artifactId}-${pom.currentVersion}.dll" overwrite="true"/>
<ant:available property="outputPresentLIB" file="${maven.build.dir}/native/_.lib"/>
<j:if test="${outputPresentLIB == 'true'}">
<ant:copy file="${maven.build.dir}/native/_.lib"
tofile="${maven.build.dir}/native/${pom.artifactId}-${pom.currentVersion}.lib" overwrite="true"/>
</j:if>
</j:if>
<!-- dylib -->
<ant:available property="outputPresentDylib" file="${maven.build.dir}/native/lib_.dylib"/>
<j:if test="${outputPresentDylib == 'true'}">
<ant:copy file="${maven.build.dir}/native/lib_.dylib"
tofile="${maven.build.dir}/native/lib${pom.artifactId}-${pom.currentVersion}.jnilib" overwrite="true"/>
</j:if>
</goal>
<!-- ================================================================== -->
<!-- I N S T A L L L I B -->
<!-- ================================================================== -->
<goal name="native:install" prereqs="native:compile" description="Install the lib in the local repository">
<ant:echo>
id = '${pom.artifactId}'
groupId = '${pom.groupId}'
artifactDirectory = '${pom.artifactDirectory}'
</ant:echo>
<!-- so -->
<ant:available property="libPresentSO" file="${maven.build.dir}/native/lib${pom.artifactId}-${pom.currentVersion}.so"/>
<j:if test="${libPresentSO == 'true'}">
<ant:property name="libdir__" value="${maven.repo.local}/${pom.artifactDirectory}/sos"/>
<ant:mkdir dir="${libdir__}"/>
<ant:copy file="${maven.build.dir}/native/lib${pom.artifactId}-${pom.currentVersion}.so" tofile="${libdir__}/lib${pom.artifactId}-${pom.currentVersion}.so" overwrite="true"/>
</j:if>
<!-- dll -->
<ant:available property="libPresentDLL" file="${maven.build.dir}/native/${pom.artifactId}-${pom.currentVersion}.dll"/>
<j:if test="${libPresentDLL == 'true'}">
<ant:property name="libdir__" value="${maven.repo.local}/${pom.artifactDirectory}/dlls"/>
<ant:mkdir dir="${libdir__}"/>
<ant:copy file="${maven.build.dir}/native/${pom.artifactId}-${pom.currentVersion}.dll" tofile="${libdir__}/${pom.artifactId}-${pom.currentVersion}.dll" overwrite="true"/>
</j:if>
<!-- jnilib -->
<ant:available property="libPresentJnilib" file="${maven.build.dir}/native/lib${pom.artifactId}-${pom.currentVersion}.jnilib"/>
<j:if test="${libPresentJnilib == 'true'}">
<ant:property name="libdir__" value="${maven.repo.local}/${pom.artifactDirectory}/jnilibs"/>
<ant:mkdir dir="${libdir__}"/>
<ant:copy file="${maven.build.dir}/native/lib${pom.artifactId}-${pom.currentVersion}.jnilib" tofile="${libdir__}/lib${pom.artifactId}-${pom.currentVersion}.jnilib" overwrite="true"/>
</j:if>
</goal>
<!-- ================================================================== -->
<!-- R U N J A V A H -->
<!-- ================================================================== -->
<goal name="native:jniheader" description="make jniheaders for classes" prereqs="java:compile">
<fileScanner var="classFiles">
<fileset dir="${maven.build.dest}">
<patternset>
<include name="**/*.class"/>
</patternset>
</fileset>
</fileScanner>
<!--do we need to run javah -->
<j:set var="compileJNI" value="false"/>
<j:useBean var="javaSourceTool" class="org.apache.maven.natives.util.JavaSourceTool"/>
<j:forEach var="file" items="${classFiles.iterator()}">
<j:set var="clazz" value="${javaSourceTool.getBcelClass(file.toString())}"/>
<j:forEach var="method" items="${clazz.getMethods()}">
<j:if test="${method.isNative() == 'true'}">
<j:set var="compileJNI" value="true"/>
</j:if>
</j:forEach>
</j:forEach>
<!-- Determine classpath to pass to javah -->
<j:set var="depclasspath" value=""/>
<j:forEach var="lib" items="${pom.artifacts}">
<j:set var="dep" value="${lib.dependency}"/>
<j:if test="${dep.getProperty('native.ignorejniheader')!='false'}">
<j:if test="${dep.type =='jar'}">
<j:set var="depclasspath" value="${depclasspath}${systemScope.getProperty('path.separator')}${lib.path}"/>
</j:if>
</j:if>
</j:forEach>
<j:if test="${compileJNI == 'true'}">
<ant:echo>Running Javah on java classes</ant:echo>
<mkdir dir="${maven.build.dir}/native/jni"/>
<!-- need ANT 1.6
<javah destdir="${maven.build.dir}/native/jni">
<classpath>
<pathelement location="${maven.build.dest}"/>
</classpath>
<j:forEach var="file" items="${classFiles.iterator()}">
<j:set var="isNative" value="false"/>
<j:set var="clazz" value="${javaSourceTool.getBcelClass(file.toString())}"/>
<j:forEach var="method" items="${clazz.getMethods()}">
<j:if test="${method.isNative() == 'true'}">
<j:set var="isNative" value="true"/>
</j:if>
</j:forEach>
<j:if test="${isNative == 'true'}">
<class name="${clazz.className}"/>
</j:if>
</j:forEach>
</javah> -->
<!-- workaround -->
<property environment="env"/>
<exec executable="${env.JAVA_HOME}/bin/javah">
<arg line="-d ${maven.build.dir}/native/jni"/>
<arg line="-classpath ${maven.build.dest}${depclasspath}"/>
<j:forEach var="file" items="${classFiles.iterator()}">
<j:set var="isNative" value="false"/>
<j:set var="clazz" value="${javaSourceTool.getBcelClass(file.toString())}"/>
<j:forEach var="method" items="${clazz.getMethods()}">
<j:if test="${method.isNative() == 'true'}">
<j:set var="isNative" value="true"/>
</j:if>
</j:forEach>
<j:if test="${isNative == 'true'}">
<arg value="${clazz.className}"/>
</j:if>
</j:forEach>
</exec>
</j:if>
</goal>
</project>