Touch Viewer リリース後に作った副産物ですが、Win/Mac 両対応するように強化したので晒しておきます。
下記画像のような Flex プロジェクトのフォルダ構造を保っていれば、build.xml を実行するだけで、各 OS に対応した .exe や .dmg を書き出すことができます。
<?xml version="1.0" encoding="utf-8"?>
<!--
build.xml
-->
<project name="≪ プロジェクト名 ≫" basedir="." default="init">
<condition property="os" value="≪ Flex SDK のフルパス (Windows) ≫">
<os family="windows" />
</condition>
<condition property="os" value="≪ Flex SDK のフルパス (Mac) ≫">
<os family="mac" />
</condition>
<condition property="suffix" value=".exe">
<os family="windows" />
</condition>
<condition property="suffix" value=".dmg">
<os family="mac" />
</condition>
<property name="FLEX_HOME" value="${os}" />
<property name="ADT.JAR" value="${FLEX_HOME}/lib/adt.jar" />
<property name="AIR_CONFIG" value="${FLEX_HOME}/frameworks/air-config.xml" />
<property name="FLEX_TASKS_JAR" value="${FLEX_HOME}/ant/lib/flexTasks.jar" />
<property name="APP_ROOT_DIR" value="src" />
<property name="ASSET_DIR" value="asset" />
<property name="ICON_DIR" value="${ASSET_DIR}/icon" />
<property name="APP_NAME" value="${ant.project.name}" />
<property name="AIRI_NAME" value="${APP_NAME}.airi" />
<property name="DESCRIPTOR_NAME" value="${APP_NAME}-app.xml" />
<property name="NATIVE_APP_NAME" value="${APP_NAME}${suffix}" />
<property name="SWF_NAME" value="${APP_NAME}.swf" />
<property name="APP_ROOT_FILE" value="${APP_ROOT_DIR}/${APP_NAME}.mxml" />
<property name="APP_ROOT_DESCRIPTOR" value="${APP_ROOT_DIR}/${APP_NAME}-app.xml" />
<property name="KEYSTORE" value="≪デジタル証明書ファイル名≫.p12" />
<property name="STORETYPE" value="pkcs12" />
<property name="STOREPASS" value="≪デジタル証明書のパスワード≫" />
<taskdef resource="flexTasks.tasks" classpath="${FLEX_TASKS_JAR}" />
<target name="resources">
<copy
file = "${APP_ROOT_DESCRIPTOR}"
tofile = "${APP_NAME}-app.xml"
/>
<replaceregexp
file = "${APP_NAME}-app.xml"
match = "<content>.+?</content>"
replace = "<content>${APP_NAME}.swf</content>"
/>
<copy toDir="${ICON_DIR}">
<fileset dir="${APP_ROOT_DIR}/${ICON_DIR}" />
</copy>
</target>
<target name="amxmlc" depends="resources">
<mxmlc
file = "${APP_ROOT_FILE}"
output = "${SWF_NAME}"
configname = "air"
actionscript-file-encoding = "UTF-8"
incremental = "true"
debug = "false"
optimize = "true"
target-player = "10"
>
<load-config filename="${AIR_CONFIG}" />
</mxmlc>
</target>
<target name="prepare" depends="amxmlc">
<java jar="${ADT.JAR}" fork="true" failonerror="true">
<arg value = "-prepare" />
<arg value = "${AIRI_NAME}" />
<arg value = "${DESCRIPTOR_NAME}" />
<arg value = "${SWF_NAME}" />
<arg value = "${ICON_DIR}" />
</java>
</target>
<target name="package" depends="prepare">
<java jar="${ADT.JAR}" fork="true" failonerror="true">
<arg value = "-package" />
<arg value = "-storetype" />
<arg value = "${STORETYPE}" />
<arg value = "-keystore" />
<arg value = "${KEYSTORE}" />
<arg value = "-storepass" />
<arg value = "${STOREPASS}" />
<arg value = "-target" />
<arg value = "native" />
<arg value = "${NATIVE_APP_NAME}" />
<arg value = "${AIRI_NAME}" />
</java>
</target>
<target name="clean" depends="package">
<delete dir = "${ASSET_DIR}" />
<delete file = "${AIRI_NAME}" />
<delete file = "${SWF_NAME}" />
<delete file = "${SWF_NAME}.cache" />
<delete file = "${DESCRIPTOR_NAME}" />
</target>
<target name="init" depends="clean" />
</project>