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.15 is a follow up release to version 4.14.1. 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/20.0/AdobeAIRSDK.zip

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

    http://airdownload.adobe.com/air/mac/download/20.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 ./ 20.0
    ./ide/addAIRtoSDK.sh 20.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 '20.0' like so:

    playerglobal.version = 20.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>
