MinGW Cross Compile on Ubuntu > Start

構成する

構成


作業に使用したソフトウエアとそのバージョンは次のようになります。補足とあわせて説明します。

VMware Player


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 Linux


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 するのに使います。

shell scripts


クロス ビルドで使用するスクリプト群です。

/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 コマンドへのリンクを作成します。

env.sh
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
cross
#!/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
# 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
# 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
# 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}"
cross-ppconfigure
#!/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
cross-cmake
#!/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}
build-cc
#!/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} "$@"
replibtool.sh
#!/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}"
reppc.sh
#!/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
make_link.sh
#!/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

Link


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 スクリプトを大幅に書き換えました。
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

編集にはIDが必要です