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 may 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.
        This is optional and only required to run the FlexJS dependent tests in
        the compiler-jx folder.

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	20151015.zip
        commons-io - https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.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 may need to create a unittest.properties file ( template is found here compiler/src/main/resources/template-unittest.properties ). 



Thanks for using Apache Flex.  Enjoy!

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