The Apache Flex SDK
===================

The Apache Flex SDK is the evolution of the popular Adobe Flex SDK. The Apache
Flex SDK is an application development framework for easily building Flash-based
applications for mobile devices, web browsers, and desktop platforms.
Currently supported platforms include:

    Microsoft Windows
    Mac OS X
    Apple iOS
    Google Android
    RIM BlackBerry
    (Linux)

Linux support is currently experimental and you may run into issues. The Apache
Flex project would like to see a fully supported Linux release, but we need
help from the community in order to do that. Please help out if you can.

For more information about the Apache Flex project, please visit:

    http://flex.apache.org/

The Apache Flex SDK 4.14.1 is a follow up release to version 4.14.0. It is
compatible with most code written for the original Adobe Flex 4.6 SDK.



Installing the Apache Flex SDK
==============================

The Apache Flex SDK Installer is an AIR 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 favourite IDE
such as Adobe Flash Builder or JetBrains IntelliJ IDEA.

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

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

Starting with the Apache Flex SDK 4.12, Linux users can install the binary
distribution using ANT. More information about installing the binary package
with ANT can be found on our wiki at:

    https://cwiki.apache.org/confluence/display/FLEX/Installation+help#Installationhelp-Antinstaller



Building the Apache Flex SDK from source
========================================

The Apache Flex SDK is a large project. It requires build tools which must be
installed on your system and it depends on some external software. The external
software is downloaded as part of the build process.

There are two ways to get the SDK source.
1) from a git repository
2) from a source package distribution

The following steps are all you need for a fully functional SDK:
- Prepare your system
    - install external software
    - set environment variables
- Get the source code
- Build the SDK
- Prepare the SDK for use with an IDE
- Optional steps:
  - Flash Player configuration
  - Other locale support


Prepare your system
-------------------

Before building the Apache Flex SDK you must install the following software and
set the corresponding environment variables. Make sure to use absolute paths,
as relative paths will result in build errors.

The environment variables PLAYERGLOBAL_HOME, AIR_HOME, FLASHPLAYER_DEBUGGER,
TLF_HOME, BLAZEDS_HOME and ADOBE_EXTENSION_MANAGER can also be set in a
property file called env.properties. See the env-template.properties file
for instructions.

The Adobe Flash Player and Adobe AIR have non Apache compatible licenses so
they can not be bundled with the Apache Flex SDK and need to be installed
separately.

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 and desktop
applications. The Adobe Flash Player content debugger is used by the ant
‘checkintests’ target and other pieces of the test subsystem to run compiled
applications.


---------------------------------------------------------------------
SOFTWARE                                      ENVIRONMENT VARIABLE
---------------------------------------------------------------------

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 Flash Player playerglobal swcs (* 5)    PLAYERGLOBAL_HOME

Optional: Text Layout Framework (* 6)         TLF_HOME

Optional: Adobe Extension Manager CS5 (* 7)   ADOBE_EXTENSION_MANAGER

Optional: Flex Messaging Common (* 8)         BLAZEDS_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 your path includes 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/16.0/AdobeAIRSDK.zip

The Adobe AIR integration kit for Mac can be downloaded from:

    http://airdownload.adobe.com/air/mac/download/16.0/AdobeAIRSDK.tbz2

The Adobe AIR integration kit for Linux can be downloaded from:

    http://airdownload.adobe.com/air/lin/download/2.6/AdobeAIRSDK.tbz2

Download the AIR SDK for your platform and unzip it. Set AIR_HOME to the
absolute path of the AIR SDK directory.

This version of the Apache Flex SDK was certified for use with Adobe AIR 16
and is compatible with version 3.1 and up. It has been fully tested on AIR 3.7,
4 and 16.

* 4)
The Adobe Flash Player content debuggers can be found here:

    http://www.adobe.com/support/flashplayer/downloads.html

This version of the Apache Flex SDK was certified for use with Adobe Flash
Player 11.1, and is compatible with version 10.2 and up. It has been tested
with versions 11.1, 11.7, 13.0 and 16.0 on Windows and Mac. It has been
compiled, but not fully tested, with other Adobe Flash Player versions.
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 may be 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 Flash Player playerglobal.swc for 11.1 can be downloaded from:

    http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_1.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.

Additional information about downloading and setting up this and/or other
versions of the Adobe Flash Player can be found in the section
'Adobe Flash Player Version Support' below.

* 6)
The build scripts assume that the root folder containing the source code for
Apache Flex Text Layout Framework ('flex-tlf') is at the same level as the SDK
root folder ('flex-sdk'). See 'Getting the source code', below. If this is not
the case on your system, then you must set the TLF_HOME environment variable to
point to your TLF root folder. If you are using a released artifact, the
source should be included in the artifact, so setting TLF_HOME is not
required.

* 7)
The Adobe Extension Manager is only required for those creating releases or
testing changes to the flash-integration SWC. Note that if you change APIs on
classes that flash-integration depends on, you may need to update
flash-integration.

