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.10 is a follow up release to Apache Flex 4.9. 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
        Linux (experimental)

    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 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 IDEA.

    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


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

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

    An Apache Flex SDK also requires source code from other Apache Flex git
    repositories.  To get the latest source via git for the Text Layout Framework
    use the following command:

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

    In an Apache Flex source code package hosted on the distribution server or
    one of its mirrors, the Text Layout Framework code is already included in
    the package.  This is also true for the convenience package.
    
    Linux support is currently experimental and you may run into issues. Apache
    Flex would like to see a fully supported Linux release, but we need support
    from community in order to do that. Please help out if you can. 

    For further information visit http://flex.apache.org/download-source.html
    
Building Apache Flex 4.10
=========================

    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.
    
    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 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, TLF_HOME,
    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.

    The build scripts assume that the folder containing the Text Layout Framework (tlf)
    folder is a sibling of the sdk folder.  If this is not true, then you must set the
    TLF_HOME environment variable to point to the tlf folder.

    ==================================================================================
    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

    Text Layout Framework                       TLF_HOME

    ==================================================================================
        
    *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"
            
         On Linux make sure you path include ANT_HOME and JAVA_HOME.

    *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.8/AdobeAIRSDK.zip
        
         The Adobe AIR integration kit for Mac can be downloaded from:
            http://airdownload.adobe.com/air/mac/download/3.8/AdobeAIRSDK.tbz2
            
          The Adobe AIR integration kit for Linux can be downloaded from:
            http://airdownload.adobe.com/air/lin/download/2.6/AdobeAIRSDK.tbz2        

        This version of Apache Flex was certified for use with AIR 3.8, 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, 3.5, 3.6 or 3.7.

        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.8. It has been tested with versions 11.1, 
        11.7 and 11.8 on Windows and Mac. It has been compiled against other Adobe Flash Player
        versions but has not been fully tested. It has not been fully tested on Linux.
            
        On Windows, set FLASHPLAYER_DEBUGGER to the absolute path including the filename of
        the FlashPlayerDebugger.exe. Note the filename of flash player debugger maybe
        different.
           e.g. C:\MyPath\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/
            
         No Pixel Bender Toolkit for Linux exists but the compiled Pixel Bender files
         can be downloaded from:
            https://builds.apache.org/pview/job/flex-sdk_pixelbender/lastSuccessfulBuild/artifact/out/pb.tar.gz
                    
         Download the Pixel Bender Toolkit for your platform and install or unzip it.
         On Windows and Mac Set PIXELBENDER_HOME to the absolute path of the Pixel Bender Toolkit
         directory, on Linux set it to be the absolute path of the compiled Pixel Bender files.

    *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 Adobe Flash Player playerglobal.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
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_7.swc
            http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_8.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 Mac, set ADOBE_EXTENSION_MANAGER to the absolute path of "Adobe Extension Manager CS5.app"

        On Linux, no Adobe Extension Manager exists and there's nothing that needs to be done here.

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	it_IT	nb_NO	pt_PT	zh_CN
        de_CH	en_AU	en_US	fr_CH	ja_JP	nl_NL	ru_RU	zh_TW
        de_DE	en_CA	es_ES	fr_FR	ko_KR	pt_BR	sv_SE

    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
    used with Flash Player versions 10.2, 10.3, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5,
    11.6, 11.7 and 11.8.
    
    It is recommended that you update to the latest version of Adobe Flash Player.
    Newer versions of the Adobe Flash player address security vulnerabilities, fix
    bugs/issues, increase stability, and implement new features.

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

    Change the flex-config.xml configuration file to specify another version of the
    Adobe Flash Player.
    
    OR
    
    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 latest 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
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_7.swc
    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_8.swc
    
    Copy the target playerglobal.swc to the directory:
    
        frameworks/libs/player/<version>/playerglobal.swc
    
    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  
                    /11.7
                         /playerglobal.swc 
                    /11.8
                         /playerglobal.swc  
    
    Apache Flex has been tested with Adobe Flash Player 11.1 and 11.5 on Windows and Mac.
    Apache Flex has not been tested on Linux so some issue may exist in this release.
    
    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 installation of Flash Builder run:
	
		/ide/constructFlexForIDE.sh (on Mac and Linux)
		/ide/constructFlexForIDE.bat (on Windows)
		
	This will create an Apache Flex 4.10 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.8 (rather than
	AIR 3.1 contained in Adobe Flex 4.6) run:
	
		/ide/flashbuilder/makeApacheFlexForIDE.sh (on Mac and Linux)
		/ide/flashbuilder/makeApacheFlexForIDE.bat (on Windows)
		
	This will create an Apache Flex 4.10 SDK that can be used by an IDE by downloading
	Adobe Flex 4.6 SDK and Adobe AIR 3.8.
    
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.  Enjoy!

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