Apache Flex (Flex)
==================

    Apache Flex is an application framework for easily building Flash-based applications 
    for mobile devices, the browser and desktop.

    Apache Flex 4.9 is a follow up release to Apache Flex 4.8 which was a parity release
    of Adobe Flex 4.6.  This version adds new features and implements bug fixes that were
    unavailable in previous versions.  It is compatible with most code written to target
    Adobe Flex 4.6.

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

    Apache Flex is a large project with many pieces.  The framework is implemented
    in ActionScript and the compiler is implemented in Java.

    Currently supported platforms include:

        Microsoft Windows
        Mac OS X
        Apple iOS
        Google Android
        RIM BlackBerry

    Apache Flex is the software evolution of the popular Adobe Flex SDK project.
    
    The community surrounding Flex is vast, diverse, distributed globally, and with all 
    levels of proficiency in software development. It is estimated that there are between 
    350,000 and 500,000 Flex developers worldwide. 

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

    This is the recommended way to get Apache Flex.  We 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-sdk.git sdk
	cd sdk
	git checkout develop

    For further information visit http://flex.apache.org/download-source.html


Getting the convenience packages for Apache Flex
================================================

    The Apache Flex SDK Installer is an application that simplifies the download and
    installation of the Apache Flex SDK and its (required) components. It is aimed at
    anyone who wants to use the latest release of the Apache Flex SDK, but who might not
    necessarily be familiar with the tools and procedures required to compile the Apache
    Flex SDK from source code. The application will grab the binary distribution of the
    SDK from apache.org or one of its mirrors, install it onto your computer and prepare
    it for use with your favorite IDE such as Adobe Flash Builder or JetBrains IntelliJ.

    You can get the SDK Installer from the Apache Flex website at

      http://flex.apache.org/installer.html

    You can also get just the binaries from our website as well.  These binaries do not
    include the dependencies, so additional software may need to be downloaded and installed.

      http://flex.apache.org/download-binaries.html

Building Apache Flex 4.9
========================

    Apache Flex is a large project. It requires some build tools which must be installed
    prior to building Flex and it depends on some external software which
    are downloaded as part of the build process.  Some of these have different licenses.
    See the Software Dependencies section for more information on the external software
    dependencies.
    
    From Apache's perspective, the Adobe Flash Player and Adobe AIR have excluded
    licenses so they can not be bundled with the Apache Flex binaries.  They must be
    installed prior to building Apache Flex.
    
