ANE用のDLLをLinuxのautotoolsをつかって作成する手順です。
以前、途中までを記述しましたが、やっと一通りの流れが、
./configure; make;
だけで終了するようにすることができました。
まず、はじめにLinuxの前提ですが、
なぜか64bit版ではSeg faultを起こしてしまうので、32bit版のほうがいいみたいです。
でまず、準備から
環境の前提
$uname -m -r 2.6.31.12-174.2.3.fc12.i686.PAE i686 $automake --version automake (GNU automake) 1.11.1 $autoconf --version autoconf (GNU Autoconf) 2.63
というのが私の環境です。
MinGW32のインストール
$yum install mingw32-¥*
で終了です。
ソース環境の構築
ここでは、プログラムの説明はしません。
従って、hello.cは自分で用意してください。
また、ANE用のFlashRuntimeExtensions.(lib,h)は、以下のようの配置してある前提とします。
├── lib
│ └── win32
│ └── FlashRuntimeExtensions.lib
└── src
├── FlashRuntimeExtensions.h
└── hello.c
Makefile.amの作成
下記のようにMakefile.amを2つ用意します。
Makefile.am
ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src
src/Makefile.am
lib_LTLIBRARIES = libhello.la
libhello_la_LDFLAGS = -no-undefined \
-avoid-version \
-Wl,-o,.libs/hello.dll \
-Wl,../lib/win32/FlashRuntimeExtensions.lib \
-Wl,--output-def,.libs/hello.def,--out-implib,.libs/hello.dll.a
libhello_la_SOURCES = hello.c
ここで、作成するdllはhello.dllであると指定しています。
また、ここでは使いませんが、何かの役に立つかもしれないので、
hello.defとhello.dll.aも同時に作成するよう指定しています。
(多分、最終的なANE用のDLLを作成する場合には必要ないと思いますが・・・)
これでフォルダは以下のようになったはずです。
├── Makefile.am
├── lib
│ └── win32
│ └── FlashRuntimeExtensions.lib
└── src
├── FlashRuntimeExtensions.h
├── Makefile.am
└── hello.c
./configure; make; で構築できるようにする
$autoscan $mv configure.scan configure.ac
と実行したら、以下のようにconfigure.acを書き換えます。
私が追加したのは
AC_INIT
AM_INIT_AUTOMAKE
AC_CONFIG_MACRO_DIR
AC_PROG_RANLIB
AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
意外は追加していません。
この辺りは、autoconfのバージョンによって多少違うようですが、
トラブルは避けたいので、自分の環境でautoscanした結果を編集した方がよいようです。
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.63])
AC_INIT([hello], [0.1], [coltware@gmail.com])
AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_SRCDIR([src/FlashRuntimeExtensions.h])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
# Checks for programs.
AC_PROG_CC
AC_PROG_RANLIB
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdint.h string.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_INT32_T
AC_TYPE_UINT32_T
AC_TYPE_UINT8_T
# Checks for library functions.
AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT
そして、次のようにコマンドを実行していきます。
$mkdir m4 $libtoolize $aclocal -I m4 $autoheader $automake -a -c $autoconf
で一応の環境の構築は終了です。
DLLの構築
以下のようなconfigureを実行するスクリプトを作成します。
export MINGW=/usr/bin/i686-pc-mingw32
export CC=$MINGW-gcc
export AR=$MINGW-ar
export LD=$MINGW-ld
export AS=$MINGW-as
export NM=$MINGW-nm
export RANLIB=$MINGW-ranlib
export STRIP=$MINGW-strip
export DLLTOOL=$MINGW-dlltool
export WINDRES=$MINGW-windres
./configure \
--target=i686-mingw32-pc \
--host=i686-linux-gnu \
archive_cmds_need_lc=no
ここでかなりはまったのが、最後のarchive_cmds_need_lc=noの部分です。
これがないと、libtoolで-lcを加えてしまいエラーになってしまいました。
毎回、これを手でうつのは面倒なのスクリプトにします。
$./make
これで終了です。
作成されると、
src/.lib/hello.dll
に作成されます。
あとはこれをほかの環境に移動して、ANEファイルを作成してください。
たかだか、hello.cのためだけにここまでするのは大げさですが、
ここから、ほかのライブラリが必要になった場合とか、ソースが多くなってきた場合とかに
autotoolsを使うと結構便利です。
ちょっと、変更すればほかの環境用にもできるはずです。
(まだ、自分ではやっていませんが・・・)


