blob: 1d9769ea90ee45ad8e62644a52ac3059f7b4ef61 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 basedir="." default="jar" name="freemarker"
xmlns:ivy="antlib:org.apache.ivy.ant"
xmlns:javacc="http://javacc.dev.java.net/"
xmlns:docgen="http://freemarker.org/docgen"
xmlns:bnd="http://www.aqute.biz/bnd"
xmlns:rat="antlib:org.apache.rat.anttasks"
xmlns:u="http://freemarker.org/util"
>
<!-- ================================================================== -->
<!-- Properties -->
<!-- ================================================================== -->
<!-- Ivy project coordinates: -->
<property name="moduleOrg" value="org.freemarker" />
<property name="moduleName" value="freemarker" />
<property name="moduleBranch" value="2.3" />
<!-- Will be overidden on the Continous Integration server: -->
<property name="server.ivy.repo.root" value="${basedir}/build/dummy-server-ivy-repo" />
<property file="build.properties"/>
<condition property="has.explicit.boot.classpath.j2se1.5">
<isset property="boot.classpath.j2se1.5"/>
</condition>
<condition property="has.explicit.boot.classpath.j2se1.6">
<isset property="boot.classpath.j2se1.6"/>
</condition>
<condition property="has.all.explicit.boot.classpaths">
<and>
<isset property="has.explicit.boot.classpath.j2se1.5"/>
<isset property="has.explicit.boot.classpath.j2se1.6"/>
</and>
</condition>
<available property="atLeastJDK8" classname="java.util.function.Predicate"/>
<!-- When boot.classpath.j2se* is missing, these will be the defaults: -->
<!-- Note: Target "dist" doesn't allow using these. -->
<property name="boot.classpath.j2se1.5" value="${sun.boot.class.path}" />
<property name="boot.classpath.j2se1.6" value="${sun.boot.class.path}" />
<!-- For checking the correctness of the boot.classpath.j2se* -->
<available classpath="${boot.classpath.j2se1.5}"
classname="java.util.concurrent.ConcurrentHashMap" ignoresystemclasses="true"
property="boot.classpath.j2se1.5.correct"
/>
<available classpath="${boot.classpath.j2se1.6}"
classname="java.util.ServiceLoader" ignoresystemclasses="true"
property="boot.classpath.j2se1.6.correct"
/>
<!-- Set up version/timestamp filters and the version property: -->
<tstamp>
<format property="timestampNice" pattern="yyyy-MM-dd'T'HH:mm:ss'Z'"
timezone="UTC" />
<format property="timestampInVersion" pattern="yyyyMMdd'T'HHmmss'Z'"
timezone="UTC" />
</tstamp>
<filter token="timestampInVersion" value="${timestampInVersion}" />
<filter token="timestampNice" value="${timestampNice}" />
<mkdir dir="build"/>
<!-- Copying is needed to substitute the timestamps. -->
<copy
file="src/main/resources/freemarker/version.properties"
tofile="build/version.properties.tmp"
filtering="true"
overwrite="true"
/>
<property file="build/version.properties.tmp" />
<delete file="build/version.properties.tmp" />
<filter token="version" value="${version}" />
<property name="dist.dir" value="build/dist" />
<!-- ================================================================== -->
<!-- Initialization -->
<!-- ================================================================== -->
<target name="clean" description="get rid of all generated files">
<delete dir="build" />
</target>
<target name="clean-classes" description="get rid of compiled classes">
<delete dir="build/classes" />
<delete dir="build/test-classes" />
<delete dir="build/coverage/classes" />
</target>
<condition property="deps.available">
<available file=".ivy" />
</condition>
<target name="init" depends="_autoget-deps"
description="Fetch dependencies if any are missing and create the build directory if necessary"
>
<mkdir dir="build"/>
</target>
<!-- ================================================================= -->
<!-- Compilation -->
<!-- ================================================================= -->
<target name="javacc" depends="init" unless="parser.uptodate"
description="Build the parser from its grammar file"
>
<ivy:cachepath conf="parser" pathid="ivy.dep" />
<taskdef name="generate" classname="org.apache.tools.ant.taskdefs.optional.javacc.JavaCC"
uri="http://javacc.dev.java.net/"
classpathref="ivy.dep"
/>
<property name="_javaccOutputDir"
value="build/generated-sources/java/freemarker/core/"
/>
<mkdir dir="${_javaccOutputDir}" />
<ivy:retrieve conf="parser" pattern="build/javacc-home.tmp/[artifact].[ext]" />
<javacc:generate
target="src/main/javacc/FTL.jj"
outputdirectory="${_javaccOutputDir}"
javacchome="build/javacc-home.tmp"
/>
<delete dir="build/javacc-home.tmp" />
<replace
file="${_javaccOutputDir}/FMParser.java"
token="private final LookaheadSuccess"
value="private static final LookaheadSuccess"
/>
<replace
file="${_javaccOutputDir}/FMParserConstants.java"
token="public interface FMParserConstants"
value="interface FMParserConstants"
/>
<replace
file="${_javaccOutputDir}/FMParserTokenManager.java"
token="public class FMParserTokenManager"
value="class FMParserTokenManager"
/>
<replace
file="${_javaccOutputDir}/Token.java"
token="public class Token"
value="class Token"
/>
<replace
file="${_javaccOutputDir}/SimpleCharStream.java"
token="public final class SimpleCharStream"
value="final class SimpleCharStream"
/>
<replace
file="${_javaccOutputDir}/FMParser.java"
token="enum"
value="ENUM"
/>
<!-- As we have a modified version in src/main/java: -->
<move
file="${_javaccOutputDir}/ParseException.java"
tofile="${_javaccOutputDir}/ParseException.java.ignore"
/>
<move
file="${_javaccOutputDir}/TokenMgrError.java"
tofile="${_javaccOutputDir}/TokenMgrError.java.ignore"
/>
</target>
<target name="compile" depends="javacc">
<fail unless="boot.classpath.j2se1.5.correct"><!--
-->The "boot.classpath.j2se1.5" property value (${boot.classpath.j2se1.5}) <!--
-->seems to be an incorrect boot classpath. Please fix it in <!--
-->the &lt;projectDir>/build.properties file, or wherever you <!--
-->set it.<!--
--></fail>
<fail unless="boot.classpath.j2se1.6.correct"><!--
-->The "boot.classpath.j2se1.6" property value (${boot.classpath.j2se1.6}) <!--
-->seems to be an incorrect boot classpath. Please fix it in <!--
-->the &lt;projectDir>/build.properties file, or wherever you <!--
-->set it.<!--
--></fail>
<echo level="info"><!--
-->Using boot classpaths:<!--
-->Java 5: ${boot.classpath.j2se1.5}; <!--
-->Java 6: ${boot.classpath.j2se1.6}<!--
--></echo>
<mkdir dir="build/classes" />
<!-- Note: the "build.base" conf doesn't include optional FreeMarker dependencies. -->
<ivy:cachepath conf="build.base" pathid="ivy.dep" />
<javac destdir="build/classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpathref="ivy.dep"
bootclasspath="${boot.classpath.j2se1.5}"
excludes="
freemarker/core/_Java6Impl.java,
freemarker/ext/jsp/**,
freemarker/ext/servlet/**,
freemarker/cache/WebappTemplateLoader.java,
freemarker/ext/jython/**,
freemarker/template/utility/JythonRuntime.java,
freemarker/ext/ant/**"
>
<src>
<pathelement location="src/main/java" />
<pathelement location="build/generated-sources" />
</src>
</javac>
<ivy:cachepath conf="build.base" pathid="ivy.dep" />
<javac srcdir="src/main/java" destdir="build/classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpathref="ivy.dep"
bootclasspath="${boot.classpath.j2se1.6}"
includes="freemarker/core/_Java6Impl.java"
/>
<rmic
base="build/classes" includes="freemarker/debug/impl/Rmi*Impl.class"
classpathref="ivy.dep"
verify="yes" stubversion="1.2"
/>
<ivy:cachepath conf="build.jsp2.0" pathid="ivy.dep.jsp2.0" />
<javac srcdir="src/main/java" destdir="build/classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpathref="ivy.dep.jsp2.0"
bootclasspath="${boot.classpath.j2se1.5}"
includes="
freemarker/ext/jsp/**,
freemarker/ext/servlet/**,
freemarker/cache/WebappTemplateLoader.java"
excludes="
freemarker/ext/jsp/_FreeMarkerPageContext21.java,
freemarker/ext/jsp/FreeMarkerJspFactory21.java,
freemarker/ext/jsp/FreeMarkerJspApplicationContext.java"
/>
<!-- There's no build.jsp2.0, as those classes are part of the common build subset. -->
<ivy:cachepath conf="build.jsp2.1" pathid="ivy.dep.jsp2.1" />
<javac srcdir="src/main/java" destdir="build/classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpathref="ivy.dep.jsp2.1"
bootclasspath="${boot.classpath.j2se1.5}"
includes="
freemarker/ext/jsp/_FreeMarkerPageContext21.java,
freemarker/ext/jsp/FreeMarkerJspFactory21.java,
freemarker/ext/jsp/FreeMarkerJspApplicationContext.java"
/>
<ivy:cachepath conf="build.jython2.0" pathid="ivy.dep.jython2.0" />
<javac srcdir="src/main/java" destdir="build/classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpathref="ivy.dep.jython2.0"
bootclasspath="${boot.classpath.j2se1.5}"
includes="
freemarker/ext/ant/**,
freemarker/template/utility/JythonRuntime.java,
freemarker/ext/jython/**"
excludes="
freemarker/ext/jython/_Jython22VersionAdapter.java,
freemarker/ext/jython/_Jython25VersionAdapter.java"
/>
<ivy:cachepath conf="build.jython2.2" pathid="ivy.dep.jython2.2" />
<javac srcdir="src/main/java" destdir="build/classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpathref="ivy.dep.jython2.2"
bootclasspath="${boot.classpath.j2se1.5}"
includes="
freemarker/ext/jython/_Jython22VersionAdapter.java"
/>
<ivy:cachepath conf="build.jython2.5" pathid="ivy.dep.jython2.5" />
<javac srcdir="src/main/java" destdir="build/classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpathref="ivy.dep.jython2.5"
bootclasspath="${boot.classpath.j2se1.5}"
includes="
freemarker/ext/jython/_Jython25VersionAdapter.java"
/>
<rmic base="build/classes" classpathref="ivy.dep"
includes="src/main/java/freemarker/debug/impl/Rmi*Impl.class"
verify="yes" stubversion="1.2"
/>
<!-- We don't have this file in 2.4.X... yet?
<copy
file="build/classes/freemarker/core/SecureRendererImpl.class"
tofile="build/classes/freemarker/core/SecureRendererImpl.clazz"
/>
-->
<copy toDir="build/classes">
<fileset dir="src/main/resources"
excludes="
freemarker/version.properties"
/>
</copy>
<copy toDir="build/classes" filtering="true" overwrite="true">
<fileset dir="src/main/resources"
includes="
freemarker/version.properties"
/>
</copy>
<copy toDir="build/classes/META-INF">
<fileset dir="."
includes="
LICENSE.txt,
NOTICE.txt"
/>
</copy>
</target>
<target name="compileTest" depends="compile">
<mkdir dir="build/test-classes" />
<ivy:cachepath conf="build.test" pathid="ivy.dep.build.test" />
<javac srcdir="src/test/java" destdir="build/test-classes" deprecation="off"
debug="on" optimize="off" target="1.5" source="1.5" encoding="utf-8"
includeantruntime="false"
classpath="build/classes"
classpathref="ivy.dep.build.test"
bootclasspath="${boot.classpath.j2se1.6}"
/>
<copy toDir="build/test-classes">
<fileset dir="src/test/resources"
excludes=""
/>
</copy>
</target>
<target name="jar" depends="compile">
<ivy:cachepath pathid="ivy.dep" conf="bnd" />
<taskdef resource="aQute/bnd/ant/taskdef.properties"
uri="http://www.aqute.biz/bnd"
classpathref="ivy.dep"
/>
<!-- Hack: This file should be excluded, but I can't explain that to bnd. -->
<!-- We don't have this file in 2.4.X... yet?
<move
file="build/classes/freemarker/core/SecureRendererImpl.class"
tofile="build/SecureRendererImpl.class.tmp"
preservelastmodified="true" overwrite="true"
/>
-->
<bnd:bnd
files="osgi.bnd" eclipse="false"
output="build/freemarker.jar"
/>
<!-- Revert previous hack... -->
<!-- We don't have this file in 2.4.X... yet?
<move
file="build/SecureRendererImpl.class.tmp"
tofile="build/classes/freemarker/core/SecureRendererImpl.class"
preservelastmodified="true" overwrite="true"
/>
-->
</target>
<!-- ================================================================= -->
<!-- Testing -->
<!-- ================================================================= -->
<target name="test" depends="compileTest" description="Run test cases">
<mkdir dir="build/junit-reports" />
<ivy:cachepath conf="run.test" pathid="ivy.dep.run.test" />
<junit haltonfailure="on" fork="true" forkmode="once">
<classpath>
<pathelement path="build/test-classes" />
<pathelement path="build/classes" />
<path refid="ivy.dep.run.test" />
</classpath>
<formatter type="plain" />
<formatter type="xml" />
<batchtest todir="build/junit-reports">
<fileset dir="src/test/java">
<include name="**/*Test.java" />
<include name="**/*TestSuite.java" />
<exclude name="**/Abstract*.java" />
</fileset>
</batchtest>
</junit>
</target>
<!-- ================================================================= -->
<!-- Generate docs -->
<!-- ================================================================= -->
<target depends="javacc" name="_rawJavadoc">
<!-- depends="javacc" is needed as its output is referred in the docs. -->
<mkdir dir="build/api" />
<delete includeEmptyDirs="yes">
<fileset dir="build/api" includes="**/*" />
</delete>
<!-- javadoc with <fileset> has bugs, so we create a filtered copy: -->
<copy todir="build/javadoc-sources">
<fileset dir="src/main/java">
<exclude name="**/_*.java" />
<exclude name="**/SunInternalXalanXPathSupport.java" />
<!-- Remove classes that are, I suppose, only accidentally public: -->
<exclude name="**/core/LocalContext.java" />
<exclude name="**/core/CollectionAndSequence.java" />
<exclude name="**/core/Comment.java" />
<exclude name="**/core/DebugBreak.java" />
<exclude name="**/core/Expression.java" />
<exclude name="**/core/LibraryLoad.java" />
<exclude name="**/core/Macro.java" />
<exclude name="**/core/ReturnInstruction.java" />
<exclude name="**/core/StringArraySequence.java" />
<exclude name="**/core/TemplateElement.java" />
<exclude name="**/core/TemplateObject.java" />
<exclude name="**/core/TextBlock.java" />
<exclude name="**/core/ReturnInstruction.java" />
<exclude name="**/core/TokenMgrError.java" />
<exclude name="**/template/EmptyMap.java" />
<exclude name="**/log/SLF4JLoggerFactory.java" />
<exclude name="**/log/CommonsLoggingLoggerFactory.java" />
</fileset>
</copy>
<!-- conf="IDE": as that has to contain all depedencies -->
<ivy:cachepath conf="IDE" pathid="ivy.dep" />
<javadoc
sourcepath="build/javadoc-sources"
destdir="build/api"
doctitle="FreeMarker ${version}"
packagenames="
freemarker.debug, freemarker.template.*,
freemarker.core.*, freemarker.ext.*,
freemarker.cache.*, freemarker.log.*"
use="true"
version="true"
author="true"
windowtitle="FreeMarker ${version} API"
classpath="build/classes"
classpathref="ivy.dep"
failonerror="true"
charset="UTF-8"
docencoding="UTF-8"
locale="en_US"
>
<link href="http://docs.oracle.com/javase/8/docs/api/"/>
</javadoc>
<delete dir="build/javadoc-sources" />
</target>
<target name="javadoc" depends="_rawJavadoc, _fixJDK8JavadocCSS" description="Build the JavaDocs" />
<target name="_fixJDK8JavadocCSS" depends="_rawJavadoc" if="atLeastJDK8">
<property name="file" value="build/api/stylesheet.css" />
<available file="${file}" property="stylesheet.available"/>
<fail unless="stylesheet.available">CSS file not found: ${file}</fail>
<echo>Fixing JDK 8 CSS in ${file}</echo>
<!-- Tell that it's modified: -->
<replaceregexp
file="${file}" flags="gs" encoding="utf-8"
match="/\* (Javadoc style sheet) \*/" replace="/\* \1 - JDK 8 usability fix regexp substitutions applied \*/"
/>
<!-- Remove broken link: -->
<replaceregexp
file="${file}" flags="gs" encoding="utf-8"
match="@import url\('resources/fonts/dejavu.css'\);\s*" replace=""
/>
<!-- Font family fixes: -->
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="['&quot;]DejaVu Sans['&quot;]" replace="Arial"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="['&quot;]DejaVu Sans Mono['&quot;]" replace="'Courier New'"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="['&quot;]DejaVu Serif['&quot;]" replace="Arial"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?&lt;=[\s,:])serif\b" replace="sans-serif"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?&lt;=[\s,:])Georgia,\s*" replace=""
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="['&quot;]Times New Roman['&quot;],\s*" replace=""
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?&lt;=[\s,:])Times,\s*" replace=""
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?&lt;=[\s,:])Arial\s*,\s*Arial\b" replace="Arial"
/>
<!-- "Parameters:", "Returns:", "Throws:", "Since:", "See also:" etc. fixes: -->
<property name="ddSelectorStart" value="(?:\.contentContainer\s+\.(?:details|description)|\.serializedFormContainer)\s+dl\s+dd\b.*?\{[^\}]*\b" />
<property name="ddPropertyEnd" value="\b.+?;" />
<!-- - Put back description (dd) indentation: -->
<replaceregexp
file="${file}" flags="gs" encoding="utf-8"
match="(${ddSelectorStart})margin${ddPropertyEnd}" replace="\1margin: 5px 0 10px 20px;"
/>
<!-- - No monospace font for the description (dd) part: -->
<replaceregexp
file="${file}" flags="gs" encoding="utf-8"
match="(${ddSelectorStart})font-family${ddPropertyEnd}" replace="\1"
/>
</target>
<!-- ====================== -->
<!-- Manual -->
<!-- ====================== -->
<macrodef name="manual" uri="http://freemarker.org/util">
<attribute name="offline" />
<attribute name="locale" />
<sequential>
<ivy:cachepath conf="manual" pathid="ivy.dep" />
<taskdef resource="org/freemarker/docgen/antlib.properties"
uri="http://freemarker.org/docgen"
classpathref="ivy.dep"
/>
<docgen:transform
srcdir="src/manual/@{locale}" destdir="build/manual/@{locale}"
offline="@{offline}"
/>
</sequential>
</macrodef>
<target name="manualOffline" depends="init" description="Build the Manual for offline use" >
<u:manual offline="true" locale="en_US" />
</target>
<target name="manualFreemarkerOrg" depends="init" description="Build the Manual to be upload to freemarker.org" >
<u:manual offline="false" locale="en_US" />
</target>
<target name="manualOffline_zh_CN" depends="init" description="Build the Manual for offline use" >
<u:manual offline="true" locale="zh_CN" />
</target>
<target name="manualFreemarkerOrg_zh_CN" depends="init" description="Build the Manual to be upload to freemarker.org" >
<u:manual offline="false" locale="zh_CN" />
</target>
<!-- ====================== -->
<!-- Distributuion building -->
<!-- ====================== -->
<target name="dist"
description="Build the FreeMarker distribution files"
>
<fail
unless="has.all.explicit.boot.classpaths"
message="All boot.classpath properties must be set in build.properties for dist!"
/>
<fail unless="atLeastJDK8" message="The release should be built with JDK 8+ (you may need to set JAVA_HOME)" />
<antcall target="clean" /> <!-- To improve the reliability -->
<antcall target="_dist" />
</target>
<target name="_dist"
depends="jar, javadoc, manualOffline"
>
<!-- Copy jars and sources and such into the distro -->
<delete dir="${dist.dir}" />
<mkdir dir="${dist.dir}/bin" />
<mkdir dir="${dist.dir}/src" />
<!-- ..................................... -->
<!-- Binary distribution -->
<!-- ..................................... -->
<!-- Copy txt-s -->
<copy todir="${dist.dir}/bin" includeEmptyDirs="no">
<fileset dir="." defaultexcludes="no">
<include name="README" />
<include name="DISCLAIMER" />
<include name="RELEASE-NOTES" />
<!-- LICENSE and NOTICE are binary-distribution-specific, and are copied later. -->
</fileset>
</copy>
<replace
file="${dist.dir}/bin/README"
token="{version}"
value="${version}"
/>
<!-- Copy binary-distribution-specific files: -->
<copy todir="${dist.dir}/bin/">
<fileset dir="src/dist/bin/" />
</copy>
<!-- Copy binary -->
<copy file="build/freemarker.jar" tofile="${dist.dir}/bin/freemarker.jar" />
<!-- Copy documentation -->
<mkdir dir="${dist.dir}/bin/documentation" />
<!--
The US English Manual is the source of any translations and thus it's the
only one that is guaranteed to be up to date when doing the release, so we
only pack that into it.
-->
<copy todir="${dist.dir}/bin/documentation/_html" includeEmptyDirs="no">
<fileset dir="build/manual/en_US" />
</copy>
<copy todir="${dist.dir}/bin/documentation/_html/api" includeEmptyDirs="no">
<fileset dir="build/api" />
</copy>
<!-- Package -->
<property name="bin.tar" value="build/dist/apache-freemarker-gae-${version}-bin.tar" />
<property name="bin.gzip" value="${bin.tar}.gz" />
<delete file="${bin.tar}" />
<tar tarfile="${bin.tar}" basedir="${dist.dir}/bin" />
<delete file="${bin.gzip}" />
<gzip zipfile="${bin.gzip}" src="${bin.tar}" />
<delete file="${bin.tar}" />
<!-- Sign and hash: -->
<!-- TODO -->
<!-- ..................................... -->
<!-- Source distribution -->
<!-- ..................................... -->
<!-- Copy txt-s -->
<copy todir="${dist.dir}/src" includeEmptyDirs="no">
<fileset dir="." defaultexcludes="no">
<include name="README" />
<include name="LICENSE" />
<include name="NOTICE" />
<include name="DISCLAIMER" />
<include name="RELEASE-NOTES" />
</fileset>
</copy>
<replace
file="${dist.dir}/src/README"
token="{version}"
value="${version}"
/>
<copy todir="${dist.dir}/src" includeEmptyDirs="no">
<fileset dir="." defaultexcludes="no">
<exclude name="**/*.bak" />
<exclude name="**/*.~*" />
<exclude name="**/*.*~" />
<include name="src/**" />
<include name="examples/**" />
<include name=".settings/**" />
<include name="*.xml" />
<include name="*.sample" />
<include name="*.txt" />
<include name="osgi.bnd" />
<include name=".classpath" />
<include name=".project" />
<include name=".git*" />
</fileset>
</copy>
<!-- Package -->
<property name="src.tar" value="build/dist/apache-freemarker-gae-${version}-src.tar" />
<property name="src.gzip" value="${src.tar}.gz" />
<delete file="${src.tar}" />
<tar tarfile="${src.tar}" basedir="${dist.dir}/src" />
<delete file="${src.gzip}" />
<gzip zipfile="${src.gzip}" src="${src.tar}" />
<delete file="${src.tar}" />
<!-- Sign and hash: -->
<!-- TODO -->
</target>
<target name="maven-pom">
<echo file="build/pom.xml"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>9</version>
</parent>
<groupId>org.freemarker</groupId>
<artifactId>freemarker-gae</artifactId>
<version>${mavenVersion}</version>
<packaging>jar</packaging>
<name>FreeMarker</name>
<description>
Google App Engine compliant variation of FreeMarker.
FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
</description>
<url>http://freemarker.org/</url>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://freemarker.org/LICENSE.txt</url>
</license>
</licenses>
<scm>
<connection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-freemarker.git</connection>
<developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/maven.git</developerConnection>
<!-- <url>https://github.com/apache/freemarker/tree/${project.scm.tag}</url> -->
<tag>2.3-gae</tag>
</scm>
<developers>
<developer>
<name>Attila Szegedi</name>
</developer>
<developer>
<name>Daniel Dekany</name>
<email>ddekany@apache.org</email>
</developer>
<developer>
<name>Jonathan Revusky</name>
</developer>
</developers>
<dependencies>
<!-- no required dependencies -->
</dependencies>
</project>
]]></echo>
</target>
<!--
Uploads the freemarker.jar that is in the current DISTRIBUTION DIRECTORY
to a Maven repository (snapshot or central).
Use this after "dist" (without interleaving "clean").
-->
<target name="maven-dist" depends="maven-pom"
description="Releases the already built distro to a Maven repository">
<jar destfile="build/maven-source-attachment.jar">
<fileset dir="${dist.dir}/source/src/main/java" />
<fileset dir="${dist.dir}/source/src/main/resources" />
</jar>
<jar destfile="build/maven-javadoc-attachment.jar">
<fileset dir="${dist.dir}/documentation/_html/api" />
</jar>
<property name="maven-server-id" value="ossrh" />
<property name="maven-repository-url" value="https://oss.sonatype.org/service/local/staging/deploy/maven2/" />
<!--
Don't deploy to public snapshot repositories here!
It isn't backward compatible as version ranges will pick them up.
-->
<input
validargs="y,n"
addproperty="mavenUpload.answer"
>
You are about uploading
${dist.dir}/freemarker.jar
and its attachments to this Maven repository:
${maven-repository-url}
with Maven artifact version number ${mavenVersion}.
Note that it's assumed that you have run `ant dist` just before this.
Proceed? </input>
<condition property="mavenUpload.yes">
<equals arg1="y" arg2="${mavenUpload.answer}"/>
</condition>
<fail unless="mavenUpload.yes" message="Task aborted by user." />
<!-- Sign and deploy the main artifact -->
<exec executable="${mvnCommand}">
<arg value="org.apache.maven.plugins:maven-gpg-plugin:1.3:sign-and-deploy-file" />
<arg value="-Durl=${maven-repository-url}" />
<arg value="-DrepositoryId=${maven-server-id}" />
<arg value="-DpomFile=build/pom.xml" />
<arg value="-Dfile=${dist.dir}/freemarker.jar" />
<arg value="-Pgpg" />
</exec>
<!-- Sign and deploy the sources artifact -->
<exec executable="${mvnCommand}">
<arg value="org.apache.maven.plugins:maven-gpg-plugin:1.3:sign-and-deploy-file" />
<arg value="-Durl=${maven-repository-url}" />
<arg value="-DrepositoryId=${maven-server-id}" />
<arg value="-DpomFile=build/pom.xml" />
<arg value="-Dfile=build/maven-source-attachment.jar" />
<arg value="-Dclassifier=sources" />
<arg value="-Pgpg" />
</exec>
<!-- Sign and deploy the javadoc artifact -->
<exec executable="${mvnCommand}">
<arg value="org.apache.maven.plugins:maven-gpg-plugin:1.3:sign-and-deploy-file" />
<arg value="-Durl=${maven-repository-url}" />
<arg value="-DrepositoryId=${maven-server-id}" />
<arg value="-DpomFile=build/pom.xml" />
<arg value="-Dfile=build/maven-javadoc-attachment.jar" />
<arg value="-Dclassifier=javadoc" />
<arg value="-Pgpg" />
</exec>
<echo>*****************************************************************</echo>
<echo>Check the above lines for any Maven errors!</echo>
<echo>Now you have to release the staged repo on</echo>
<echo>https://oss.sonatype.org/.</echo>
<echo>*****************************************************************</echo>
</target>
<!-- ================================================================== -->
<!-- Eclipse -->
<!-- ================================================================== -->
<property name="eclipseFeatureFileName" value="org.freemarker.freemarker.feature_${versionForOSGi}.jar" />
<property name="eclipseSourceFeatureFileName" value="org.freemarker.freemarker.source.feature_${versionForOSGi}.jar" />
<property name="eclipsePluginFileName" value="org.freemarker.freemarker_${versionForOSGi}.jar" />
<property name="eclipseSourcePluginFileName" value="org.freemarker.freemarker.source_${versionForOSGi}.jar" />
<target name="eclipse-update-site" depends="jar">
<delete dir="build/eclipse" />
<!-- Create org.freemarker.freemarker feature: -->
<mkdir dir="build/eclipse/freemarker/plugins" />
<copy
file="build/freemarker.jar"
tofile="build/eclipse/freemarker/plugins/org.freemarker.freemarker_${versionForOSGi}.jar"
/>
<mkdir dir="build/eclipse/freemarker/features/tmp" />
<echo file="build/eclipse/freemarker/features/tmp/feature.xml"><![CDATA[<?xml version="1.0"?>
<feature
id="org.freemarker.freemarker"
label="FreeMarker"
version="${versionForOSGi}">
<description url="http://freemarker.org">
Adds barebone FreeMarker as a plug-in (OSGi bundle) to Eclipse.
</description>
<license><!--
-->Apache License, Version 2.0; see http://freemarker.org/LICENSE.txt.<!--
--></license>
<plugin
id="org.freemarker.freemarker"
download-size="0"
install-size="0"
version="${versionForOSGi}"
unpack="false"
/>
</feature>
]]></echo>
<jar
basedir="build/eclipse/freemarker/features/tmp"
destfile="build/eclipse/freemarker/features/${eclipseFeatureFileName}"
/>
<delete dir="build/eclipse/freemarker/features/tmp" />
<!-- Create org.freemarker.freemarker.source feature: -->
<mkdir dir="build/eclipse/freemarker/plugins" />
<jar
basedir="src/main/java" jarfile="build/eclipse/freemarker/plugins/org.freemarker.freemarker.source_${versionForOSGi}.jar"
>
<manifest>
<attribute name="Bundle-SymbolicName" value="${moduleOrg}.${moduleName}.source" />
<attribute name="Bundle-Version" value="${versionForOSGi}" />
<attribute name="Bundle-License" value="Apache License, Version 2.0" />
<attribute name="Bundle-Vendor" value="freemarker.org" />
<attribute name="Eclipse-SourceBundle" value='org.freemarker.freemarker;version="${versionForOSGi}";roots:="."' />
</manifest>
</jar>
<mkdir dir="build/eclipse/freemarker/features/tmp" />
<echo file="build/eclipse/freemarker/features/tmp/feature.xml"><![CDATA[<?xml version="1.0"?>
<feature
id="org.freemarker.freemarker.source"
label="FreeMarker source"
version="${versionForOSGi}">
<description url="http://freemarker.org">
Adds source code attachment to the barebone FreeMarker plug-in.
</description>
<license><!--
-->Apache License, Version 2.0; see http://freemarker.org/LICENSE.txt.<!--
--></license>
<plugin
id="org.freemarker.freemarker.source"
download-size="0"
install-size="0"
version="${versionForOSGi}"
unpack="false"
/>
</feature>
]]></echo>
<jar
basedir="build/eclipse/freemarker/features/tmp"
destfile="build/eclipse/freemarker/features/${eclipseSourceFeatureFileName}"
/>
<delete dir="build/eclipse/freemarker/features/tmp" />
<!-- Create site: -->
<echo file="build/eclipse/freemarker/site.xml"><![CDATA[<?xml version="1.0"?>
<site>
<feature url="features/${eclipseFeatureFileName}"
id="org.freemarker.freemarker"
version="${versionForOSGi}">
<category name="core" />
<category name="core-with-sources" />
</feature>
<feature url="features/${eclipseSourceFeatureFileName}"
id="org.freemarker.freemarker.source"
version="${versionForOSGi}">
<category name="core-with-sources" />
</feature>
<category-def name="core" label="FreeMarker core">
<description>
Features that are used as dependencies of other products, but do nothing visible themselves.
</description>
</category-def>
<category-def name="core-with-sources" label="FreeMarker core with sources">
<description>
Features that are used as dependencies of other products, but do nothing visible themselves.
Includes source code attachments.
</description>
</category-def>
</site>
]]></echo>
<echo message="**************************************************************" />
<echo message="The new Eclipse update site is created in:" />
<echo message="${basedir}/build/eclipse/freemarker" />
<echo message="You can use this directory as a local update site in Eclipse," />
<echo message="or if you are an admin who makes a release, you should replace" />
<echo message="http://freemarker.org/eclipse/freemarker with this directory." />
<echo message="**************************************************************" />
</target>
<!-- ================================================================== -->
<!-- Dependency management (keep it exactly identical for all projects) -->
<!-- ================================================================== -->
<target name="_autoget-deps" unless="deps.available">
<antcall target="update-deps" />
</target>
<target name="update-deps"
description="Gets the latest version of the dependencies from the Web"
>
<echo>Getting dependencies...</echo>
<echo>-------------------------------------------------------</echo>
<ivy:settings id="remote" url="http://freemarker.org/repos/ivy/ivysettings-remote.xml" />
<!-- Build an own repository that will serve us even offline: -->
<ivy:retrieve settingsRef="remote" sync="true"
ivypattern=".ivy.part/repo/[organisation]/[module]/ivy-[revision].xml"
pattern=".ivy.part/repo/[organisation]/[module]/[artifact]-[revision].[ext]"
/>
<echo>-------------------------------------------------------</echo>
<echo>*** Successfully acquired dependencies from the Web ***</echo>
<echo>Eclipse users: Now right-click on ivy.xml and Resolve! </echo>
<echo>-------------------------------------------------------</echo>
<!-- Only now that we got all the dependencies will we delete anything. -->
<!-- Thus a net or repo outage doesn't left us without the dependencies. -->
<!-- Save the resolution cache from the soon coming <delete>: -->
<move todir=".ivy.part/update-deps-reso-cache">
<fileset dir=".ivy/update-deps-reso-cache" />
</move>
<!-- Drop all the old stuff: -->
<delete dir=".ivy" />
<!-- And use the new stuff instead: -->
<move todir=".ivy">
<fileset dir=".ivy.part" />
</move>
</target>
<!-- Do NOT call this from 'clean'; offline guys would stuck after that. -->
<target name="clean-deps"
description="Deletes all dependencies"
>
<delete dir=".ivy" />
</target>
<target name="publish-override" depends="jar"
description="Ivy-publishes THIS project locally as an override"
>
<ivy:resolve />
<ivy:publish
pubrevision="${moduleBranch}-branch-head"
artifactspattern="build/[artifact].[ext]"
overwrite="true" forcedeliver="true"
resolver="freemarker-devel-local-override"
>
<artifact name="freemarker" type="jar" ext="jar" />
</ivy:publish>
<delete file="build/ivy.xml" /> <!-- ivy:publish makes this -->
<echo>-------------------------------------------------------</echo>
<echo>*** Don't forget to `ant unpublish-override` later! ***</echo>
</target>
<target name="unpublish-override"
description="Undoes publish-override (made in THIS project)"
>
<delete dir="${user.home}/.ivy2/freemarker-devel-local-override/${moduleOrg}/${moduleName}" />
<delete dir="${user.home}/.ivy2/freemarker-devel-local-override-cache/${moduleOrg}/${moduleName}" />
</target>
<target name="unpublish-override-all"
description="Undoes publish-override-s made in ALL projects"
>
<delete dir="${user.home}/.ivy2/freemarker-devel-local-override" />
<delete dir="${user.home}/.ivy2/freemarker-devel-local-override-cache" />
</target>
<target name="uninstall"
description="Deletes external files created by FreeMarker developement"
>
<delete dir="${user.home}/.ivy2/freemarker-devel-cache" />
<delete dir="${user.home}/.ivy2/freemarker-devel-local-override" />
<delete dir="${user.home}/.ivy2/freemarker-devel-local-override-cache " />
</target>
<target name="report-deps"
description="Creates a HTML document that summarizes the dependencies."
>
<mkdir dir="build/deps-report" />
<ivy:resolve />
<ivy:report todir="build/deps-report" />
</target>
<target name="ide-dependencies" description="If your IDE has no Ivy support, this generates ide-lib/*.jar for it">
<mkdir dir="ide-dependencies" />
<delete includeEmptyDirs="true">
<fileset dir="ide-dependencies">
<include name="*/**" />
</fileset>
</delete>
<ivy:retrieve conf="IDE" pattern="ide-dependencies/[artifact]-[revision].[ext]" />
</target>
<!--
This meant to be called on the Continuous Integration server, so the
integration builds appear in the freemarker.org public Ivy repository.
The artifacts must be already built.
-->
<target name="server-publish-last-build"
description="(For the Continuous Integration server only)"
>
<delete dir="build/dummy-server-ivy-repo" />
<ivy:resolve />
<ivy:publish
pubrevision="${moduleBranch}-branch-head"
artifactspattern="build/[artifact].[ext]"
overwrite="true" forcedeliver="true"
resolver="server-publishing-target"
>
<artifact name="freemarker" type="jar" ext="jar" />
</ivy:publish>
<delete file="build/ivy.xml" /> <!-- ivy:publish makes this -->
</target>
<target name="rat">
<ivy:cachepath conf="rat" pathid="ivy.dep" />
<taskdef
uri="antlib:org.apache.rat.anttasks"
resource="org/apache/rat/anttasks/antlib.xml"
classpathref="ivy.dep"
/>
<rat:report reportFile="build/rat-report-src.txt">
<fileset dir="src"/>
</rat:report>
<rat:report reportFile="build/rat-report-dist-src.txt">
<fileset dir="build/dist/src"/>
</rat:report>
<rat:report reportFile="build/rat-report-dist-bin.txt">
<fileset dir="build/dist/bin"/>
</rat:report>
<echo level="info"><!--
-->Rat reports were written into build/rat-report-*.txt<!--
--></echo>
</target>
<target name="archive" depends=""
description='Archives project with Git repo into the "archive" directory.'
>
<mkdir dir="archive" />
<tstamp>
<format property="tstamp" pattern="yyyyMMdd-HHmm" />
</tstamp>
<delete file="archive/freemarker-git-${tstamp}.tar" />
<delete file="archive/freemarker-git-${tstamp}.tar.bz2" />
<tar tarfile="archive/freemarker-git-${tstamp}.tar"
basedir="."
longfile="gnu"
excludes="build/** .build/** .bin/** .ivy/** archive/**"
/>
<bzip2 src="archive/freemarker-git-${tstamp}.tar"
zipfile="archive/freemarker-git-${tstamp}.tar.bz2" />
<delete file="archive/freemarker-git-${tstamp}.tar" />
</target>
</project>