Install Prerequisites
---------------------

    Before building Flex you must install the following software and set the
    corresponding environment variables using absolute file paths.  Relative file paths
    will result in build errors.
    
    The environment variables PLAYERGLOBAL_HOME, AIR_HOME, FLASHPLAYER_DEBUGGER,
    PIXELBENDER_HOME and ADOBE_EXTENSION_MANAGER can also be set in the property file 
    called env.properties. See the env-template.properties file for instructions.
    
    The Adobe Flash Player playerglobal.swc is needed to compile all the components
    with the exception of the airframework and airspark components which require
    airglobal.swc from the AIR Integration Kit.  The AIR Integration kit is also needed
    to build and debug mobile applications.  The Adobe Flash Player content debugger is
    used by checkintests and other pieces of the test subsystem to run compiled
    applications.  The Adobe Pixel Bender Toolkit is needed to build some
    files needed for effects.
    
    ==================================================================================
    SOFTWARE                                    ENVIRONMENT VARIABLE (absolute paths)
    ==================================================================================
    
    Java SDK 1.6 or greater (*1)                JAVA_HOME
        (for Java 1.7 see note at (*2))
        
    Ant 1.7.1 or greater (*1)                   ANT_HOME
        (for Java 1.7 see note at (*2))
    
    Adobe AIR Integration Kit (*3)              AIR_HOME 
    
    Adobe Flash Player Content Debugger (*4)    FLASHPLAYER_DEBUGGER
        
    Adobe Pixel Bender Toolkit (*5)             PIXELBENDER_HOME
    
    Adobe Flash Player playerglobal swcs (*6)   PLAYERGLOBAL_HOME

    Adobe Extension Manager CS5 (*7)            ADOBE_EXTENSION_MANAGER

    ==================================================================================
        
    *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)  If you are using Java SDK 1.7 or greater on a Mac you must use Ant 1.8 or 
         greater. If you use Java 1.7 with Ant 1.7, ant reports the java version as 1.6 
         so the JVM args for the data model (-d32/-d64) will not be set correctly and you
         will get compile errors.
        
    *3) The Adobe AIR integration kit for Windows can be downloaded from:
           http://airdownload.adobe.com/air/win/download/3.5/AdobeAIRSDK.zip
        
         The Adobe AIR integration kit for Mac can be downloaded from:
            http://airdownload.adobe.com/air/mac/download/3.5/AdobeAIRSDK.tbz2

        This version of Apache Flex was certified for use with AIR 3.5, and should
        be compatible with other versions of AIR newer than 3.1. However it hasn't
        been tested on AIR 3.2, 3.3 or 3.6.

        Download the AIR SDK for your platform and unzip it.  Set AIR_HOME to the absolute 
        path of the AIR SDK directory.
               
    *4) The Adobe Flash Player content debuggers can be found here:
            http://www.adobe.com/support/flashplayer/downloads.html

        This version of Apache Flex was certified for use with Adobe Flash Player 11.1, and
        is compatible with versions 10.2 through 11.6. It has been tested with versions 11.1
        and 11.5 on Windows and Mac. It has been compiled against other Adobe Flash Player
        versions but has not been fully tested.
            
        On Windows, set FLASHPLAYER_DEBUGGER to the absolute path of FlashPlayerDebugger.exe
        
        On the Mac, set FLASHPLAYER_DEBUGGER to the absolute path of 
        Flash Player Debugger.app/Contents/MacOS/Flash Player Debugger
        
        On Linux, set FLASHPLAYER_DEBUGGER to the absolute path of flashplayerdebugger
            
    *5) The Adobe Pixel Bender Toolkit for Windows can be downloaded from:
            http://www.adobe.com/go/pixelbender_toolkit_zip/
        
         The Adobe Pixel Bender Toolkit for Mac can be downloaded from:
            http://www.adobe.com/go/pixelbender_toolkit_dmg/
        
        Download the Pixel Bender Toolkit for your platform and install or unzip it.
        Set PIXELBENDER_HOME to the absolute path of the Pixel Bender Toolkit directory.

    *6) The Adobe Flash Player playerglobal.swc for 11.1 can be downloaded from:
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_1.swc 
        
        Use URL above to download playerglobal11_1.swc. Create the directory, player/11.1
        and copy playerglobal11_1.swc to player/11.1/playerglobal.swc.
        
        Set PLAYERGLOBAL_HOME to the absolute path of the player directory (not including
        the version subdirectory). The target-player option controls which 
        PLAYERGLOBAL_HOME subdirectory is used.

        Other more recent versions of Adode Flash Player playergloal.swc can be downloaded from:
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_2.swc
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_3.swc
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_4.swc
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_5.swc
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_6.swc
            
        These can be used with Apache Flex but have not been fully tested.
        
    *7) The Adobe Extension Manager is only required for those creating releases or testing
            changes to the flash-integration swc.  Not that if you change APIs on classes
            that flash-integration depends on, you may need to update flash-integration.

        The Adobe Extension Manager for Windows can be downloaded from:
            http://download.macromedia.com/pub/dw_exchange/extension_manager/win/AdobeExtensionManager5All.zip
        
         The Adobe Extension Manager for Mac can be downloaded from:
            http://download.macromedia.com/pub/dw_exchange/extension_manager/mac/AdobeExtensionManager5All.dmg

        On Windows, set ADOBE_EXTENSION_MANAGER to the absolute path of "Adobe Extension Manager CS5.exe"
        
        On the Mac, set ADOBE_EXTENSION_MANAGER to the absolute path of "Adobe Extension Manager CS5.app"

FlashPlayer Configuration
-------------------------

    For testing, the Adobe Flash Player's mm.cfg file must have the following entries
    
        ErrorReportingEnable=1
        TraceOutputFileEnable=1
    
    and a FlashPlayerTrust file must allow local SWFs to access local files.
    
Other Locale Support
--------------------

    The Apache Flex SDK defaults to using the en_US locale and SDK error messages are by default
    displayed in American English.
    
    To compile the SDK for another locale either:

    Change the locale in the build.properties file to have a value other than "en_US". For this new
    locale to take effect the SDK needs to be recompiled. For example, to use the Australian English
    locale change locale to have a value of "en_AU" like so:
     
        locale = en_AU
        
    OR
    
    Compile the SDK with a -Dlocale=<locale> option, where <locale> is the new locale to compile the
    SDK against.

    The list of supported locales include:
        da_DK    el_GR    en_GB    fi_FI    ja_JP    nl_NL    ru_RU    zh_TW
        de_CH    en_AU    en_US    fr_FR    ko_KR    pt_BR    sv_SE
        de_DE    en_CA    es_ES    it_IT    nb_NO    pt_PT    zh_CN

    The Apache Flex SDK has only been tested for the en_US locale, however there is unlikely to be any
    issues with a SDK compiled for another locales.
    
