#!/bin/bash # # This file is part of the LibreOffice project. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # # create debuginfo and debugsource packages from LO rpm & deb files # (generated by using --enable-symbols) # build path export BUILD_PATH=$PWD export BUILD_LOG=$BUILD_PATH/pack-debug.log if [ $# -gt 0 ] then for i in "$@" do case $i in --only-rpm) ONLY_RPM=1;; --only-deb) ONLY_DEB=1;; *) echo "Usage: pack-debug [--only-rpm | --only-deb]" && exit 1;; esac done fi # set install dirname and product version if [ ! -f config.log ]; then echo "config.log not found. Run this script from build root." exit 1; fi # create pack-debug.log file echo create debug packages >$BUILD_LOG eval $(grep ^INSTALLDIRNAME config.log) eval $(grep ^PRODUCTVERSION config.log) # set package base name, eg. collaboraoffice6.0 DEBUGSRC_PACKAGENAME=$INSTALLDIRNAME$PRODUCTVERSION ################################# # Function for re-build RPM files ################################# function repack_rpm { # set environment based on config.log # for find-requires-x11.sh used by rpm __find_requires eval $(grep ^PLATFORMID config.log) export PLATFORMID eval $(grep ^build_cpu config.log) export build_cpu #################################### echo create RPM debug source package #################################### DEBUGSRC="$(find workdir -name ${DEBUGSRC_PACKAGENAME}.spec.log)" # create spec file, based on the spec file of the brand package cat $DEBUGSRC | awk ' /^Name:/ { print "Summary: Debug source for package "$2; print $0"-debugsource";next } /^Group:/ { print $1" Development/Debug";next } /^Brand module/ { print gensub("Brand module", "Source files", "");next } /^%attr/ || /^Summary:/ { next } {print} END { print "%defattr(-,root,root)" } ' > ${DEBUGSRC}-debugsource buildroot=$(cat $DEBUGSRC-debugsource | awk '/^BuildRoot/{print$2}') topdir=$(dirname $(dirname $buildroot)) mkdir -p $buildroot $topdir/RPMS/BUILD $topdir/RPMS/RPMS rm -rf $buildroot # create source file list find $BUILD_PATH -name '*[.][hc]xx' -o -name '*[.][hc]' | grep -Ev '/(instdir|qa|DEBS)/' | # list all directories for complete rpm remove awk -v home=$BUILD_PATH ' { split($0, a, home "/") n=split(a[2], b, "/") c=home for(i=1;i> ${DEBUGSRC}-debugsource # start rpmbuild for debug source package ln -s / $buildroot # debug build source package rpmbuild -bb --define "_unpackaged_files_terminate_build 0" ${DEBUGSRC}-debugsource --target $build_cpu --buildroot=$buildroot ################################################################### echo create rpm debug info packages by processing logged spec files ################################################################### for i in $BUILD_PATH/workdir/installation/CollaboraOffice/rpm/logging/*/*.spec.log do # repackage only rpm packages with non-stripped so files if grep -q '^%attr.*[.]\(so\|bin\)\([.].*\)\?\"' $i then echo ================ $i ================ pack=$(cat $i | awk '/^Name/{print$2}') buildroot=$(cat $i | awk '/^BuildRoot/{print$2}') topdir=$(dirname $(dirname $buildroot)) rpmdir=$(echo $topdir | sed 's/_inprogress$//') # create empty buildroot directory rm -rf $buildroot mkdir -p $buildroot $topdir/RPMS/BUILD $topdir/RPMS/RPMS cd $buildroot echo REBUILD: $rpmdir/RPMS/${pack}-[0-9]*.rpm # extract rpm package rpm2cpio $rpmdir/RPMS/${pack}-[0-9]*.rpm | cpio -idmv # create stripped libraries and linked debug info files for j in $(cat $i | awk '/^%attr.*[.](so|bin)([.].*)?"$/{print$2}') do so=$(echo $j | tr -d '"') cd ./$(dirname $so) so=$(basename $so) objcopy --only-keep-debug $so $so.dbg objcopy --strip-debug $so objcopy --add-gnu-debuglink=$so.dbg $so cd $buildroot done # copy files for double package generation (using hard links) cp -rl $buildroot $buildroot.copy # stripped package rpmbuild -bb --define "_unpackaged_files_terminate_build 0" $i --target $build_cpu --buildroot=$buildroot rm -rf $buildroot mv $buildroot.copy $buildroot mkdir -p $topdir/RPMS/BUILD $topdir/RPMS/RPMS # create spec file for the debug info package cat $i | awk ' /^Name:/ { print "Summary: Debug information for package "$2; print $0"-debuginfo";next } /^Group:/ { print $1" Development/Debug";next } /^%attr.*[.](so|bin)([.].*)?"$/ { print substr($0, 1, length($0) - 1)".dbg\""; next } /^%attr/ || /^Summary:/ { next } {print} ' > ${i}-debuginfo # create debug info package rpmbuild -bb --define "_unpackaged_files_terminate_build 0" ${i}-debuginfo --target $build_cpu --buildroot=$buildroot fi done echo Update RPM download tar.gz mv $topdir/RPMS/RPMS/*/*.rpm $rpmdir/RPMS/ cd $rpmdir/.. TARGET_RPM=$(ls *_download/*.tar.gz) TARGET_DEBUG=$(echo $TARGET_RPM | sed 's/.tar.gz$/-debug.tar.gz/') SOURCE_RPM=$(find *_rpm -type f | grep -v debug) SOURCE_DEBUG=$(find *_rpm -type f | grep -E '(debug|readme|README)') tar c $SOURCE_RPM | gzip >$TARGET_RPM tar c $SOURCE_DEBUG | gzip >$TARGET_DEBUG cd $BUILD_PATH rm -rf $topdir } ################################# # Function for re-build DEB files ################################# function repack_deb { #################################### echo create DEB debug source package #################################### DEBUGSRC=$BUILD_PATH/workdir/installation/CollaboraOffice/deb/listfile/en-US/epm_gid_Module_Root_Brand.lst echo Base spec file: $DEBUGSRC # create spec file, based on the spec file of the brand package cat $DEBUGSRC | awk ' /^%product/ { print gensub("Brand module", "Debug source package", "", $0) ;next } /^%description/ { print gensub("Brand module", "Debug source package", "", $0) ;next } /^[cdf] / { next } {print} ' > ${DEBUGSRC}-debugsource # create source file list find $BUILD_PATH -name '*[.][hc]xx' -o -name '*[.][hc]' | grep -Ev '/(instdir|qa|DEBS)/' | # list all directories awk -v home=$BUILD_PATH ' { split($0, a, home "/") n=split(a[2], b, "/") c=home for(i=1;i> ${DEBUGSRC}-debugsource echo Spec file of debug source package: ${DEBUGSRC}-debugsource # debug build source package $BUILD_PATH/workdir/UnpackedTarball/epm/epm -f deb -g ${INSTALLDIRNAME}${PRODUCTVERSION}-debugsource ${DEBUGSRC}-debugsource --output-dir DEBS -v ###################################################################### echo create DEB debug info packages by processing logged EPM lst files ###################################################################### for i in $BUILD_PATH/workdir/installation/CollaboraOffice/deb/listfile/en-US/*.lst do # repackage only deb packages with non-stripped so files if grep -q '^f .*[.]\(so\|bin\)\([.].*\)\?$' $i then echo ================ $i ================ TARGET_NAME=$INSTALLDIRNAME"$(echo $(basename $i) | awk ' /epm_gid_Module_Optional_Firebird.lst/{print"basis6.0-firebird"} /epm_gid_Module_Optional_Gnome.lst/{print"basis6.0-gnome-integration"} /epm_gid_Module_Optional_Grfflt.lst/{print"basis6.0-graphicfilter"} /epm_gid_Module_Optional_Kde.lst/{print"basis6.0-kde-integration"} /epm_gid_Module_Optional_OGLTrans.lst/{print"basis6.0-ogltrans"} /epm_gid_Module_Optional_PostgresqlSdbc.lst/{print"basis6.0-postgresql-sdbc"} /epm_gid_Module_Pdfimport.lst/{print"basis6.0-extension-pdf-import"} /epm_gid_Module_Prg_Base_Bin.lst/{print"basis6.0-base"} /epm_gid_Module_Prg_Calc_Bin.lst/{print"basis6.0-calc"} /epm_gid_Module_Prg_Impress_Bin.lst/{print"basis6.0-impress"} /epm_gid_Module_Prg_Math_Bin.lst/{print"basis6.0-math"} /epm_gid_Module_Prg_Wrt_Bin.lst/{print"basis6.0-writer"} /epm_gid_Module_Pyuno.lst/{print"basis6.0-pyuno"} /epm_gid_Module_Reportbuilder.lst/{print"basis6.0-extension-report-builder"} /epm_gid_Module_Root_Brand.lst/{print"6.0"} /epm_gid_Module_Root.lst/{print"basis6.0-core"} /epm_gid_Module_Root_Ure_Hidden.lst/{print"6.0-ure"} ' | sed s/6.0/$PRODUCTVERSION/g)" echo TARGET NAME: $TARGET_NAME # create stripped libraries and linked debug info files for j in $(cat $i | awk '/^f .*[.](so|bin)([.].*)?$/{print$6}') do cd $(dirname $j) so=$(basename $j) # remove old temporary files rm -f $so.copy $so.dbg # keep original file cp $so $so.copy objcopy --only-keep-debug $so $so.dbg objcopy --strip-debug $so objcopy --add-gnu-debuglink=$so.dbg $so cd $BUILD_PATH done # create stripped package $BUILD_PATH/workdir/UnpackedTarball/epm/epm -f deb -g $TARGET_NAME $i --output-dir DEBS -v # create spec file for the debug info package cat $i | awk ' /^%product/ { print "%product Debug info package of "$0 ;next } /^%description/ { print "%description Debug info package of "$0 ;next } /^f .*[.](so|bin)([.].*)?$/ { print $1,$2,$3,$4,$5".dbg",$6".dbg"; next } /^[cf] / { next } {print} ' > ${i}-debuginfo # create debug info package $BUILD_PATH/workdir/UnpackedTarball/epm/epm -f deb -g ${TARGET_NAME}-debuginfo $i-debuginfo --output-dir DEBS -v # restore original non stripped library files for j in $(cat $i | awk '/^f .*[.](so|bin)([.].*)?$/{print$6}') do cd $(dirname $j) so=$(basename $j) rm $so.dbg # restore original file mv -f $so.copy $so cd $BUILD_PATH done fi done echo Update DEB download tar.gz debdir=$(ls -d $BUILD_PATH/workdir/installation/CollaboraOffice/deb/install/*_deb) mv $BUILD_PATH/DEBS/*.deb $debdir/DEBS/ cd $debdir/.. TARGET_DEB=$(ls *_download/*.tar.gz) TARGET_DEBUG=$(echo $TARGET_DEB | sed 's/.tar.gz$/-debug.tar.gz/') SOURCE_DEB=$(find *_deb -type f | grep -v debug) SOURCE_DEBUG=$(find *_deb -type f | grep -E '(debug|readme|README)') tar c $SOURCE_DEB | gzip >$TARGET_DEB tar c $SOURCE_DEBUG | gzip >$TARGET_DEBUG cd $BUILD_PATH rm -rf DEBS } # start deb re-build test -z "$ONLY_RPM" -a "$(find workdir/installation/CollaboraOffice/deb/listfile -name '*.lst')" != "" && repack_deb >$BUILD_LOG 2>&1 || \ echo 'Skip DEB debug package generation (--only-rpm or missing EPM lst files).' # start rpm re-build test -z "$ONLY_DEB" -a "$(find workdir -name '*spec.log')" != "" && repack_rpm >>$BUILD_LOG 2>&1 || \ echo 'Skip RPM debug package generation (--only-deb or missing RPM spec files).'