Building with Ant
The latest Potomac builds include a new custom Ant task to enable command line and continuous integration builds. Using the Ant task is a bit complicated though, particularly because it requires a custom built, patched version of the Flex SDK.
Flex SDK requirements and custom patching
In order to do all the special processing required by Potomac, the Potomac Ant task uses the Flex Compiler Extensions capability. When building inside Flash Builder, the Potomac plugin uses a the Flash Builder Extensibility API. These two capabilities differ in what features they offer. Specifically the Flex Compiler Extension API does not currently provide a way to access constructor method information during compile. We’ve requested that feature be added to the Flex SDK and you can help us get it on Adobe’s radar by voting for the following bug:
https://bugs.adobe.com/jira/browse/ASC-4061
Until that bug is resolved and the feature is added to Flex, you’ll need to build a custom version of the SDK manually. Ok.. you can cheat and download a pre-patched copy from here: Flex SDK 4.0.0.14159 with patched As3Class
Steps (if you want to build the patched SDK yourself):
- Check out your version of the SDK (Adobe’s instructions here)
- Open/edit the file named “As3Class.java” under modules/compiler/src/java/flex2/compiler/as3/reflect
- At or around line 159 you should see code like:
if (f.ref != null && "$construct".equals(f.ref.name))
{
continue;
}change it to:
if (f.ref != null && "$construct".equals(f.ref.name))
{
constructor = new Method(f, this); //POTOMAC new line
continue;
} - At or around line 192 add the following new public variable:
public Method constructor; //POTOMAC - added this public field
- Now you’re ready to build the SDK (Adobe instructions here)
Potomac Ant Task Syntax
Potomac provides two new custom Ant tasks: <bundle> and <app>. We’ve attempt to provide a similar syntax to the regular Flex Ant tasks. Here is a sample build.xml that builds the Potomac core framework and example applications:
<?xml version="1.0" encoding="utf-8"?>
<project name="potomac_core" default="build" basedir=".">
<property name="FLEX_HOME" value="C:/Program Files/Adobe\Adobe Flash Builder 4 Plug-in/sdks/4.0.0"/>
<property name="SDK_VERSION" value="4.0.0.14159"/>
<property name="POTOMAC_WORKSPACE_HOME" value="c:/myWorkspace"/> <!-- Where the not yet compiled bundles are -->
<property name="POTOMAC_TARGET_PLATFORM" value="C:/targetPlatform"/>
<property name="POTOMAC_BUILD_OUTPUT" value="c:/output"/>
<property name="POTOMAC_ANT_JAR" value="c:/potomacAntTasks_1.0.0.v08122010.jar"/>
<taskdef name="bundle" classname="org.potomacframework.build.BundleTask"/>
<taskdef name="app" classname="org.potomacframework.build.AppTask"/>
<taskdef name="html-wrapper" classname="flex.ant.HtmlWrapperTask" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>
<target name="build">
<delete includeEmptyDirs="true">
<fileset dir="${POTOMAC_BUILD_OUTPUT}" includes="**/*" defaultexcludes="no"/>
</delete>
<bundle id="potomac_core" debug="false" verbose="true" >
<source-path path-element="potomac_core/src"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/framework.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/spark.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/rpc.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/osmf.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</bundle>
<bundle id="potomac_ui" debug="false" verbose="true">
<source-path path-element="potomac_ui/src"/>
<library-path file="potomac_ui/flexlib.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/framework.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/spark.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/rpc.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/osmf.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</bundle>
<bundle id="potomac_ui_templates_dark" debug="false" verbose="true">
<source-path path-element="potomac_ui_templates_dark/src"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/framework.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/spark.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/rpc.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/osmf.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</bundle>
<bundle id="potomac_mailexample_mail" debug="false" verbose="true">
<source-path path-element="potomac_mailexample_mail/src"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/framework.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/spark.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/rpc.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/osmf.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</bundle>
<bundle id="potomac_mailexample_rss" debug="false" verbose="true">
<source-path path-element="potomac_mailexample_rss/src"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/framework.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/spark.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/rpc.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/osmf.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</bundle>
<bundle id="potomac_advancedexample_core" debug="false" verbose="true" version="HI MOM" >
<source-path path-element="potomac_advancedexample_core/src"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/framework.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/spark.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/rpc.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/osmf.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<external-library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</bundle>
<app id="PotomacAdvancedExample" debug="false" verbose="true"
file="PotomacAdvancedExample/src/PotomacAdvancedExample.mxml">
<source-path path-element="PotomacAdvancedExample/src"/>
<rsl-path file="${FLEX_HOME}/frameworks/libs/framework.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/framework_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="framework_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/tlf/1.0.0.595/textLayout_1.0.0.595.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="textLayout_1.0.0.595.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/osmf.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/osmf_flex.4.0.0.13495.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="osmf_flex.4.0.0.13495.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/rpc.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/4.0.0.14159/rpc_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="rpc_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/spark.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/spark_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="spark_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/sparkskins_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="sparkskins_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</app>
<app id="PotomacMailExample" debug="false" verbose="true"
file="PotomacMailExample/src/main.mxml">
<source-path path-element="PotomacMailExample/src"/>
<rsl-path file="${FLEX_HOME}/frameworks/libs/framework.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/framework_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="framework_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/textLayout.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/tlf/1.0.0.595/textLayout_1.0.0.595.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="textLayout_1.0.0.595.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/osmf.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/osmf_flex.4.0.0.13495.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="osmf_flex.4.0.0.13495.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/rpc.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/4.0.0.14159/rpc_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="rpc_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/spark.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/spark_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="spark_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<rsl-path file="${FLEX_HOME}/frameworks/libs/sparkskins.swc">
<url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/sparkskins_${SDK_VERSION}.swz" policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
<url rsl-url="sparkskins_4.0.0.0.swf" policy-file-url=""/>
</rsl-path>
<library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc"/>
<library-path file="${FLEX_HOME}/frameworks/libs/flex.swc"/>
<library-path file="${FLEX_HOME}/frameworks/libs/utilities.swc"/>
<library-path file="${FLEX_HOME}/frameworks/libs/datavisualization.swc"/>
</app>
<copy file="${FLEX_HOME}/frameworks/rsls/rpc_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacMailExample/rpc_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/spark_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacMailExample/spark_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/osmf_flex.4.0.0.13495.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacMailExample/osmf_flex.4.0.0.13495.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/sparkskins_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacMailExample/sparkskins_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/framework_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacMailExample/framework_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/textLayout_1.0.0.595.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacMailExample/textLayout_4.0.0.0.swf"/>
<html-wrapper
output="${POTOMAC_BUILD_OUTPUT}/PotomacMailExample"
file="PotomacMailExample.html"
swf="main"
history="false"
express-install="true"
version-detection="true"
version-major="10"
version-minor="0"
version-revision="0"
height="100%"
width="100%"
title="Potomac Mail Example"
bgcolor="white"
/>
<copy file="${FLEX_HOME}/frameworks/rsls/rpc_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacAdvancedExample/rpc_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/spark_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacAdvancedExample/spark_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/osmf_flex.4.0.0.13495.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacAdvancedExample/osmf_flex.4.0.0.13495.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/sparkskins_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacAdvancedExample/sparkskins_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/framework_${SDK_VERSION}.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacAdvancedExample/framework_${SDK_VERSION}.swf"/>
<copy file="${FLEX_HOME}/frameworks/rsls/textLayout_1.0.0.595.swf" tofile="${POTOMAC_BUILD_OUTPUT}/PotomacAdvancedExample/textLayout_4.0.0.0.swf"/>
<html-wrapper
output="${POTOMAC_BUILD_OUTPUT}/PotomacAdvancedExample"
file="PotomacAdvancedExample.html"
swf="PotomacAdvancedExample"
history="false"
express-install="true"
version-detection="true"
version-major="10"
version-minor="0"
version-revision="0"
height="100%"
width="100%"
title="Potomac Advanced Example"
bgcolor="white"
/>
</target>
</project>
Running Ant – IMPORTANT!
When running Ant, you’ll need to add ALL of the jars in your Flex SDK/libs directory as well as the jar file containing the Potomac Ant tasks (i.e. potomacAntTasks_1.0.0.v08122010.jar) to the classpath. You can do this via Ant’s -lib command line option. More details on how to add jars to Ant’s classpath are available here on the Apache Ant site.