Adobe Flash Player Version Support
----------------------------------

    The Apache Flex SDK defaults to using the Adobe Flash Player 11.1. The SDK can be
    compiled for Flash Player versions 10.2, 10.3, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5
    and 11.6.

    To compile the SDK for another version of the Adobe Flash Player either:

    Change the playerglobal.version in the build.properties file to have a value other than "11.1".
    For this change to take effect the SDK needs to be recompiled. For example to compile against the
    lastest version of the Adobe Flash Player set the value of playerglobal.version to be "11.5" like so:
     
        playerglobal.version = 11.5
        
    OR
    
    Compile the SDK with a -Dplayerglobal.version=<version> option, where <version> is the 
    Adobe Flash Player version to compile the SDK against.
    
    
    Different versions of the Adobe Flash Player require different versions of playerglobal.swc.
    
    These can be found at:
    
    http://download.macromedia.com/get/flashplayer/installers/archive/playerglobal/playerglobal10_2.swc
    http://download.macromedia.com/get/flashplayer/installers/archive/playerglobal/playerglobal10_3.swc
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_0.swc 
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_1.swc
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_2.swc
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_3.swc
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_4.swc
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_5.swc
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_6.swc
    
    Copy the target playerglobal.swc to the directory:
    
        frameworks/libs/player/<version>/playerglobal.swf
    
    Where <version> is the major and minor version numbers of the Adobe Flash Player 
    separated by a period or full stop.
    
    If all of the playerglobal swcs where installed the frameworks/libs/player directory
    structure would look like this.
    
        /frameworks
            /libs
                /player
                    /10.2
                         /playerglobal.swc
                    /10.3
                         /playerglobal.swc
                    /11.0
                         /playerglobal.swc
                    /11.2
                         /playerglobal.swc
                    /11.2
                         /playerglobal.swc
                    /11.3
                         /playerglobal.swc
                    /11.4
                         /playerglobal.swc
                    /11.5
                         /playerglobal.swc 
                    /11.6
                         /playerglobal.swc                              
                                                                                                                                
    Apache Flex has been tested with Adobe Flash Player 11.1 and 11.5 on Windows and Mac.
    
    It compiles against other Adobe Flash Player versions and is expected to work but they 
    may be some issues, particularly with the earlier 10.2 and 10.3 versions of the 
    Adobe Flash Player.

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

    Apache Flex uses third-party code that will be downloaded as part of the Apache
    Flex build.  In addition, there is some optional third-party code that you can choose
    to download if you would like to take advantage of the features offered and you agree
    to the license terms.  
    
    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.
    
        batik - http://archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip
        commons-collections - http://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.0.tar.gz
        commons-discovery - http://archive.apache.org/dist/commons/discovery/binaries/commons-discovery-0.2.tar.gz
        commons-logging - http://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.0.4.tar.gz
        javacc - http://java.net/projects/javacc/downloads/download/javacc-5.0.tar.gz
        saxon9 - http://sourceforge.net/projects/saxon/files/Saxon-B/9.1.0.8/saxonb9-1-0-8j.zip/download
        velocity - http://archive.apache.org/dist/velocity/engine/1.4/velocity-1.4.tar.gz
        xalan - http://archive.apache.org/dist/xml/xalan-j/binaries/xalan-j_2_6_0-bin.tar.gz
        xerces - http://archive.apache.org/dist/xerces/j/Xerces-J-bin.2.9.1.zip
 
    The following dependencies have licenses which Apache considers to be reciprocal
    licenses so you will be prompted to acknowledge the license before the software is
    downloaded to your system. These files are installed in frameworks/libs.
        
        osmf.swc            

            Open Source Media Framework v1.0 used for video components
        
            This file is extracted from:
            http://sourceforge.net/projects/osmf.adobe/files/OSMF%201.0%20%28final%20source%2C%20ASDocs%2C%20PDF%20guides%2C%20and%20release%20notes%29/OSMF_1.0.zip/download
            
            This software is released under the Mozilla Public License Version 1.1:
            <http://www.mozilla.org/MPL/>
                    
    The following dependencies have licenses which Apache considers to be not compatible 
    with the Apache License Version 2.0. You will be prompted to read and agree to the 
    license terms of the dependency before the software can be downloaded to your system.  
    These are optional components which enable additional features.  They are installed in 
    libs/external/optional.

    flex-messaging-common.jar
        Provides integration with Adobe BlazeDs.
               
        This files are extracted from: 
        http://fpdownload.adobe.com/pub/flex/sdk/builds/flex4.6/flex_sdk_4.6.0.23201B.zip
       
        This software is released under an Adobe license:
        <http://www.adobe.com/products/eulas/pdfs/adobe_flex_software_development_kit-combined-20110916_0930.pdf>
        
    flex-fontkit.jar
    afe.jar, adt.jar
    aglj40.jar
    rideau.jar
        Adobe proprietary software which provides embedded font support.
       
        These jars are extracted from:
        http://fpdownload.adobe.com/pub/flex/sdk/builds/flex4.6/flex_sdk_4.6.0.23201B.zip
       
        This software is released under an Adobe license:
        <http://www.adobe.com/products/eulas/pdfs/adobe_flex_software_development_kit-combined-20110916_0930.pdf>
        
