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.

	args4j = http://search.maven.org/remotecontent?filepath=args4j/args4j/2.0.28/args4j-2.0.28.jar
        Google Closure Compiler - http://github.com/google/closure-compiler/archive/v	20140625.zip
        commons-io - http://archive.apache.org/dist/commons/io/binaries/commons-io-2.0.1.tar.gz
	org.json = http://search.maven.org/remotecontent?filepath=org/codeartisans/org.json/20131017/org.json-20131017.jar


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>
