MinGW Cross Compile on Ubuntu > Start
VMware Player 3.1.1
接続するドライブ イメージは2つ用意しました。はじめは ubuntu 本体をインストールするイメージです。2つめは swap 専用のイメージです。
メインメモリを 10G 以上載せていて空きメモリーに余裕があるなら、設定ファイル *.vmx に次の行を追加すれば作業イメージを作成しなくなります。 VMware - 憩いの場 Wiki <http://old.ikoinoba.net/wiki/?VMware>
ubuntu 10.04 desktop amd64
ubuntu は AMD64 版を使用しています。 32 ビット版でも少しの変更で動くと思います。 ubuntu をインストール後に再起動し、必要なツール類をインストールします。端末(ターミナル)から apt-get を実行します。 root 権限で端末を起動していない場合は su か sudo で行ってください。
※ mingw-w64 0~20100125-3build1 はパッケージミス(?)により必要なファイルを欠いてます。
※ 具体的には /usr/lib/gcc/amd64-mingw32msvc/4.4.2/ 下に libgcc.a などが存在しません。
AMD64 でビルドしないなら mingw-w64 は不要です。 bsdtar は rpm ファイルを unpack するのに使います。
クロス ビルドで使用するスクリプト群です。
/usr/xmingw/xmingw32 ディレクトリーを作成し、これらのスクリプトをディレクトリー直下に置きます。考えがまとまってないのでぐだぐだです。
スクリプトを保存する際は改行コードを LF で保存してください。 CRLF ではエラーになります。
cross-cmake は役にたたない可能性が高いです。
make_link.sh は一度だけ実行します。 mingw 関連コマンドへのリンクを ${XMINGW}/bin に作成します。
reppc.sh は pkgconfig ファイルの prefix 行を置き換えます。 bin/*-config 系の prefix 行は置き換え対象にしていません。
環境に合わるために *-config 系の prefix 行を書き換えます。 chmod u+x も忘れずに。
env.sh は xmingw のための環境変数を設定します。ターミナル(端末)を立ち上げてカレント コンテキストで実行してください。つまり . env.sh します。
cross , cross-ppconfigure それと *.sh には chmod u+x を忘れずに設定してください。
スクリプトの役割は次のようになります。
端末(ターミナル)を起動し、 env.sh をカレント コンテキストで実行します。
コンパイルする。
configure する。具体的な例はライブラリのビルドの記録を参照してください。
CmakeMingw - KitwarePublic
http://www.vtk.org/Wiki/CmakeMingw
CMake Cross Compiling - KitwarePublic
http://www.paraview.org/Wiki/CMake_Cross_Compiling
2010/12/10fri ページを分割しました。
2010/10/13wed こまごまとした修正。
2010/10/6wed cross-cmake, reppc.sh を修正。
2010/9/24fri shell scripts を更新。 build-cc を追加。
2010/9/23thu shell scripts に cross-cmake を追加。 cross.env を修正。
2010/9/13mon shellscripts に replibtool.sh を追加。
2010/9/10fri shell scripts を更新。
2010/9/1wed ぐだぐだな記述をやや修正。 env.sh を修正。
2010/8/30mon cross-ppconfig の修正。 apt-get install するパッケージを追加。
2010/8/28sat スクリプトを大幅に書き換えました。
VMware Player 3.1.1
- hda - boot(100mb), root(all)
- hdb - swap
接続するドライブ イメージは2つ用意しました。はじめは ubuntu 本体をインストールするイメージです。2つめは swap 専用のイメージです。
メインメモリを 10G 以上載せていて空きメモリーに余裕があるなら、設定ファイル *.vmx に次の行を追加すれば作業イメージを作成しなくなります。 VMware - 憩いの場 Wiki <http://old.ikoinoba.net/wiki/?VMware>
mainMem.useNamedFile = "FALSE"
ubuntu 10.04 desktop amd64
ubuntu は AMD64 版を使用しています。 32 ビット版でも少しの変更で動くと思います。 ubuntu をインストール後に再起動し、必要なツール類をインストールします。端末(ターミナル)から apt-get を実行します。 root 権限で端末を起動していない場合は su か sudo で行ってください。
apt-get install gcc autoconf automake libtoolize make pkg-config apt-get install mingw32 mingw-w64 apt-get install libgtk2.0-dev intltool apt-get install p7zip-full bsdtar
- mingw-w64 0~20100125-3build1
- mingw32-binutils 2.20-0.1
- gcc-mingw32 4.4.2-3
- mingw32-runtime 3.15.2-0ubuntu1
※ mingw-w64 0~20100125-3build1 はパッケージミス(?)により必要なファイルを欠いてます。
※ 具体的には /usr/lib/gcc/amd64-mingw32msvc/4.4.2/ 下に libgcc.a などが存在しません。
AMD64 でビルドしないなら mingw-w64 は不要です。 bsdtar は rpm ファイルを unpack するのに使います。
クロス ビルドで使用するスクリプト群です。
/usr/xmingw/xmingw32 ディレクトリーを作成し、これらのスクリプトをディレクトリー直下に置きます。考えがまとまってないのでぐだぐだです。
スクリプトを保存する際は改行コードを LF で保存してください。 CRLF ではエラーになります。
cross-cmake は役にたたない可能性が高いです。
make_link.sh は一度だけ実行します。 mingw 関連コマンドへのリンクを ${XMINGW}/bin に作成します。
reppc.sh は pkgconfig ファイルの prefix 行を置き換えます。 bin/*-config 系の prefix 行は置き換え対象にしていません。
環境に合わるために *-config 系の prefix 行を書き換えます。 chmod u+x も忘れずに。
env.sh は xmingw のための環境変数を設定します。ターミナル(端末)を立ち上げてカレント コンテキストで実行してください。つまり . env.sh します。
cross , cross-ppconfigure それと *.sh には chmod u+x を忘れずに設定してください。
スクリプトの役割は次のようになります。
- env.sh
- クロスコンパイルを手助けする環境変数を設定するスクリプトです。
- cross
- クロスコンパイルのための環境変数を設定してコマンドを実行します。 --cflags, --ldflags オプションを付けて実行すると標準出力にそれぞれのオプションを出力します。
- cross-ppconfig
- クロスコンパイルのための設定と定型的な作業をまとめた configure です。 ppconfig は親ディレクトリ−の configure を呼び出します。
- cross-config
- cross-config に同じですが、カレントディレクトリーの configure を呼び出します。 ln -s で作成してください。
- cross-cmake
- クロスコンパイルのための設定と定型的な作業をまとめた cmake です。
- build-cc
- make でビルド環境の cc を必要とするときに使用するスクリプトです。${XMINGW}/bin に ln -s で作成してください。
- replibtool.sh
- configure が作成した libtool の修正に使用するスクリプトです。
- reppc.sh
- ${XLIBRARY}以下に含まれる */lib/pkgconfig/*.pc の prefix 行を修正します。ライブラリーを更新したさいに実行してください。
- make_link.sh
- ${XMINGW}/bin に apt-get した mingw コマンドへのリンクを作成します。
export XMINGW=/usr/xmingw/xmingw32 #export XMINGW=`dirname "$0"` export XMINGW_ORIG_PATH=${PATH} export XMINGW_ORIG_CC=${CC} export XMINGW_ORIG_CXX=${CXX} export XMINGW_ORIG_PKG_CONFIG_PATH=${PKG_CONFIG_PATH} export XMINGW_ORIG_LD_LIBRARY_PATH=${LD_LIBRARY_PATH} export XMINGW_ORIG_MANPATH=${MANPATH} export XMINGW_ORIG_INFOPATH=${INFOPATH} export XMINGW_ORIG_C_INCLUDE_PATH=${C_INCLUDE_PATH} export XMINGW_ORIG_CPLUS_INCLUDE_PATH=${CPLUS_INCLUDE_PATH} export XMINGW_ORIG_LIBRARY_PATH=${LIBRARY_PATH} export XLOCAL=${XMINGW}/local export XLIBRARY=${XLOCAL}/libs export XLIBRARY_SET=${XLIBRARY}/default_set export TARGET=mingw32 #__prefix=/usr/bin/i586-mingw32msvc- #__prefix=${XMINGW}/bin/ #export AR="${__prefix}ar" #export AS="${__prefix}as" #export CC="${__prefix}cc " #export CXX="${__prefix}g++ " #export DLLTOOL="${__prefix}dlltool" #export DLLWRAP="${__prefix}dllwrap" #export NM="${__prefix}nm" #export LD="${__prefix}ld" #export OBJDUMP="${__prefix}objdump" #export RANLIB="${__prefix}ranlib" #export STRIP="${__prefix}strip" #export WINDRES="${__prefix}windres" #export EXEEXT=".exe" #export SHREXT=".dll" export BUILD_CC="${XMINGW}/bin/build-cc " #LD_PRELOAD=/usr/bin/cachcc1/cachecc1.so #CACHECC1_DIR=/home/tmp/cachecc1dir
#!/bin/bash #PREFIX=/usr/xmingw/xmingw32 PREFIX=`dirname "$0"` if [ "" = "${XMINGW}" ] then . "${PREFIX}/env.sh" fi PREFIX="${XMINGW}" . "${PREFIX}/cross.env" . "${PREFIX}/cross.opt" . "${PREFIX}/cross.exp" if [ 0 -eq $# ] then echo ${RESULT} exit 0; fi prog="$1" shift $prog "$@"
# cross.env lib_collection="" if [ -f "${XLIBRARY_SET}" ] then lib_collection=`cat "${XLIBRARY_SET}"` fi if [ "" = "${lib_collection}" ] then lib_collection=" lib gimp gtk+ " fi XMINGW_PKG_CONFIG_PATH="" XMINGW_PATH="" #XMINGW_LD_LIBRARY_PATH="" XMINGW_LIBRARY_ROOT="" XMINGW_LIBRARY_PATH="" XMINGW_C_INCLUDE_PATH="" XMINGW_CFLAGS="" XMINGW_LDFLAGS="" XMINGW_MANPATH="" XMINGW_INFOPATH="" for c in ${lib_collection} do p="${XLIBRARY}/${c}" export XMINGW_LIBRARY_ROOT="${XMINGW_LIBRARY_ROOT}:${p}" if [ -d "${p}" ] then a="${p}/lib/pkgconfig" if [ -d "${a}" ] then export XMINGW_PKG_CONFIG_PATH="${XMINGW_PKG_CONFIG_PATH}:${a}" fi a="${p}/bin" if [ -d "${a}" ] then export XMINGW_PATH="${XMINGW_PATH}:${a}" fi # export XMINGW_LD_LIBRARY_PATH="${XMINGW_LD_LIBRARY_PATH}:${p}/lib" a="${p}/lib" if [ -d "${a}" ] then export XMINGW_LIBRARY_PATH="${XMINGW_LIBRARY_PATH}:${a}" export XMINGW_LDFLAGS="${XMINGW_LDFLAGS} -L${a}" fi a="${p}/include" if [ -d "${a}" ] then export XMINGW_C_INCLUDE_PATH="${XMINGW_C_INCLUDE_PATH}:${a}" export XMINGW_CFLAGS="${XMINGW_CFLAGS} -I${a}" fi export XMINGW_MANPATH="${XMINGW_MANPATH}:${p}/man" export XMINGW_INFOPATH="${XMINGW_INFOPATH}:${p}/info" fi done #export XMINGW_CPLUS_INCLUDE_PATH="${XMINGW_C_INCLUDE_PATH}" export XMINGW_PATH="${XMINGW}/bin:${XMINGW_PATH}"
# cross.opt __SCRIPT_NAME=`basename "$0"` __version() { echo "0.0.1" } __usage() { echo "usage: ${__SCRIPT_NAME} [option] [--] [command arguments...]" } __help() { __usage echo " --cflags cflags. --ldflags ldflags. -h --help show this message. --version print the version. " } RESULT="" while [ 0 -lt $# ] do case "$1" in --cflags) RESULT="${RESULT} ${XMINGW_CFLAGS}" ;; --ldflags) RESULT="${RESULT} ${XMINGW_LDFLAGS}" ;; -h|--help) __help exit 1;; --version) __version exit 0;; --) shift break;; -*|--*) echo "${__SCRIPT_NAME}: unsupported option \`$1'." echo "${__SCRIPT_NAME}: try \`${__SCRIPT_NAME} --help' for more information." exit 1;; *) break;; esac shift done
# cross.exp export C_INCLUDE_PATH="" export LIBRARY_PATH="" export PKG_CONFIG_PATH="${EXTRA_PKG_CONFIG_PATH}:${XMINGW_PKG_CONFIG_PATH}" export PATH="${XMINGW_PATH}:${PATH}" #export LD_LIBRARY_PATH="${XMINGW_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}" export MANPATH="${XMINGW_MANPATH}:${MANPATH}" export INFOPATH="${XMINGW_INFOPATH}:${INFOPATH}"
#!/bin/bash CONFIG_SHELL=/bin/sh export CONFIG_SHELL #PREFIX=/usr/xmingw/xmingw32 PREFIX=`dirname "$0"` if [ "" = "${XMINGW}" ] then . "${PREFIX}/env.sh" fi PREFIX=${XMINGW} . "${PREFIX}/cross.env" #. "${PREFIX}/cross.opt" . "${PREFIX}/cross.exp" echo -n "args: " echo "$@" cache=cross-config.cache sh ../configure --cache-file="$cache" \ --target=${TARGET} --host=${TARGET} --build=${MACHTYPE} \ "$@" status=$? rm -f "$cache" exit $status
#!/bin/bash #PREFIX=/usr/xmingw/xmingw32 PREFIX=`dirname "$0"` if [ "" = "${XMINGW}" ] then . "${PREFIX}/env.sh" fi PREFIX="${XMINGW}" . "${PREFIX}/cross.env" . "${PREFIX}/cross.exp" cmake_toolchain_file="./cmake_toolchain_file.cmake" library_directories=`echo ${XMINGW_LIBRARY_ROOT}|sed -e 's/:/ /g'` cat << EOS > "${cmake_toolchain_file}" SET(CMAKE_CACHEFILE_DIR "${PWD}") # the name of the target operating system SET(CMAKE_SYSTEM_NAME Windows) # which compilers to use for C and C++ SET(CMAKE_C_COMPILER ${TARGET}-gcc) SET(CMAKE_CXX_COMPILER ${TARGET}-g++) # here is the target environment located #SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc ) SET(CMAKE_FIND_ROOT_PATH ${library_directories}) # adjust the default behaviour of the FIND_XXX() commands: # search headers and libraries in the target environment, search # programs in the host environment set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) EOS dir="" case "`basename \"$0\" | sed -e 's/\(^\|.\+-\)\([a-z]\+\)$/\2/'`" in ppcmake) dir=".." ;; esac cache="${PWD}/CMakeCache.txt" rm -f "${cache}" cmake "${dir}" -DCMAKE_CROSSCOMPILING:BOOL=true -DCMAKE_VERBOSE_MAKEFILE:BOOL=true -DCMAKE_TOOLCHAIN_FILE=${cmake_toolchain_file} "$@" status=$? # rm "${cmake_toolchain_file}" exit ${status}
#!/bin/bash export PATH=${XMINGW_ORIG_PATH} export CC=${XMINGW_ORIG_CC} export CXX=${XMINGW_ORIG_CXX} export PKG_CONFIG_PATH=${XMINGW_ORIG_PKG_CONFIG_PATH} export LD_LIBRARY_PATH=${XMINGW_ORIG_LD_LIBRARY_PATH} export MANPATH=${XMINGW_ORIG_MANPATH} export INFOPATH=${XMINGW_ORIG_INFOPATH} export C_INCLUDE_PATH=${XMINGW_ORIG_C_INCLUDE_PATH} export CPLUS_INCLUDE_PATH=${XMINGW_ORIG_CPLUS_INCLUDE_PATH} export LIBRARY_PATH=${XMINGW_ORIG_LIBRARY_PATH} cmd=`basename "$0" | sed -e 's/^build-//' | tr '[a-z]' '[A-Z]'` val=`eval echo \$\{${cmd}\}` if test "" = "${val}" then case "${cmd}" in CC) val="`which cc`" ;; CXX) val="`which c++`" ;; *) echo unsupported exit 1 esac fi ${val} "$@"
#!/bin/bash lt=libtool fl="${lt}.orig" if test ! -e ${fl} then cp "${lt}" "${fl}" fi cat "${fl}" | \ sed -e 's/^allow_undefined_flag="unsupported"/allow_undefined_flag="supported"/' | \ sed -e 's/^always_export_symbols=no/always_export_symbols=yes/' \ > "${lt}"
#!/bin/bash PREFIX=`dirname "$0"` if [ "" = "${XMINGW}" ] then . "${PREFIX}/env.sh" fi for dir in `find "${XLIBRARY}" -type d -name pkgconfig` do pre=`dirname "${dir}"` pre=`dirname "${pre}"` for f in `find "${dir}" -type f -name \*.pc` do if grep 'prefix=.*' "${f}" >/dev/null 2>&1; then cat "${f}" | sed -e "s&^prefix=.*&prefix=${pre}&" > "${f}.rep" mv "${f}.rep" "${f}" fi done done
#!/bin/bash PREFIX=`dirname "$0"` if [ "" = "${XMINGW}" ] then . "${PREFIX}/env.sh" fi function make_symlink() { local sym=$1 local rl=$2 if test -e ${sym} then echo "exist: ${sym}" else echo "linking: ${sym} from ${rl}" ln -s -T "${rl}" "${sym}" fi } chost=i586-mingw32msvc source=/usr/bin destination=${XMINGW}/bin while read fl do sym="${destination}/${fl}" rl="${source}/${chost}-${fl}" make_symlink "${sym}" "${rl}" sym="${destination}/${TARGET}-${fl}" make_symlink "${sym}" "${rl}" done <<- EOS ar as c++ cc cpp dlltool dllwrap g++ gcc gcov gprof ld nm objcopy objdump ranlib readelf strip windmc windres EOS
端末(ターミナル)を起動し、 env.sh をカレント コンテキストで実行します。
. /usr/mingw/mingw32/env.sh
コンパイルする。
echo "int main(){return 0;}" > hoge.c ${XMINGW}/cross gcc -o hoge.exe hoge.c ls hoge.* objdump -a hoge.exe
configure する。具体的な例はライブラリのビルドの記録を参照してください。
bsdtar -jxf 何かのアーカイブ.tar.bz2 cd 何かのアーカイブ mkdir target mkdir build cd build ${XMINGW}/cross-ppconfigure CPPFLAGS=`${XMINGW}/cross --cflags` make
CmakeMingw - KitwarePublic
http://www.vtk.org/Wiki/CmakeMingw
CMake Cross Compiling - KitwarePublic
http://www.paraview.org/Wiki/CMake_Cross_Compiling
2010/12/10fri ページを分割しました。
2010/10/13wed こまごまとした修正。
2010/10/6wed cross-cmake, reppc.sh を修正。
2010/9/24fri shell scripts を更新。 build-cc を追加。
2010/9/23thu shell scripts に cross-cmake を追加。
2010/9/13mon shellscripts に replibtool.sh を追加。
2010/9/10fri shell scripts を更新。
2010/9/1wed ぐだぐだな記述をやや修正。 env.sh を修正。
2010/8/30mon cross-ppconfig の修正。 apt-get install するパッケージを追加。
2010/8/28sat スクリプトを大幅に書き換えました。
タグ
コメントをかく