Apache Flex Cross-Compiler
====================

    This Apache Flex Cross-Compiler is also known as the 'FalconJX' compiler.  It 
    leverages code from the Apache Flex 'Falcon' Compiler but outputs JavaScript
    instead of a SWF.

    For detailed information about Apache Flex please visit
    http://flex.apache.org/

    This compiler is used in the Apache FlexJS SDK.  FlexJS is a
    next-generation SDK that allows the developer to leverage MXML and ActionScript
    to build applications that not only run as a SWF, but can also be cross-compiled
    to JavaScript and run natively in a browser or anywhere JavaScript runs.

Getting the latest sources via git
==================================

    Getting the source code is the recommended way to get the Apache Flex Cross-Compiler.  
    We also offer an automated installer along with binary distributions on our 
    website at http://flex.apache.org/.

    You can always checkout the latest source via git using the following
    command:

	 git clone https://git-wip-us.apache.org/repos/asf/flex-falcon.git falcon
	 cd falcon
	 git checkout develop

    See the main README for instructions on setting up and building the Apache
    Flex 'Falcon' cross-compiler.

Building the Apache Flex Cross-Compiler
=======================================

    The Apache Flex Cross-Compiler is a large project. It requires that the
    Apache Flex Compiler has been built.  See the main README for instructions.

    Linux support is currently experimental and while it is possible to compile
    the SDK it has not been fully tested so you may run into issues.

Install Prerequisites
---------------------

    Before building the Apache Flex FalconJX Compiler you must install the same
    software as specified in the main README.  In addition, you will also need:

    ==================================================================================
    SOFTWARE                                    ENVIRONMENT VARIABLE (absolute paths)
    ==================================================================================

    Apache FlexJS SDK or repository             ASJS_HOME

    ==================================================================================

    *1) Set the ASJS_HOME variable to the root of the Apache FlexJS SDK or repository.

Software Dependencies
---------------------

    The Apache Flex Cross-Compiler uses third-party code that will be downloaded as 
    part of the build.

    The Apache Version 2.0 license is in the LICENSE file.

    The following dependencies have licenses which are, or are compatible with,
    the Apache Version 2.0 license.  You will not be prompted to acknowledge the
    download.  Most of the jars are installed in lib/external when installed
    into an Apache Flex SDK and the lib folder in the repository working copy.

        Google Closure Compiler - http://dl.google.com/closure-compiler/compiler-20140303.zip
        commons-io - http://archive.apache.org/dist/commons/io/binaries/commons-io-2.0.1.tar.gz


Using the Binary Distribution
-----------------------------

    The binary distribution is intended to be installed into an existing 
    Apache FlexJS SDK.

    There is an Apache Ant script in the binary distribution that will copy the 
    files into the right places.

    To run it, use:
        ant -f installer.xml -DFLEX_HOME=<path to FlexJS SDK

    The script does not check the FLEX_HOME environment variable as that often
    points to your primary Flex SDK.

    If you expand the binary distribution into the "in" folder of an Apache
    FlexJS SDK, the installer.xml script should find FLEX_HOME automatically.

    Another option is to use the InstallApacheFlex (version 3.0 or higher).

Building the Source in the Source Distribution
----------------------------------------------

    When you have all the prerequisites in place and the environment variables
    set (see Install Prerequisites above), use

        cd <falcon.dir>
        ant all

    to download the thirdparty dependencies and build the source.  Since the
    third-party dependencies take a little while to download and they don't
    change very often, they are not cleaned with the regular clean target.

    To clean the build, of everything other than the downloaded third-party
    dependencies use

        ant clean-all

    To clean the build, of everything, including the downloaded third-party
    dependencies use

        ant wipe-all (which is just thirdparty-clean followed by clean)

    To generate a source distribution package and a binary distribution package
    use

        ant -Dbuild.number=<YYYYMMDD> -Dbuild.noprompt= release

    The packages can be found in the "out" subdirectory.

    To get a brief listing of all the targets type

        ant -projecthelp


Running Tests
---------------------

Before running unit-, functional- or feature-tests you need to create a unittest.properties file ( template is found here compiler.tests/template-unittest.properties ). 



Thanks for using Apache Flex.  Enjoy!

                                          The Apache Flex Project
                                          <http://flex.apache.org>
