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.16 is a follow up release to version 4.15. 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.8 or greater (* 1)                 JAVA_HOME

Ant 1.8 or greater (* 1)                      ANT_HOME

Adobe AIR Integration Kit (* 2)               AIR_HOME

Adobe Flash Player Content Debugger (* 3)     FLASHPLAYER_DEBUGGER

Adobe Flash Player playerglobal swcs (* 4)    PLAYERGLOBAL_HOME

Optional: Text Layout Framework (* 5)         TLF_HOME

Optional: Adobe Extension Manager CS5 (* 6)   ADOBE_EXTENSION_MANAGER

Optional: Flex Messaging Common (* 7)         BLAZEDS_HOME

Java Cryptography Extensions
    (see note (*8))

---------------------------------------------------------------------

* 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)
The Adobe AIR integration kit for Windows can be downloaded from:

    https://airdownload.adobe.com/air/win/download/32.0/AdobeAIRSDK.zip

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

    https://airdownload.adobe.com/air/mac/download/32.0/AdobeAIRSDK.dmg

The Adobe AIR integration kit for Linux is no longer available from Adobe.

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.

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

    - Windows: https://fpdownload.macromedia.com/pub/flashplayer/updaters/32/flashplayer_32_sa_debug.exe

    - Mac: https://fpdownload.macromedia.com/pub/flashplayer/updaters/32/flashplayer_32_sa_debug.dmg

    - Linux: https://fpdownload.macromedia.com/pub/flashplayer/updaters/32/flash_player_sa_linux_debug.x86_64.tar.gz

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.

* 4)
The Adobe Flash Player playerglobal.swc for 32.0 can be downloaded from:

    https://fpdownload.macromedia.com/get/flashplayer/updaters/32/playerglobal32_0.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.

* 5)
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.

* 6)
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
	
On Windows 10, download the Adobe Extension Manager CS6 from:

	http://download.macromedia.com/pub/dw_exchange/extension_manager/win/AdobeExtensionManager6_0_8All.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.

* 7)
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.

* 8)
The Java Cryptography Extensions (JCE) Unlimited Strength jars are needed in
order to download 3rd party software. Download and install this from Oracle
which version you need will depend on your Java version and OS.

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=32.0 -Dair.sdk.version=32.0

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

    ./ide/setFlashPlayerVersion.sh ./ 32.0
    ./ide/addAIRtoSDK.sh 32.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 '32.0' like so:

    playerglobal.version = 32.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. However, Adobe has stopped providing all older versions of
playerglobal.swc, and only version 32.0 is available now.

It can be found at:

    https://fpdownload.macromedia.com/get/flashplayer/updaters/32/playerglobal32_0.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/binaries/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>
