up previous next index
Up: 5 rpm パッケージを開発する Previous: 5.3 rpm macro Next: 5.5 その他


5.4 Universal Binary

2006年の1月以降 OSXWS はデフォルトで Universal Binary のパッケージを作成しています。
ここでは Universal Binary rpm package の作成方法を簡単に示します。
MacWiki にも UniversalBinary の項目がありますので、
合わせてご覧ください。

はじめに

原則として i386, x86_64 双方のバイナリを独立してビルドし
最後に lipo で結合する方法を採ります。
これは、特に library 類を作成する際にi386 と x86_64 では ヘッダファイルを別にするもの(例えば libtiff)が有るからです。

spec file の基本形

BuildArch: fat を指定します。

%prep section
以下の様にして PPC, Intel それぞれに tree を分けます。

%setup -q -c %{name}-%{version}
pushd %{name}-%{version}
%patch1 -p1 -b .fat
popd

mv %{name}-%{version} INTEL
cp -a INTEL X86_64

%build section
以下の様にして i386, x86_64 それぞれ独立にビルドします。

pushd INTEL
CFLAGS="-O3 -arch i386 -mtune=pentium-m" \
CXXFLAGS="$CFLAGS" \
%configure --disable-dependency-tracking \
	--host=%{_rpm_platform32} \
	--build=%{_rpm_platform32} \
	--target=%{_rpm_platform32}

make
popd
pushd X86_64
CFLAGS="-O3 -arch x86_64 -mtune=core2" \
CXXFLAGS="$CFLAGS" \
%configure --disable-dependency-tracking \
	--host=%{_rpm_platform64} \
	--build=%{_rpm_platform64} \
	--target=%{_rpm_platform64}

make
popd

%install section
以下の様にして Universal Binary を作成します。

pushd INTEL
mkdir -p ${PWD}-root%{_bindir}
make install DESTDIR=${PWD}-root
popd
pushd X86_64
mkdir -p ${PWD}-root%{_bindir}
make install DESTDIR=${PWD}-root
cp -fRP COPYRIGHT README VERSION TODO html ..
popd

## Make Universal Binaries
filelist=$(find ./INTEL-root -type f | xargs file | sed -e 's,^\./INTEL-root/,,g' | \
	grep -E \(Mach-O\)\|\(ar\ archive\) |sed -e 's,:.*,,g' -e '/\for\ architecture/d')

for i in $filelist
do
	/usr/bin/lipo -create INTEL-root/$i X86_64-root/$i -output `basename $i` && \
	(cp -f `basename $i` INTEL-root/$i) || :
done

# check header files
for i in `find INTEL-root -name "*.h" -type f`
do
        TARGET=`echo $i | sed -e "s,.*INTEL-root,,"`
        TEMP=`diff -u INTEL-root/$TARGET X86_64-root/$TARGET > /dev/null || echo different`
        if [ -n "$TEMP" ]; then
                mv X86_64-root/$TARGET INTEL-root/${TARGET%.*}-x86_64.h
                mv INTEL-root/$TARGET INTEL-root/${TARGET%.*}-i386.h
		FILE=${TARGET##*/}
		FILE=${FILE%.*}
cat <<EOF > INTEL-root/$TARGET
#if defined (__i386__)
#include "${FILE}-i386.h"
#elif defined( __x86_64__ )
#include "${FILE}-x86_64.h"
#endif
EOF
        fi
done

# install
mkdir -p %{buildroot}
tar cf - -C INTEL-root . | tar xpf - -C %{buildroot}


up previous next index
Up: 5 rpm パッケージを開発する Previous: 5.3 rpm macro Next: 5.5 その他
KOBAYASHI Taizo
平成23年8月24日