#!/bin/bash set -x set -e #------------------------------------------------------------------------------ # parse parameters #------------------------------------------------------------------------------ Usage="Usage: [OS_TARGET=xxx] [CPU_TARGET=xxx] [BINUTILSPREFIX=xxx] $0 fpc|fpc-src [notemp] [release]" TmpDir=$TEMP if [ -z "$TmpDir" ]; then TmpDir=~/tmp fi TmpDir=$TmpDir/fpc_patchdir # what package should be built ... PackageName="" if [ "$1" = fpc ]; then PackageName=fpc-laz fi if [ "$1" = fpc-src ]; then PackageName=$1 fi if [ "x$PackageName" = "x" ]; then echo $Usage exit -1 fi shift WithTempDir=yes if [ "x$1" = "xnotemp" ]; then WithTempDir=no shift fi FPCSrcDir=$1 if [ "x$FPCSrcDir" = "x" ]; then echo $Usage exit -1 fi FPCSrcDir=$(echo $FPCSrcDir) shift FPCRelease=$1 if [ "x$FPCRelease" = "x" ]; then FPCRelease=$(date +%y%m%d) else shift fi if [ ! -d $FPCSrcDir/compiler ]; then echo "The directory $FPCSrcDir does not look like a fpc source directory (fpc/)" exit -1 fi #------------------------------------------------------------------------------ # quick tests ./check_fpc_dependencies.sh fakeroot -v getBINUTILSPREFIX() { _IFS="$IFS" IFS=":" set $PATH IFS="$_IFS" for p in "$@" do set `echo $p/${TARGET_PREFIX}*as` as="$1" if test -x "$as" then TARGET_PREFIX="${as%%as}" break fi done if test -x "${TARGET_PREFIX}as" then echo "${TARGET_PREFIX}" fi } #------------------------------------------------------------------------------ # retrieve the version information echo -n "getting FPC version from local git ..." VersionFile="$FPCSrcDir/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" FPCVersion="$CompilerVersion.$CompilerRelease.$CompilerPatch" echo " $CompilerVersionStr-$FPCRelease" #------------------------------------------------------------------------------ # architecture dependent stuff Arch=`dpkg --print-architecture` CPU_TARGET="${CPU_TARGET:-$Arch}" case "$CPU_TARGET" in i386) ppcbin=386; FPCArch=i386;; amd64) ppcbin=x64; FPCArch=x86_64;; powerpc) ppcbin=ppc; FPCArch=powerpc;; sparc) ppcbin=sparc; FPCArch=sparc;; arm) ppcbin=arm; FPCArch=arm;; arm64) ppcbin=a64; FPCArch=aarch64;; *) echo "$CPU_TARGET is not supported." exit -1;; esac if [ "$CPU_TARGET" != "$Arch" ] then TARGET_SUFFIX="-${CPU_TARGET}" TARGET_PREFIX="${CPU_TARGET}-" CROSSINSTALL=1 PPPRE=ppcross else PPPRE=ppc fi if test -n "$OS_TARGET" then TARGET_SUFFIX="${TARGET_SUFFIX}-${OS_TARGET}" TARGET_RPPEFIX="${TARGET_PREFIX}${OS_TARGET}-" TARGET="${CPU_TARGET}-${OS_TARGET}" CROSSINSTALL=1 fi if test -z "$FPC" then FPC="`fpc -P$FPCArch -PB`" fi BINUTILS=binutils # detect any finalprefix elements if test -n "$TARGET_PREFIX" -a -z "$BINUTILSPREFIX" then BINUTILSPREFIX="`getBINUTILSPREFIX $BINUTILSPREFIX`" if test -n "$BINUTILSPREFIX" then echo "BINUTILSPREFIX=$BINUTILSPREFIX" BINUTILS=`dpkg -S "${BINUTILSPREFIX}as" | sed "s/:.*//"` else echo "Can't find cross binutils automatically, consider setting BINUTILSPREFIX" exit 1 fi fi #------------------------------------------------------------------------------ # download/export fpc git if needed SrcTGZ=$(pwd)/fpc-$FPCVersion-$FPCRelease.tar.gz if [ ! -f $SrcTGZ ]; then ./create_fpc_export_tgz.sh $FPCSrcDir $SrcTGZ fi # optional: https://gitlab.com/freepascal.org/fpc/build under ../build FPCManDir=$FPCSrcDir/../build/man #------------------------------------------------------------------------------ # create a temporary copy of the fpc sources to patch it if [ "$WithTempDir" = "yes" ]; then if [ -d $TmpDir ]; then rm -rf $TmpDir fi mkdir -p $TmpDir cd $TmpDir echo "unpacking $SrcTGZ to "$(pwd)" ..." tar xzf $SrcTGZ cd - FPCSrcDir=$TmpDir/fpc else TmpDir=$FPCSrcDir fi #------------------------------------------------------------------------------ # setup variables CurDir=`pwd` FPCBuildDir=$TmpDir/fpc_build FPCDeb=$CurDir/${PackageName}${TARGET_SUFFIX}_$FPCVersion-${FPCRelease}_$Arch.deb ResourceDir=$CurDir/debian_$PackageName DebianInstallDir=$FPCBuildDir/usr DebianRulezDir=$FPCBuildDir/DEBIAN/ DebianDocDir=$FPCBuildDir/usr/share/doc/$PackageName${TARGET_SUFFIX} DebianLintianDir=$FPCBuildDir/usr/share/lintian DebianSourceDir=$FPCBuildDir/usr/share/fpcsrc/$FPCVersion Date=`date --rfc-822` #------------------------------------------------------------------------------ # patch sources ReplaceScript=replace_in_files.pl # set version numbers in all Makefiles echo "set version numbers in all Makefiles ..." perl replace_in_files.pl -sR -f 'version=\d.\d.\d' -r version=$CompilerVersionStr -m 'Makefile(.fpc)?' $FPCSrcDir/* #------------------------------------------------------------------------------ mkdir -p $DebianDocDir chmod 755 $DebianDocDir mkdir -p $DebianRulezDir chmod 755 $DebianRulezDir mkdir -p $DebianLintianDir chmod 755 $DebianLintianDir if [ "$PackageName" = "fpc-src" ]; then # copy fpc sources mkdir -p $DebianSourceDir cp -a $FPCSrcDir/* $DebianSourceDir/ fi if [ "$PackageName" = "fpc-laz" ]; then # build fpc mkdir -p $FPCBuildDir/etc cd $FPCSrcDir make clean all ${FPCArch:+FPCArch=$FPCArch} ${OS_TARGET:+OS_TARGET=$OS_TARGET} ${FPC:+FPC=$FPC} ${BINUTILSPREFIX:+BINUTILSPREFIX=$BINUTILSPREFIX} ${CROSSINSTALL:+CROSSINSTALL=$CROSSINSTALL} mkdir -p $DebianInstallDir make install INSTALL_PREFIX=$DebianInstallDir ${FPCArch:+FPCArch=$FPCArch} ${OS_TARGET:+OS_TARGET=$OS_TARGET} ${FPC:+FPC=$FPC} ${BINUTILSPREFIX:+BINUTILSPREFIX=$BINUTILSPREFIX} ${CROSSINSTALL:+CROSSINSTALL=$CROSSINSTALL} # remove pas2jslib.so as debian require the version in its filename rm -f $DebianInstallDir/lib/libpas2jslib.so if test -z "$BINUTILSPREFIX" then # need up to date samplecfg that chains cross compiler additions SampleCfg=$DebianInstallDir/lib/fpc/$FPCVersion/samplecfg grep 'fpc-cross.cfg' "$SampleCfg" &>/dev/null || \ sed -i -e "/^FPCPATH=/aFPCPARENT=\"\`dirname \"\$1\"\`\" ;/^#ENDIF NEEDCROSSBINUTILS/i#include \$FPCPARENT/fpc-cross.cfg" "$SampleCfg" else cat > $DebianInstallDir/lib/fpc/$FPCVersion/fpc${TARGET_SUFFIX}.cfg < $FPCBuildDir/usr/share/man/man1/$shortman.gz done else echo "WARNING: man directory not found: $FPCManDir" fi fi #------------------------------------------------------------------------------ # create rulez and files # change debian files DEPENDS="$BINUTILS" if test -n "$CROSSINSTALL" then DEPENDS="$DEPENDS, fpc (= $FPCVersion)" fi # get installed size in kb DebSize=$(du -s $FPCBuildDir | cut -f1) # create debian control file, which contains the package description echo "creating DEBIAN/control file" cat $ResourceDir/control \ | sed -e "s/FPCVERSION/$FPCVersion/g" -e "s/ARCH/$Arch/g" \ -e "s/^Package: .*/Package: $PackageName$TARGET_SUFFIX/" \ -e "s/Depends: binutils/Depends: $DEPENDS/" \ -e "s/DEBSIZE/$DebSize/" \ > $DebianRulezDir/control mkdir -p $DebianLintianDir/overrides cp $ResourceDir/lintian.overrides $DebianLintianDir/overrides/$PackageName$TARGET_SUFFIX # identify conf files if test -n "$TARGET_SUFFIX" then echo "/usr/lib/fpc/$FPCVersion/fpc${TARGET_SUFFIX:--cross}.cfg" >> $DebianRulezDir/conffiles fi # create debian changelog file, needed for version echo "creating usr/share/doc/fpc/changelog file ..." File=$DebianDocDir/changelog echo "fpc ($FPCVersion-$FPCRelease) unstable; urgency=low" > $File echo ' * Unofficial snapshot build for lazarus' >> $File echo " -- Mattias Gaertner $Date" >> $File echo "" >> $File cat $ResourceDir/changelog >> $File rm -f $File.gz gzip -n --best $File cp $File.gz $File.Debian.gz # create postinst if needed if [ -f "$ResourceDir/postinst" ] then if [ -z "$CROSSINSTALL" ] then echo "creating DEBIAN/postinst file" cat $ResourceDir/postinst \ | sed -e "s/FPCVERSION/$FPCVersion/g" -e "s/PPCBIN/$PPPRE$ppcbin/g" \ > $DebianRulezDir/postinst cat >> $DebianRulezDir/postinst <> /usr/lib/fpc/$FPCVersion/fpc-cross.cfg << FPCCFG #if $FPCVersion = \\\$fpcversion #include /usr/lib/fpc/$FPCVersion/fpc-cross.cfg #end FPCCFG CFG chmod a+rx $DebianRulezDir/postinst # un-install cat > $DebianRulezDir/prerm < $DebianRulezDir/postinst </dev/null '#include /usr/lib/fpc/$FPCVersion/fpc${TARGET_SUFFIX}.cfg' /usr/lib/fpc/$FPCVersion/fpc-cross.cfg || echo '#include /usr/lib/fpc/$FPCVersion/fpc${TARGET_SUFFIX}.cfg' >> /usr/lib/fpc/$FPCVersion/fpc-cross.cfg CROSS chmod a+rx $DebianRulezDir/postinst # un-install cat > $DebianRulezDir/prerm <