On Windows, download the Adobe Extension Manager from:

    http://download.macromedia.com/pub/dw_exchange/extension_manager/win/AdobeExtensionManager5All.zip

and set ADOBE_EXTENSION_MANAGER to the absolute path of
'Adobe Extension Manager CS5.exe'

On Mac, download the Adobe Extension Manager from:

    http://download.macromedia.com/pub/dw_exchange/extension_manager/mac/AdobeExtensionManager5All.dmg

and set ADOBE_EXTENSION_MANAGER to the absolute path of
'Adobe Extension Manager CS5.app/Contents/MacOS/Adobe Extension Manager CS5'

On Linux, no Adobe Extension Manager exists.

* 8)
The build scripts assume that the root folder containing the source code for Apache
Flex BlazeDS ('flex-blazeds') is at the same level as the SDK root folder
('flex-sdk'). See 'Getting the source code', below. If this is not
the case on your system, then you must set the BLAZEDS_HOME environment variable
to point to your BLAZEDS root folder. If you are using a released artifact, the
source should be included in the artifact, so setting BLAZEDS_HOME is not
required.


Get the source code
-------------------

You can get the source directly from the source code repository (Apache Flex
uses git for SCM).

Clone the latest source ('develop' branch) using the following commands:

    git clone https://git-wip-us.apache.org/repos/asf/flex-sdk.git flex-sdk
    cd flex-sdk
    git checkout develop

The Apache Flex SDK also requires source code from the Apache Flex Text Layout
Framework (TLF). To get the latest source for TLF ('develop' branch), use the
following commands:

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

The Apache Flex SDK also requires source code from Apache Flex BlazeDS. To get 
the latest source for Apache Flex BlazeDS (‘master’ branch), use the
following commands:

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

Another option to get the source is to download a released source package.

For further information visit:

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


Build the SDK
-------------

When you have all the prerequisites in place and the environment variables set,
use these commands:

    cd <flex-sdk>
    ant main

to download the third party dependencies and build the source. You will 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

To generate a source distribution package and a binary distribution package,
use:

    ant -Dbuild.number=<YYYYMMDD> -Dbuild.noprompt= release

The packages can then be found in the <flex-sdk>\out directory.

To build the ASDoc package, use:

    ant asdoc-package

To get a brief listing of all the targets, use:

    ant -projecthelp



Prepare the SDK for use with an IDE
-----------------------------------

To create an SDK for Flash Builder or any other IDE, run:

    cd <flex.dir>
    ant frameworks-rsls
    ant -f installer.xml
    
If you want to set the Flash Player and AIR versions to something other
than their defaults, pass the versions to the ant script like so:

     ant -f installer.xml -Dflash.sdk.version=16.0 -Dair.sdk.version=16.0

On Mac/Linux the AIR and Flash Player version can be changed, after the SDK
has been compiled, by running:

    ./ide/setFlashPlayerVersion.sh ./ 16.0
    ./ide/addAIRtoSDK.sh 16.0 ./



Using the Binary Distribution
=============================

In order to use the binary distribution of the SDK, follow the instructions in
the 'Prepare the SDK for use with an IDE' section above.



Flash Player 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.

More information about these settings can be found here:

    http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7c95.html



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.

To compile all supported locales, which may take some time, use:

    ant other.locales

The list of supported locales currently 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, you are
unlikely to run into any issues with a SDK compiled for another locale.


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 and up.

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 support 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 '16.0' like so:

    playerglobal.version = 16.0

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

and

    http://download.macromedia.com/get/flashplayer/updaters/<version.major>/playerglobal<version.major>_<version.minor>.swc

(e.g. http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_1.swc)

Copy the target playerglobal.swc to the directory:

    frameworks/libs/player/<version.major>.<version.minor>/playerglobal.swc
    
On OSX, running the script:

    ./ide/checkAllPlayerGlobals.sh 
 
will download any new or missing player global swcs.


Software Dependencies
=====================

The Apache Flex SDK uses third-party code that will be downloaded as part of
the build. In addition, you can choose to download optional third-party code
if you would like to take advantage of the features offered, and you agree to
the license terms.

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
    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. These files are installed in lib/external
frameworks/libs respectively.

    saxon9 - http://sourceforge.net/projects/saxon/files/Saxon-B/9.1.0.8/saxonb9-1-0-8j.zip/download
    osmf.swc (Open Source Media Framework v2.0; used for video components) - 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

    saxon9 is released under the Mozilla Public License Version 1.0:
    osmf.swc 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
incompatible 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.

    adt.jar, afe.jar, aglj40.jar, flex-fontkit.jar and rideau.jar (provide 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

    and are released under an Adobe license:

        http://www.adobe.com/products/eulas/pdfs/adobe_flex_software_development_kit-combined-20110916_0930.pdf



Thanks for using the Apache Flex SDK. Enjoy!

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