Using the Binary Distribution
-----------------------------

    You must download the third-party dependencies.

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

        cd <flex.dir>/frameworks
        ant thirdparty-downloads
        
	To use this SDK in a IDE like Flash Builder 4.6 or 4.7 the SDK needs several other files to be packaged
	and integrated with the Apache Flex SDK.
	
	If you have an existing instalation of Flash Builder run:
	
		/ide/constructFlexForIDE.sh (on Mac)
		/ide/constructFlexForIDE.bat (on Windows)
		
	This will create an Apache Flex 4.9 SDK that can be used with Flash Builder by copying the required files
	from the Adobe Flex 4.6 SDK.
	
	To create an SDK for other IDE or if you want to use Adobe AIR 3.5 (rather than AIR 3.1 contained in
	Adobe Flex 4.6) run:
	
		/ide/flashbuilder/makeApacheFlexForFlashbuilder.sh (on Mac)
		/ide/flashbuilder/makeApacheFlexForFlashbuilder.bat (on Windows)
		
	This will create an Apache Flex 4.9 SDK that can be used by an IDE by downloading Adobe Flex 4.6 SDK and
	Adobe AIR 3.5.
    
Building the Framework in a Binary Distribution
-----------------------------------------------

    The source for most of the framework is included in the binary distribution.  
    It can be useful if you wish to debug and/or extend components.

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

        cd <flex.dir>/frameworks
        ant main        (or just ant since the default target is main)
    
    to download the third-party dependencies and build the Flex framework.  You may be 
    prompted to acknowledge some of the downloads.  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 
    
    To clean the build, of everything, including the downloaded third-party dependencies 
    use
        
        ant super-clean (which is just thirdparty-clean followed by clean)

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

    The source for both the Flex compiler and the Flex framework is included in the
    source distribution.  The compiler is in the modules directory and the framework
    is in the frameworks directory.
	
	Because the sdk uses the Text Layout Framework, you will have to clone it too
	and link it to the textLayout project of the sdk:
	
	cd <flex.dir>/..
	git clone https://git-wip-us.apache.org/repos/asf/flex-tlf.git tlf
    
    When you have all the prerequisites in place and the environment variables set
    (see Install Prerequisites above), use

        cd <flex.dir>
        ant main        (or just ant since the default target is main)
    
    to download the thirdparty dependencies and build the source.  You may be prompted
    to acknowledge and/or confirm some of the downloads.  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.
    
    If you would like to build the RSLs, use
    
        ant frameworks-rsls
        
    To clean the build, of everything other than the downloaded third-party dependencies 
    use
    
        ant clean 
    
    To clean the build, of everything, including the downloaded third-party dependencies 
    use
        
        ant super-clean (which is just thirdparty-clean followed by clean)
        
    To generate a source distribution package and a binary distribution package use
        
        ant -Dbuild.number=<last svn rev> -Dbuild.noprompt=  release

    The packages can be found in the "out" subdirectory.
            
    To build the ASDoc package
        
        ant asdoc-package

    To get a brief listing of all the targets type
    
        ant -projecthelp


Thanks for using Apache Flex.

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