lazarus/tools/install/cross_unix/create_linux_cross_win32_rpm.sh
2007-11-05 21:05:20 +00:00

199 lines
5.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Author: Mattias Gaertner
# License: LGPL
# Abstract: Download, compile binutils and FPC
set -e
#set -x
# This is the root for all download and building directories
if [ ! -d "$BuildRoot" ]; then
BuildRoot=~/freepascal
fi
#===============================================================================
# parse command line parameters
echo "parsing parameters ..."
DownloadBinutils=no
DownloadFPC=no
BuildBinutils=no
BuildCrossFPC=no
BuildNormalFPC=no
BuildCrossWin32RPM=no
Params=$@
for p in $Params; do
case "$p" in
all)
DownloadBinutils=yes
DownloadFPC=yes
BuildBinutils=yes
BuildLinWin32RPM=no
BuildNormalRPM=no
;;
downloadbinutils)
DownloadBinutils=yes
;;
downloadfpc)
DownloadFPC=yes
;;
buildbinutils)
BuildBinutils=yes
;;
buildnormalfpc)
BuildNormalFPC=yes
;;
buildcrossfpc)
BuildCrossFPC=yes
;;
buildcrosswin32rpm)
BuildCrossWin32RPM=yes
;;
*)
echo "Unknown option: $p"
echo
echo "Usage:"
echo " $0 [all] [downloadbinutils] [downloadfpc] [buildbinutils] [buildcrossfpc] [buildcrosswin32rpm]"
exit -1
;;
esac
done
# expand paths
BuildRoot=$(echo $BuildRoot | sed -e 's#//#/#g' -e 's#/$##')
Targets='i386-win32'
#===============================================================================
# download and build binutils and fpc
set -x
Params=""
if [ $DownloadBinutils = "yes" ]; then
Params="$Params downloadbinutils"
fi
if [ $DownloadFPC = "yes" ]; then
Params="$Params downloadfpc"
fi
if [ $BuildBinutils = "yes" ]; then
Params="$Params buildbinutils"
fi
if [ $BuildNormalFPC = "yes" ]; then
Params="$Params buildnormalfpc"
fi
if [ $BuildCrossFPC = "yes" ]; then
Params="$Params buildcrossfpc"
fi
if [ "x$Params" != "x" ]; then
Params="$Params targets=i386-win32"
echo "calling update_cross_fpc.sh $Params ..."
./update_cross_fpc.sh $Params || exit
fi
#===============================================================================
# build fpc_crosswin32 rpm
if [ $BuildCrossWin32RPM = "yes" ]; then
#----------------------------------------------------------------------------
# retrieve the version information
#----------------------------------------------------------------------------
echo -n "retrieving the FPC version ..."
VersionFile="$BuildRoot/fpc/compiler/version.pas"
CompilerVersion=`cat $VersionFile | grep ' *version_nr *=.*;' | sed -e 's/[^0-9]//g'`
CompilerRelease=`cat $VersionFile | grep ' *release_nr *=.*;' | sed -e 's/[^0-9]//g'`
CompilerPatch=`cat $VersionFile | grep ' *patch_nr *=.*;' | sed -e 's/[^0-9]//g'`
CompilerVersionStr="$CompilerVersion.$CompilerRelease.$CompilerPatch"
Release=$(date +%y%m%d)
echo " $CompilerVersionStr-$Release"
#----------------------------------------------------------------------------
# create temporary directory
#----------------------------------------------------------------------------
TmpSrcDir=/tmp/fpc_crosswin32
echo "create temporary directory $TmpSrcDir ..."
rm -rf $TmpSrcDir
mkdir -p $TmpSrcDir
#----------------------------------------------------------------------------
# collect binutils
#----------------------------------------------------------------------------
echo "collecting binutils from $BuildRoot/binutils/cross/bin/ ..."
BinDir=$TmpSrcDir/usr/bin/
mkdir -p $BinDir
MyIntel=i686
for Target in $Targets; do
TargetCPU=$(echo $Target | sed -e 's#^\(.*\)-.*$#\1#')
TargetOS=$(echo $Target | sed -e 's#^.*-\(.*\)$#\1#')
BinUtilsCPU=$TargetCPU
BinUtilsOS=$TargetOS
if [ $TargetOS = "win32" ]; then
BinUtilsOS="mingw32"
BinUtilsCPU=$MyIntel
fi
BinUtilsDir=$BuildRoot/binutils/cross/bin/
BinUtilsPrefix="$BinUtilsCPU-$BinUtilsOS-"
cd ${BinUtilsDir}
for binutility in $(ls -B ${BinUtilsPrefix}*); do
NewName=$(echo $binutility | sed -e "s#^$BinUtilsPrefix##")
if [ ! $NewName = "windres" ]; then
NewName="fpc-${TargetCPU}-${TargetOS}-$NewName"
fi
cp ${BinUtilsDir}${binutility} ${BinDir}${NewName}
done
cd -
done
#----------------------------------------------------------------------------
# collect fpc libs (e.g. .ppu/.o)
#----------------------------------------------------------------------------
echo "collecting fpc libs (e.g. .ppu/.o) from $BuildRoot/binutils/cross/destination/ ..."
for Target in $Targets; do
FPCLibDir=lib/fpc/$CompilerVersionStr/units # !!! no / at end
mkdir -p $TmpSrcDir/$FPCLibDir
cp -a $BuildRoot/binutils/cross/destination/$FPCLibDir/$Target $TmpSrcDir/$FPCLibDir/
done
#----------------------------------------------------------------------------
# copy tools (windres)
#----------------------------------------------------------------------------
FPCLibDir=lib/fpc/$CompilerVersionStr # !!! no / at end
DestDir=$FPCBuildDir/usr/$FPCLibDir
cp -p $BuildRoot/bin/* $DestDir/
#----------------------------------------------------------------------------
# create tgz
#----------------------------------------------------------------------------
echo "creating tgz ..."
SrcTGZ=$(../rpm/get_rpm_source_dir.sh)/SOURCES/fpc_crosswin32-$CompilerVersionStr-$Release.tar.gz
cd $TmpSrcDir
tar czf $SrcTGZ .
cd -
#----------------------------------------------------------------------------
# change spec file
#----------------------------------------------------------------------------
echo "creating spec file ..."
SpecFileTemplate=../rpm/fpc_crosswin32.spec.template
SpecFile=fpc_crosswin32.spec
cat $SpecFileTemplate | \
sed -e 's/FPCVERSION/'"$CompilerVersionStr/" \
-e 's/FPCRELEASE/'"$Release/" \
> $SpecFile
rpmbuild --nodeps -ba $SpecFile
echo "The new rpm can be found at $(../rpm/get_rpm_source_dir.sh)/RPMS/i386/fpc_crosswin32-$CompilerVersionStr-$Release.i386.rpm"
else
echo "To build the rpm call this script with parameter all or buildcrosswin32rpm"
fi
# end.