<?xml version="1.0"?>
<!--

  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 name="flex" default="main" basedir=".">

	<property name="FLEX_HOME" location="${basedir}/../../.."/>

    <property file="${FLEX_HOME}/env.properties"/>
    <property environment="env"/>
	<property file="${FLEX_HOME}/build.properties"/>

	<target name="main" depends="clean,compile" description="Clean build of core.swc"/>

	<target name="clean">
		<delete failonerror="false">
			<fileset file="${basedir}/bundles.properties"/>
			<fileset dir="${FLEX_HOME}/frameworks/libs">
				<include name="core.swc"/>
				<include name="core.swc.incr"/>
			</fileset>
		</delete>
	</target>

	<target name="compile" description="Compiles core.swc">
		<echo message="Compiling frameworks/libs/core.swc"/>

		<!-- Load the <compc> task. We can't do this at the <project> level -->
		<!-- because targets that run before flexTasks.jar gets built would fail. -->
		<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/lib/flexTasks.jar"/>
		<!--
			core.swc contains a subset of the classes in framework.swc;
			only very core classes required to support MXML should be part
			of core.swc, for use by developers who don't need the entire framework.
			Therefore this project does not have its own source
			and instead finds the source files inside the project for framework.swc.
			This project has no MXML tags and therefore no manifest.
			Link in the classes (and their dependencies)
			listed in CoreClasses.as.
			Keep the standard metadata when compiling.
			Link in accessibility support.
			Don't include any resources in the SWC. (The classes don't require any.)
			Write a bundle list of referenced resource bundles
			into the file bundles.properties in this directory.
			(This should be an empty list.)
		-->
		<compc fork="true"
			   output="${FLEX_HOME}/frameworks/libs/core.swc">
            <jvmarg line="${compc.jvm.args}"/>
            <load-config filename="compile-config.xml" />
            <arg value="+playerglobal.version=${playerglobal.version}" />
            <arg value="+env.PLAYERGLOBAL_HOME=${env.PLAYERGLOBAL_HOME}" />
            <load-config filename="${FLEX_HOME}/frameworks/projects/framework/framework-config.xml"/>
		</compc>
	</target>

	<target name="doc" depends="clean-temp-docs" description="updates core.swc with asdoc xml">
		<!-- Load the <asdoc> task. We can't do this at the <project> level -->
		<!-- because targets that run before flexTasks.jar gets built would fail. -->
		<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/lib/flexTasks.jar"/>

	    <condition property="asdoc.jvm.args" value="-Xmx384m">
	        <os family="windows"/>
	    </condition>

	    <condition property="asdoc.jvm.args" value="-Xmx512m">
	        <os family="mac"/>
	    </condition>

	    <condition property="asdoc.jvm.args" value="-Xmx512m">
	        <os family="unix"/>
	    </condition>

		<!-- Call asdoc to generate dita xml files -->
		<asdoc output="${FLEX_HOME}/tempDoc" lenient="true" failonerror="true" keep-xml="true" skip-xsl="true" fork="true">
		    <compiler.source-path path-element="${basedir}/src"/>
		    <compiler.source-path path-element="${FLEX_HOME}/frameworks/projects/framework/src"/>
		    <doc-classes class="CoreClasses"/>
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <load-config filename="${FLEX_HOME}/frameworks/projects/framework/framework-config.xml"/>
		    <jvmarg line="${asdoc.jvm.args}"/>
		</asdoc>

		<!-- updates core.swc with asdoc xml -->
		<zip destfile="${FLEX_HOME}/frameworks/libs/core.swc" update="true">
		    <zipfileset dir="${FLEX_HOME}/tempDoc/tempdita" prefix="docs">
			    <include name="*.*"/>
				<exclude name="ASDoc_Config.xml"/>
				<exclude name="overviews.xml"/>
		    </zipfileset>
		</zip>
	</target>

	<target name="clean-temp-docs">
		<delete dir="${FLEX_HOME}/tempDoc" failonerror="false" includeEmptyDirs="true"/>
	</target>

</project>
