#!/bin/bash # Copyright 2006, 2008, 2009, 2010, 2013 Patrick J. Volkerding, Sebeka, MN, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Modified by Stuart Winter for Slackware ARM. # # Record toolchain & other info for the build log: slackbuildinfo # Paths to skeleton port's source & real Slackware source tree: export CWD=$SLACKSOURCE/$PKGNAM export PORTCWD=$PWD # Determine the CFLAGS for the known architectures: case $ARCH in arm) SLKCFLAGS="-march=armv5te -pipe -g -O3 -fno-strict-aliasing -mfloat-abi=soft" ### -U_FORTIFY_SOURCE # -U_FORTIFY_SOURCE was added to fix this problem: # http://sourceware.org/ml/libc-help/2009-02/msg00023.html ARCH_CONFARGS="--without-selinux" LIBDIRSUFFIX="" ;; esac # Hand off the $ARCH variable to $SLACKWARE_ARCH to avoid confusing glibc: SLACKWARE_ARCH=$ARCH unset ARCH # Version of the Linux Kernel headers that we'll be compiling with: # These headers are not found in /usr/src/linux but are explicitley extraced # from the d/kernel-headers package and glibc is configured to compile against # them. This was because in days of old, glibc would often not compile against # the headers of the newest Kernel we were running and required a previous release. # This isn't usually the case in 2012, but it's still far easier to build against an # older set of Kernel headers - especially when just rebuilding glibc rather than # upgrading (usually an upgrade works with a newer set of Kernel headers). # Linux 3.x always has a three digit version - e.g. 3.2.1 KERNELHEADERS=3.10.17 # Sanity check on the version number in the install scripts: # Don't need this for ARMedslack at the moment (only if we are maintaining our own # copies if we were out of sync with Slackware). #if ! grep -vq libutil-${VERSION}.so $CWD/doinst.sh-glibc ; then # echo "FATAL: doinst.sh scripts have wrong version numbers." # exit 1 #fi # This function fixes a doinst.sh file for x86_64. # With thanks to Fred Emmott. fix_doinst() { if [ "x$LIBDIRSUFFIX" = "x" ]; then return; fi; # Fix "( cd usr/lib${LIBDIRSUFFIX} ;" occurrences sed -i "s#lib ;#lib${LIBDIRSUFFIX} ;#" install/doinst.sh # Fix "lib/" occurrences sed -i "s#lib/#lib${LIBDIRSUFFIX}/#g" install/doinst.sh # Fix "( cd lib" occurrences sed -i "s#( cd lib\$#( cd lib${LIBDIRSUFFIX}#" install/doinst.sh if [ "$SLACKWARE_ARCH" = "x86_64" ]; then sed -i 's#ld-linux.so.2#ld-linux-x86-64.so.2#' install/doinst.sh fi } # Extract the source: function extractglibcsource () { cd $TMPBUILD rm -rf glibc* # Unpack the main from the Slackware source tree: echo "Unpacking main glibc source..." tar xf $CWD/glibc-$VERSION.tar.xz \ || tar xf $CWD/glibc-$VERSION.tar.bz2 \ || tar xf $CWD/glibc-$VERSION.tar.gz cd glibc-$VERSION* || exit 1 # Clean up leftover CVS directories: find . -type d -name CVS -exec rm -r {} \; 2> /dev/null # Apply Slackware-specific patches (taken from glibc.SlackBuild): # # # Use old-style locale directories rather than a single (and strangely # formatted) /usr/lib/locale/locale-archive file: zcat $CWD/glibc.locale.no-archive.diff.gz | patch -p1 --verbose || exit 1 # The is_IS locale is causing a strange error about the "echn" command # not existing. This patch reverts is_IS to the version shipped in # glibc-2.5: zcat $CWD/is_IS.diff.gz | patch -p1 --verbose || exit 1 # Fix NIS netgroups: zcat $CWD/glibc.nis-netgroups.diff.gz | patch -p1 --verbose || exit 1 # Support ru_RU.CP1251 locale: zcat $CWD/glibc.ru_RU.CP1251.diff.gz | patch -p1 --verbose || exit 1 # Fix missing MAX macro in getcwd.c: zcat $CWD/glibc.getcwd.max.macro.diff.gz | patch -p1 --verbose || exit 1 # Fix resolver problem with glibc-2.9: zcat $CWD/glibc-2.10-dns-no-gethostbyname4.diff.gz | patch -p0 --verbose || exit 1 # This reverts a patch that was made to glibc to fix "namespace leakage", # which seems to cause some build failures (e.g. with conntrack): zcat $CWD/glibc.revert.to.fix.build.breakages.diff.gz | patch -p1 --verbose || exit 1 # This partial security patch still applies and might be needed: zcat $CWD/glibc.git-96611391ad8823ba58405325d78cefeae5cdf699-CVE-2010-3847b.patch.gz | patch -p1 --verbose || exit 1 # Make it harder for people to trick ldd into running code: zcat $CWD/glibc.ldd.trace.through.dynamic.linker.diff.gz | patch -p1 --verbose || exit 1 # Make glibc compile with binutils using --enable-initfini-array. # At this time, we do not recommend this due to probable ABI breakage. # The also patch needs work before it would apply. # ***NOT READY*** #zcat $CWD/glibc.git-4a531bb0b3b582cb693de9f76d2d97d970f9a5d5.patch.gz | patch -p1 --verbose || exit 1 # # Avoid the Intel optimized asm routines for now because they break # the flash player. We'll phase this in when it's safer to do so. zcat $CWD/glibc.disable.broken.optimized.memcpy.diff.gz | patch -p1 --verbose || exit 1 # Fix buffer overrun in regexp matcher. This bug is deemed low impact since # the buffer contents cannot be controlled, but could lead to a crash. zcat $CWD/glibc.CVE-2013-0242.diff.gz | patch -p1 --verbose || exit 1 # Fix stack overflow in getaddrinfo with many results. This bug can only be # triggered through DNS poisoning or through the use of a hostile DNS # server (in which case you already have problems), and requires large # amounts of data to be sent to the targeted machine. May lead to a # crash. Considered low impact. zcat $CWD/glibc.CVE-2013-1914.diff.gz | patch -p1 --verbose || exit 1 # Remove pt_chown by default, as it can be used for a local privilege # escalation. However, although this is worth patching in the -current # version, it requires a non-default (and known to weaken security) setting # for FUSE. Additionally, the patch is not portable to older versions of # glibc (but thanks Mancha for porting it to 2.17!). On older versions # of glibc, making /usr/libexec/pt_chown a symlink to /bin/true will # provide the same fix, if needed. But the insecure setting for FUSE # probably opens up many other possible exploits and should be avoided. zcat $CWD/glibc.CVE-2013-2207.diff.gz | patch -p1 --verbose || exit 1 # Patch integer overflows in pvalloc, valloc, and # posix_memalign/memalign/aligned_alloc (CVE-2013-4332). zcat $CWD/glibc.CVE-2013-4332.diff.gz | patch -p1 --verbose || exit 1 # Security patches: patch -p1 --verbose < $CWD/glibc-2.17_strcoll-change.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2012-4424.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2012-4412.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2013-4237.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2013-4788.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2013-4458.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-4043.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-0475.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-5119.diff || exit 1 patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-6040.diff || exit 1 # Security hardening patch from Florian Weimer: patch -p1 --verbose < $CWD/glibc-2.17_hardening.diff || exit 1 # Bugfix patch for optimization in gcc-4.8+: patch -p1 --verbose < $CWD/glibc-2.17_gcc48-unsafe-optim.diff || exit 1 # Fix parsing of numeric hosts in gethostbyname_r: zcat $CWD/glibc.CVE-2015-0235.glibc217.diff.gz | patch -p1 --verbose || exit 1 # Patch CVE-2015-7547: zcat $CWD/glibc-2.17_CVE-2015-7547.diff.gz | patch -p1 --verbose || exit 1 ############################################################################################### # Slackware ARM patches # This is a mixture of patches taken from Debian/Ubuntu and Gentoo. # For different builds of glibc, we often have to take some patches from a few distributions # in order to get a working build (although usually only if we're using a different version of # glibc than the other distributions), so we leave the code commented out as we'll need to use # it sooner or later! ############################################################################################### # Apply Debian/Ubuntu's ARM patches: tar xvvf $PORTCWD/sources/eglibc*.tar.xz || exit 1 # Wipe a few since these are for glibc 2.16 are are Debian specific: #rm -f debian/patches/arm/{local-soname-hack.diff,local-atomic.diff,cvs-ldconfig-cache-abi.diff,unsubmitted-ldconfig-cache-abi.diff,unsubmitted-armhf-linker.diff} # for i in debian/patches/arm/*diff ; do auto_apply_patch $i || exit 1 done # Clean up CVS mess: find . -type d -name CVS -print0 | xargs -0 rm -rf # Ensure permissions & ownerships: slackhousekeeping # Create a separate build directory: mkdir -vpm755 build_dir cd build_dir } # Temporary build locations: export TMPBUILD=$TMP/build-$PKGNAM # This is the initial $DESTDIR: export PKG=$TMP/package-glibc-incoming-tree mkpkgdirs # Delete & re-create temporary directories then cd into $TMPBUILD # Then we'll compile the following packages from it: PGLIBC=$TMP/package-glibc PSOLIBS=$TMP/package-glibc-solibs PZONE=$TMP/package-glibc-zoneinfo PI18N=$TMP/package-glibc-i18n PPROFILE=$TMP/package-glibc-profile PDEBUG=$TMP/package-glibc-debug # Empty & create these locations first: for dir in $PKG $PGLIBC $PSOLIBS $PZONE $PI18N $PPROFILE $PDEBUG ; do rm -rf $dir mkdir -vpm755 $dir done # Create an incoming directory structure for glibc to be built into: mkdir -vpm755 $PKG/{var/{run/nscd,db/nscd},lib${LIBDIRSUFFIX},sbin,usr/{bin,lib${LIBDIRSUFFIX},sbin,include,doc,man,share}} # Extract our pre-made Linux Kernel include files. # All I did for these was extract the source, copy the config file in place and # run make oldconfig, then tar up the include dir. # mkdir -vpm755 $TMPBUILD/kernelheaders/ echo "Extracting Linux Kernel headers into $TMPBUILD" # We keep these in the d/ series. #tar xf $PORTCWD/../../d/kernel-headers/sources/kernel-headers-${KERNELHEADERS}.tar.xz -C $TMPBUILD/kernelheaders/ || exit 1 tar xf $PORTCWD/../../../source/d/kernel-headers/sources/kernel-headers-${KERNELHEADERS}.tar.xz -C $TMPBUILD/kernelheaders/ || exit 1 ################# Build glibc ############################# echo "[**] Building NPTL version of glibc [**]" # Extract, patch the source & cd into the build dir: extractglibcsource || exit 1 # Configure: # Note: the --enable-kernel option tells glibc which obsolete options to # compile *INTO* glibc, not what to compile out!! # See http://www.mail-archive.com/lfs-dev@linuxfromscratch.org/msg11060.html # To see what'd be compiled in for the older versions, look at: # glibc-2.9/sysdeps/unix/sysv/linux/kernel-features.h # Slackware uses this, but Slackware ARM still keeps a copy of the headers # in the source tree which we extract whenever we build glibc. # --with-headers=/usr/include \ # Make build directory: AUTOCONF=false \ CFLAGS="$SLKCFLAGS" \ ../configure $ARCH_CONFARGS \ --prefix=/usr \ --infodir=/usr/info \ --mandir=/usr/man \ --libdir=/usr/lib${LIBDIRSUFFIX} \ --enable-kernel=2.6.32 \ --with-headers=$TMPBUILD/kernelheaders/include \ --enable-add-ons=libidn,nptl,ports \ --enable-obsolete-rpc \ --enable-profile \ --with-tls \ --with-__thread \ --without-cvs \ --build=$SLACKWARE_ARCH-slackware-linux-gnueabi \ --host=$SLACKWARE_ARCH-slackware-linux-gnueabi \ --target=$SLACKWARE_ARCH-slackware-linux-gnueabi || failconfig # Build: make-3.81 PARALLELMFLAGS="$NUMJOBS" || make-3.81 || exit 1 # Install into local package: make-3.81 install install_root=$PKG || failinstall make-3.81 localedata/install-locales install_root=$PKG || failinstall # The prevailing standard seems to be putting unstripped libraries in # /usr/lib/debug/ and stripping the debugging symbols from all the other # libraries. mkdir -vpm755 $PKG/usr/lib${LIBDIRSUFFIX}/debug cp -a $PKG/lib${LIBDIRSUFFIX}/l*.so* $PKG/usr/lib${LIBDIRSUFFIX}/debug cp -a $PKG/usr/lib${LIBDIRSUFFIX}/*.a $PKG/usr/lib${LIBDIRSUFFIX}/debug # Don't need debug+profile: ( cd $PKG/usr/lib${LIBDIRSUFFIX}/debug ; rm -f *_p.* ) # NOTE: Is there really a reason for the glibc-debug package? # If you're debugging glibc, you can also compile it, right? ## COMMENTED OUT: There's no reason for profile libs to include -g information. ## Put back unstripped profiling libraries: #mv $PKG/usr/lib${LIBDIRSUFFIX}/debug/*_p.a $PKG/usr/lib${LIBDIRSUFFIX} # It might be best to put the unstripped and profiling libraries in glibc-debug and glibc-profile. # I don't think "strip -g" causes the pthread problems. It's --strip-unneeded that does. strip -g $PKG/lib${LIBDIRSUFFIX}/l*.so* strip -g $PKG/usr/lib${LIBDIRSUFFIX}/l*.so* strip -g $PKG/usr/lib${LIBDIRSUFFIX}/lib*.a # Build and install the zoneinfo database: cd $TMPBUILD rm -rf tzcodedata-build mkdir tzcodedata-build && cd tzcodedata-build tar xzf $CWD/tzdata?????.tar.gz tar xzf $CWD/tzcode?????.tar.gz sed -i "s,/usr/local,$(pwd),g" Makefile sed -i "s,/etc/zoneinfo,/zoneinfo,g" Makefile make make install mkdir -p $PKG/usr/share/zoneinfo/{posix,right} cd etc cp -a zoneinfo/* $PKG/usr/share/zoneinfo cp -a zoneinfo-posix/* $PKG/usr/share/zoneinfo/posix cp -a zoneinfo-leaps/* $PKG/usr/share/zoneinfo/right # Remove $PKG/usr/share/zoneinfo/localtime -- the install script will # create it as a link to /etc/localtime. rm -f $PKG/usr/share/zoneinfo/localtime # Back to the sources dir to add some files/docs: cd $TMPBUILD/*glibc-* # We'll automatically install the config file for the Name Server Cache Daemon. # Perhaps this should also have some commented-out startup code in rc.inet2... mkdir -vpm755 $PKG/etc cat nscd/nscd.conf > $PKG/etc/nscd.conf.new # Install some scripts to help select a timezone: ( cd $CWD/timezone-scripts # Try to rebuild this: sh output-updated-timeconfig.sh $PKG/usr/share/zoneinfo > timeconfig 2> /dev/null ) mkdir -vpm755 $PKG/var/log/setup install -vpm755 -oroot -groot $CWD/timezone-scripts/setup.timeconfig $PKG/var/log/setup/ mkdir -vpm755 $PKG/usr/sbin install -vpm755 -oroot -groot $CWD/timezone-scripts/timeconfig $PKG/usr/sbin/ ## Install docs: ( mkdir -vpm755 $PKG/usr/doc/glibc-$VERSION cp -favv \ BUGS CONFORMANCE COPYING COPYING.LIB FAQ INSTALL LICENSES NAMESPACE \ NEWS NOTES PROJECTS README README.libm \ $PKG/usr/doc/glibc-$VERSION ) # Don't forget to add the /usr/share/zoneinfo/localtime -> /etc/localtime symlink! :) if [ ! -r $PKG/usr/share/zoneinfo/localtime ]; then ( cd $PKG/usr/share/zoneinfo ; ln -sf /etc/localtime . ) fi # Start fakeroot server: start_fakeroot # Slackware policy: ( cd $PKG # root:root slackchown # 644 docs: slack644docs # Strip most binaries: find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-debug 2> /dev/null find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip -g 2> /dev/null # gzip man & info pages: slackgzpages -i # This is junk rm -f etc/ld.so.cache find . -name "*.orig" -exec rm -f {} \; # These contain scratchbox paths when built inside sbox: sed -i '1s/.*/#!\/bin\/bash/' usr/bin/xtrace usr/bin/tzselect ) ################################## # OK, time to make some packages # ################################## # Delete old package versions? if [ "${DELETEOLDPKGS}" = "Yes" ]; then rm -f $PKGSTORE/a/glibc-{zoneinfo,solibs}* rm -f $PKGSTORE/l/glibc-* rm -f $PKGSTORE/l/glibc-{debug,profile}* # rm -f $PKGSTORE/../extra/glibc-extra-packages/glibc-{debug,profile}* fi # glibc-zoneinfo. We will start with an easy one to avoid breaking a sweat. ;-) cd $CWD ZONE_VERSIONS="$(echo tzdata* | cut -f1 -d . | cut -b7-11)" echo "**** Using glibc Zone versions: $ZONE_VERSIONS *****" cd $PZONE # Install some scripts to help select a timezone: mkdir -vpm755 $PZONE/var/log/setup cp -a $CWD/timezone-scripts/setup.timeconfig $PZONE/var/log/setup chown root:root $PZONE/var/log/setup/setup.timeconfig chmod 755 $PZONE/var/log/setup/setup.timeconfig mkdir -vpm755 $PZONE/usr/sbin cp -a $CWD/timezone-scripts/timeconfig $PZONE/usr/sbin chown root:root $PZONE/usr/sbin/timeconfig chmod 755 $PZONE/usr/sbin/timeconfig mkdir -vpm755 $PZONE/install install -vpm644 -oroot -groot $CWD/doinst.sh-glibc-zoneinfo $PZONE/install/doinst.sh fix_doinst install -vpm644 -oroot -groot $CWD/slack-desc.glibc-zoneinfo $PZONE/install/slack-desc mkdir -vpm755 $PZONE/usr/share cd $PZONE/usr/share cp -a --verbose $PKG/usr/share/zoneinfo . cd $PZONE mkdir -vpm755 $PZONE/etc # This is already hard-coded into doinst.sh (like it'll be there anyway ;-): rm -f etc/localtime # Wrap it up: makepkg -l y -c n $PKGSTORE/a/glibc-zoneinfo-$ZONE_VERSIONS-noarch-$BUILD.txz # glibc-profile: mkdir -vpm755 $PPROFILE/usr/lib${LIBDIRSUFFIX} cd $PPROFILE # Might as well just grab these with 'mv' to simplify things later: mv $PKG/usr/lib${LIBDIRSUFFIX}/lib*_p.a usr/lib # Profile libs should be stripped. Use the debug libs to debug... ( cd usr/lib${LIBDIRSUFFIX} ; strip -g *.a ) mkdir -vpm755 install install -vpm644 -oroot -groot $CWD/slack-desc.glibc-profile install/slack-desc #makepkg -l y -c n $PKGSTORE/../extra/glibc-extra-packages/glibc-profile-$VERSION-$PKGARCH-$BUILD.txz makepkg -l y -c n $PKGSTORE/l/glibc-profile-$VERSION-$PKGARCH-$BUILD.txz # THIS IS NO LONGER PACKAGED (or is it? might be better to let it be made, and then ship it or not...) # glibc-debug: cd $PDEBUG mkdir -vpm755 usr/lib${LIBDIRSUFFIX} # Might as well just grab these with 'mv' to simplify things later: mv $PKG/usr/lib/debug usr/lib mkdir -vpm755 install install -m644 -oroot -groot $CWD/slack-desc.glibc-debug install/slack-desc makepkg -l y -c n $TMPBUILD/glibc-debug-$VERSION-$PKGARCH-$BUILD.txz ## INSTEAD, NUKE THESE LIBS #rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/debug #makepkg -l y -c n $PKGSTORE/../extra/glibc-extra-packages/glibc-debug-$VERSION-$PKGARCH-$BUILD.txz # glibc-i18n: cd $PI18N mkdir -vpm755 usr/lib${LIBDIRSUFFIX} rm -rf usr/lib/locale cp -a $PKG/usr/lib/locale usr/lib${LIBDIRSUFFIX} mkdir -vpm755 usr/share cp -a $PKG/usr/share/i18n usr/share cp -a $PKG/usr/share/locale usr/share mkdir -vpm755 install install -m644 -oroot -groot $CWD/slack-desc.glibc-i18n install/slack-desc makepkg -l y -c n $PKGSTORE/l/glibc-i18n-$VERSION-$PKGARCH-$BUILD.txz # glibc-solibs: cd $PSOLIBS mkdir -vpm755 etc/profile.d cp -a $CWD/profile.d/* etc/profile.d chown -R root:root etc chmod 755 etc/profile.d/* mkdir -vpm755 lib cp -a $PKG/lib${LIBDIRSUFFIX}/* lib ( cd lib mkdir -vpm755 incoming mv *so* incoming mv incoming/libSegFault.so . ) mkdir -vpm755 usr cp -a $PKG/usr/bin usr mv usr/bin/ldd . rm usr/bin/* mv ldd usr/bin mkdir -vpm755 usr/lib${LIBDIRSUFFIX} # The gconv directory has a lot of stuff, but including it here will save some problems. # Seems standard elsewhere. cp -a $PKG/usr/lib${LIBDIRSUFFIX}/gconv usr/lib${LIBDIRSUFFIX} mkdir -vpm755 usr/libexec cp -a $PKG/usr/libexec/pt_chown usr/libexec cp -a $PKG/sbin . mv sbin/ldconfig . rm sbin/* mv ldconfig sbin mkdir -vpm755 install install -vpm644 -oroot -groot $CWD/slack-desc.glibc-solibs install/slack-desc install -vpm644 -oroot -groot $CWD/doinst.sh-glibc-solibs install/doinst.sh fix_doinst # # Ditch links: find . -type l -exec rm {} \; # # Build the package: makepkg -l y -c n $PKGSTORE/a/glibc-solibs-$VERSION-$PKGARCH-$BUILD.txz # And finally, the complete "all-in-one" glibc package is created # from whatever was leftover: cd $PGLIBC mv $PKG/* . mkdir -vpm755 etc/profile.d cp -a $CWD/profile.d/* etc/profile.d chown -R root:root etc chmod 755 etc/profile.d/* # Ditch links (these are in doinst.sh-glibc): find . -type l -exec rm {} \; mkdir -vpm755 install install -vpm644 -oroot -groot $CWD/slack-desc.glibc install/slack-desc install -vpm644 -oroot -groot $CWD/doinst.sh-glibc install/doinst.sh fix_doinst ( cd lib mkdir -vpm755 incoming mv *so* incoming mv incoming/libSegFault.so . ) # Build the package: makepkg -l y -c n $PKGSTORE/l/glibc-$VERSION-$PKGARCH-$BUILD.txz # Done!