Apache Flex - Falcon Compiler
=============================

    Apache Flex is an application framework for easily building Flash-based applications 
    for mobile devices, the browser and desktop.
    
    For detailed information about Apache Flex please visit 
    http://incubator.apache.org/flex/

    Apache Flex is a large project with many pieces.  The framework is implemented
    in ActionScript and the compiler is implemented in Java.  The Falcon Compiler is
    a new compiler for ActionScript and MXML.

Getting the latest sources via Git
==================================

    You can always get the latest source via Git using the following
    command to clone Apache's flex-falcon repository:

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

    This command will create a flex-falcon directory inside the current directory.
    
Building The Apache Flex Falcon Compiler
========================================

    The Apache Flex Falcon Compiler requires some build tools which must be installed
    prior to building and it depends on some external software which
    are downloaded as part of the build process.  See the Software Dependencies
    section for more information on the external software dependencies.
        
Install Prerequisites
---------------------

    Before building the Falcon Compiler you must install the following software and set the
    corresponding environment variables using absolute file paths.  Relative file paths
    will result in build errors.
	    
    ==================================================================================
    SOFTWARE                                    ENVIRONMENT VARIABLE (absolute paths)
    ==================================================================================
    
    Java SDK 1.5 (0_13 or greater)              JAVA_HOME
    or Java SDK 1.6 (*1)
    
    Ant 1.7.0 or greater (*1)                   ANT_HOME
    
    Cygwin, git bash 
    or other unix-like shell
    (if Windows)
    
    JFlex (*2)                                  JFLEX_JAR 
    
    ==================================================================================
        
    *1) The bin directories for ANT_HOME and JAVA_HOME should be added to your PATH.
        
        On Windows, set PATH to
            
            PATH=%PATH%;%ANT_HOME%\bin;%JAVA_HOME%\bin
            
        On the Mac (bash), set PATH to
            
            export PATH="$PATH:$ANT_HOME/bin:$JAVA_HOME/bin"
    
    *2) JFlex can be downloaded from:
                http://jflex.de/download.html
        
        Download the the package and expand it.  Set JFLEX_JAR to the absolute 
        path of the JFlex.jar file.
               

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

    Apache Flex uses third-party code that will be downloaded as part of the Falcon
    Compiler 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.  The jars 
    are installed in the lib folder.
    
        antlr - http://www.antlr.org/download/antlr-3.3-complete.jar
        commons-cli - http://archive.apache.org/dist/commons/cli/binaries/commons-cli-1.2-bin.tar.gz
        commons-io - http://archive.apache.org/dist/commons/io/binaries/commons-io-2.0.1-bin.tar.gz
        guava - http://guava-libraries.googlecode.com/files/guava-r08.zip
 
    The following dependency has a license which considers reciprocal licenses so you 
    will be prompted to acknowledge the license before the software is downloaded to your 
    system. These files are also installed in the lib folder.
        
        JBurg - http://downloads.sourceforge.net/project/jburg/jburg-1.10.1.tar.gz
            
        This software is released under the Commons Public License:
        <http://www.opensource.org/licenses/cpl1.0.php>
            
    The following dependency is in the public domain

        lzma-sdk - http://downloads.sourceforge.net/project/sevenzip/LZMA%20SDK/lzma920.tar.bz2 
        
	A jar is created from the sources in this download.            
       

Thanks for using Apache Flex.

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