diff options
Diffstat (limited to 'scripts')
27 files changed, 987 insertions, 349 deletions
diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 4ef3ce0e..57468f93 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -28,7 +28,8 @@ EXTRA_DIST = \ pacman-optimize.sh.in \ pkgdelta.sh.in \ repo-add.sh.in \ - $(LIBRARY) + $(LIBRARY) \ + $(LIBMAKEPKG_DIST) LIBRARY = \ library/output_format.sh \ @@ -37,10 +38,39 @@ LIBRARY = \ library/size_to_human.sh \ library/term_colors.sh -# Files that should be removed, but which Automake does not know. -MOSTLYCLEANFILES = $(bin_SCRIPTS) +libmakepkgdir = $(datarootdir)/makepkg + +LIBMAKEPKGDIRS = \ + lint_package \ + tidy \ + util + +LIBMAKEPKG = \ + libmakepkg/util/message.sh \ + libmakepkg/util/option.sh + +LIBMAKEPKG_IN = \ + libmakepkg/lint_package.sh \ + libmakepkg/lint_package/build_references.sh \ + libmakepkg/lint_package/missing_backup.sh \ + libmakepkg/tidy.sh \ + libmakepkg/tidy/docs.sh \ + libmakepkg/tidy/emptydirs.sh \ + libmakepkg/tidy/libtool.sh \ + libmakepkg/tidy/optipng.sh \ + libmakepkg/tidy/purge.sh \ + libmakepkg/tidy/staticlibs.sh \ + libmakepkg/tidy/strip.sh \ + libmakepkg/tidy/upx.sh \ + libmakepkg/tidy/zipman.sh \ + libmakepkg/util.sh + +LIBMAKEPKG_DIST = \ + $(LIBMAKEPKG) \ + $(addsuffix .in, $(LIBMAKEPKG_IN)) -libmakepkgdir = $(libdir)/makepkg +# Files that should be removed, but which Automake does not know. +MOSTLYCLEANFILES = $(bin_SCRIPTS) $(LIBMAKEPKG_IN) clean-local: $(AM_V_at)$(RM) -r .lib @@ -87,10 +117,18 @@ $(OURSCRIPTS): Makefile $(AM_V_at)chmod +x,a-w $@ @$(BASH_SHELL) -O extglob -n $@ +$(LIBMAKEPKG_IN): %: %.in Makefile + $(AM_V_at)$(RM) $@ + $(AM_V_at)$(MKDIR_P) $(dir $@) + $(AM_V_GEN)test -f $(srcdir)/$@.in && $(edit) $(srcdir)/$@.in >$@ + $(AM_V_at)chmod a-w $@ + @$(BASH_SHELL) -O extglob -n $@ + makepkg: \ $(srcdir)/makepkg.sh.in \ $(srcdir)/makepkg-wrapper.sh.in \ - $(srcdir)/library/parseopts.sh + $(srcdir)/library/parseopts.sh \ + $(LIBMAKEPKG_IN) makepkg-template: \ $(srcdir)/makepkg-template.pl.in \ @@ -150,6 +188,15 @@ install-exec-hook: cd $(DESTDIR)$(bindir) && \ $(RM) makepkg makepkg-wrapper $(INSTALL) .lib/makepkg $(DESTDIR)$(bindir)/makepkg + for dir in $(LIBMAKEPKGDIRS); do \ + $(MKDIR_P) $(DESTDIR)$(libmakepkgdir)/$$dir; \ + done + for lib in $(LIBMAKEPKG); do \ + $(INSTALL) $(srcdir)/$$lib $(DESTDIR)$(libmakepkgdir)/$${lib#libmakepkg}; \ + done + for lib in $(LIBMAKEPKG_IN); do \ + $(INSTALL) $$lib $(DESTDIR)$(libmakepkgdir)/$${lib#libmakepkg}; \ + done cd $(DESTDIR)$(bindir) && \ $(RM) repo-elephant && \ ( $(LN_S) repo-add repo-elephant || \ @@ -164,5 +211,11 @@ install-exec-hook: uninstall-hook: cd $(DESTDIR)$(bindir) && \ $(RM) repo-remove repo-elephant + for lib in $(LIBMAKEPKG) $(LIBMAKEPKG_IN); do \ + $(RM) $(DESTDIR)$(libmakepkgdir)/$${lib#libmakepkg}; \ + done + for dir in $(LIBMAKEPKGDIRS); do \ + $(RM) -r $(DESTDIR)$(libmakepkgdir)/$$dir; \ + done # vim:set noet: diff --git a/scripts/libmakepkg/.gitignore b/scripts/libmakepkg/.gitignore new file mode 100644 index 00000000..6101db46 --- /dev/null +++ b/scripts/libmakepkg/.gitignore @@ -0,0 +1,14 @@ +lint_package.sh +lint_package/build_references.sh +lint_package/missing_backup.sh +tidy.sh +tidy/docs.sh +tidy/emptydirs.sh +tidy/libtool.sh +tidy/optipng.sh +tidy/purge.sh +tidy/staticlibs.sh +tidy/strip.sh +tidy/upx.sh +tidy/zipman.sh +util.sh diff --git a/scripts/libmakepkg/lint_package.sh.in b/scripts/libmakepkg/lint_package.sh.in new file mode 100644 index 00000000..e5e23bbd --- /dev/null +++ b/scripts/libmakepkg/lint_package.sh.in @@ -0,0 +1,45 @@ +#!/bin/bash +# +# lint_package.sh - functions for checking for packaging errors +# +# Copyright (c) 2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_LINT_PACKAGE_SH" ] && return +LIBMAKEPKG_LINT_PACKAGE_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" + + +declare -a lint_package_functions + +for lib in "$LIBRARY/lint_package/"*.sh; do + source "$lib" +done + +readonly -a lint_package_functions + + +lint_package() { + cd_safe "$pkgdir" + msg "$(gettext "Checking for packaging issue...")" + + for func in ${lint_package_functions[@]}; do + $func + done +} diff --git a/scripts/libmakepkg/lint_package/build_references.sh.in b/scripts/libmakepkg/lint_package/build_references.sh.in new file mode 100644 index 00000000..6b03e484 --- /dev/null +++ b/scripts/libmakepkg/lint_package/build_references.sh.in @@ -0,0 +1,38 @@ +#!/bin/bash +# +# build_references.sh - Warn about files containing references to build directories +# +# Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_LINT_PACKAGE_BUILD_REFERENCES_SH" ] && return +LIBMAKEPKG_LINT_PACKAGE_BUILD_REFERENCES_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" + + +lint_package_functions+=('warn_build_references') + +warn_build_references() { + if find "${pkgdir}" -type f -print0 | xargs -0 grep -q -I "${srcdir}" ; then + warning "$(gettext "Package contains reference to %s")" "\$srcdir" + fi + if find "${pkgdir}" -type f -print0 | xargs -0 grep -q -I "${pkgdirbase}" ; then + warning "$(gettext "Package contains reference to %s")" "\$pkgdir" + fi +} diff --git a/scripts/libmakepkg/lint_package/missing_backup.sh.in b/scripts/libmakepkg/lint_package/missing_backup.sh.in new file mode 100644 index 00000000..64d5a64a --- /dev/null +++ b/scripts/libmakepkg/lint_package/missing_backup.sh.in @@ -0,0 +1,38 @@ +#!/bin/bash +# +# missing_backup.sh - Warn about missing files in the backup array +# +# Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_LINT_PACKAGE_MISSING_BACKUP_SH" ] && return +LIBMAKEPKG_LINT_PACKAGE_MISSING_BACKUP_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" + + +lint_package_functions+=('warn_missing_backup') + +warn_missing_backup() { + local file + for file in "${backup[@]}"; do + if [[ ! -f $file ]]; then + warning "$(gettext "%s entry file not in package : %s")" "backup" "$file" + fi + done +} diff --git a/scripts/libmakepkg/tidy.sh.in b/scripts/libmakepkg/tidy.sh.in new file mode 100644 index 00000000..1f439ba2 --- /dev/null +++ b/scripts/libmakepkg/tidy.sh.in @@ -0,0 +1,52 @@ +#!/bin/bash +# +# tidy.sh - functions for modifying/removing installed files before +# package creation +# +# Copyright (c) 2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_SH" ] && return +LIBMAKEPKG_TIDY_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" + + +declare -a packaging_options tidy_remove tidy_modify + +for lib in "$LIBRARY/tidy/"*.sh; do + source "$lib" +done + +readonly -a packaging_options tidy_remove tidy_modify + + +tidy_install() { + cd_safe "$pkgdir" + msg "$(gettext "Tidying install...")" + + # options that remove unwanted files + for func in ${tidy_remove[@]}; do + $func + done + + # options that modify files + for func in ${tidy_modify[@]}; do + $func + done +} diff --git a/scripts/libmakepkg/tidy/docs.sh.in b/scripts/libmakepkg/tidy/docs.sh.in new file mode 100644 index 00000000..a9791302 --- /dev/null +++ b/scripts/libmakepkg/tidy/docs.sh.in @@ -0,0 +1,37 @@ +#!/bin/bash +# +# docs.sh - Remove documentation files from the package +# +# Copyright (c) 2008-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_DOCS_SH" ] && return +LIBMAKEPKG_TIDY_DOCS_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + +packaging_options+=('docs') +tidy_remove+=('tidy_docs') + +tidy_docs() { + if check_option "docs" "n" && [[ -n ${DOC_DIRS[*]} ]]; then + msg2 "$(gettext "Removing doc files...")" + rm -rf -- ${DOC_DIRS[@]} + fi +} diff --git a/scripts/libmakepkg/tidy/emptydirs.sh.in b/scripts/libmakepkg/tidy/emptydirs.sh.in new file mode 100644 index 00000000..c7103e9e --- /dev/null +++ b/scripts/libmakepkg/tidy/emptydirs.sh.in @@ -0,0 +1,38 @@ +#!/bin/bash +# +# emptydirs.sh - Remove empty directories from the package +# +# Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_EMPTYDIRS_SH" ] && return +LIBMAKEPKG_TIDY_EMPTYDIRS_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('emptydirs') +tidy_remove+=('tidy_emptydirs') + +tidy_emptydirs() { + if check_option "emptydirs" "n"; then + msg2 "$(gettext "Removing empty directories...")" + find . -depth -type d -exec rmdir '{}' + 2>/dev/null + fi +} diff --git a/scripts/libmakepkg/tidy/libtool.sh.in b/scripts/libmakepkg/tidy/libtool.sh.in new file mode 100644 index 00000000..b9c62452 --- /dev/null +++ b/scripts/libmakepkg/tidy/libtool.sh.in @@ -0,0 +1,38 @@ +#!/bin/bash +# +# libtool.sh - Remove libtool files from the package +# +# Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_LIBTOOL_SH" ] && return +LIBMAKEPKG_TIDY_LIBTOOL_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('libtool') +tidy_remove+=('tidy_libtool') + +tidy_libtool() { + if check_option "libtool" "n"; then + msg2 "$(gettext "Removing "%s" files...")" "libtool" + find . ! -type d -name "*.la" -exec rm -f -- '{}' + + fi +} diff --git a/scripts/libmakepkg/tidy/optipng.sh.in b/scripts/libmakepkg/tidy/optipng.sh.in new file mode 100644 index 00000000..f739a823 --- /dev/null +++ b/scripts/libmakepkg/tidy/optipng.sh.in @@ -0,0 +1,44 @@ +#!/bin/bash +# +# optipng.sh - Compress PNG files using optpng +# +# Copyright (c) 2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_OPTIPNG_SH" ] && return +LIBMAKEPKG_TIDY_OPTIPNG_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('optipng') +tidy_modify+=('tidy_optipng') + +tidy_optipng() { + if check_option "optipng" "y"; then + msg2 "$(gettext "Optimizing PNG images...")" + local png + find . -type f -iname "*.png" 2>/dev/null | while read -r png ; do + if [[ $(file --brief --mime-type "$png") = 'image/png' ]]; then + optipng "${OPTIPNGFLAGS[@]}" "$png" &>/dev/null || + warning "$(gettext "Could not optimize PNG image : %s")" "${png/$pkgdir\//}" + fi + done + fi +} diff --git a/scripts/libmakepkg/tidy/purge.sh.in b/scripts/libmakepkg/tidy/purge.sh.in new file mode 100644 index 00000000..948f001d --- /dev/null +++ b/scripts/libmakepkg/tidy/purge.sh.in @@ -0,0 +1,45 @@ +#!/bin/bash +# +# purge.sh - Remove unwanted files from the package +# +# Copyright (c) 2008-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_PURGE_SH" ] && return +LIBMAKEPKG_TIDY_PURGE_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('purge') +tidy_remove+=('tidy_purge') + +tidy_purge() { + if check_option "purge" "y" && [[ -n ${PURGE_TARGETS[*]} ]]; then + msg2 "$(gettext "Purging unwanted files...")" + local pt + for pt in "${PURGE_TARGETS[@]}"; do + if [[ ${pt} = "${pt//\/}" ]]; then + find . ! -type d -name "${pt}" -exec rm -f -- '{}' + + else + rm -f ${pt} + fi + done + fi +} diff --git a/scripts/libmakepkg/tidy/staticlibs.sh.in b/scripts/libmakepkg/tidy/staticlibs.sh.in new file mode 100644 index 00000000..4849aba9 --- /dev/null +++ b/scripts/libmakepkg/tidy/staticlibs.sh.in @@ -0,0 +1,43 @@ +#!/bin/bash +# +# staticlibs.sh - Remove static library files from the package +# +# Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_STATICLIBS_SH" ] && return +LIBMAKEPKG_TIDY_STATICLIBS_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('staticlibs') +tidy_remove+=('tidy_staticlibs') + +tidy_staticlibs() { + if check_option "staticlibs" "n"; then + msg2 "$(gettext "Removing static library files...")" + local l + while read -rd '' l; do + if [[ -f "${l%.a}.so" || -h "${l%.a}.so" ]]; then + rm "$l" + fi + done < <(find . ! -type d -name "*.a" -print0) + fi +} diff --git a/scripts/libmakepkg/tidy/strip.sh.in b/scripts/libmakepkg/tidy/strip.sh.in new file mode 100644 index 00000000..12a7eee3 --- /dev/null +++ b/scripts/libmakepkg/tidy/strip.sh.in @@ -0,0 +1,117 @@ +#!/bin/bash +# +# strip.sh - Strip debugging symbols from binary files +# +# Copyright (c) 2007-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_STRIP_SH" ] && return +LIBMAKEPKG_TIDY_STRIP_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('strip' 'debug') +tidy_modify+=('tidy_strip') + + +build_id() { + LANG=C readelf -n $1 | sed -n '/Build ID/ { s/.*: //p; q; }' +} + +strip_file() { + local binary=$1; shift + + if check_option "debug" "y"; then + local bid=$(build_id "$binary") + + # has this file already been stripped + if [[ -n "$bid" ]]; then + if [[ -f "$dbgdir/.build-id/${bid:0:2}/${bid:2}.debug" ]]; then + return + fi + elif [[ -f "$dbgdir/$binary.debug" ]]; then + return + fi + + mkdir -p "$dbgdir/${binary%/*}" + objcopy --only-keep-debug "$binary" "$dbgdir/$binary.debug" + objcopy --add-gnu-debuglink="$dbgdir/${binary#/}.debug" "$binary" + + # create any needed hardlinks + while read -rd '' file ; do + if [[ "${binary}" -ef "${file}" && ! -f "$dbgdir/${file}.debug" ]]; then + mkdir -p "$dbgdir/${file%/*}" + ln "$dbgdir/${binary}.debug" "$dbgdir/${file}.debug" + fi + done < <(find . -type f -perm -u+w -print0 2>/dev/null) + + if [[ -n "$bid" ]]; then + local target + mkdir -p "$dbgdir/.build-id/${bid:0:2}" + + target="../../../../../${binary#./}" + target="${target/..\/..\/usr\/lib\/}" + target="${target/..\/usr\/}" + ln -s "$target" "$dbgdir/.build-id/${bid:0:2}/${bid:2}" + + target="../../${binary#./}.debug" + ln -s "$target" "$dbgdir/.build-id/${bid:0:2}/${bid:2}.debug" + fi + fi + + strip $@ "$binary" +} + + +tidy_strip() { + if check_option "strip" "y"; then + msg2 "$(gettext "Stripping unneeded symbols from binaries and libraries...")" + # make sure library stripping variables are defined to prevent excess stripping + [[ -z ${STRIP_SHARED+x} ]] && STRIP_SHARED="-S" + [[ -z ${STRIP_STATIC+x} ]] && STRIP_STATIC="-S" + + if check_option "debug" "y"; then + dbgdir="$pkgdir-@DEBUGSUFFIX@/usr/lib/debug" + mkdir -p "$dbgdir" + fi + + local binary strip_flags + find . -type f -perm -u+w -print0 2>/dev/null | while read -rd '' binary ; do + case "$(file -bi "$binary")" in + *application/x-sharedlib*) # Libraries (.so) + strip_flags="$STRIP_SHARED";; + *application/x-archive*) # Libraries (.a) + strip_flags="$STRIP_STATIC";; + *application/x-object*) + case "$binary" in + *.ko) # Kernel module + strip_flags="$STRIP_SHARED";; + *) + continue;; + esac;; + *application/x-executable*) # Binaries + strip_flags="$STRIP_BINARIES";; + *) + continue ;; + esac + strip_file "$binary" ${strip_flags} + done + fi +} diff --git a/scripts/libmakepkg/tidy/upx.sh.in b/scripts/libmakepkg/tidy/upx.sh.in new file mode 100644 index 00000000..49104658 --- /dev/null +++ b/scripts/libmakepkg/tidy/upx.sh.in @@ -0,0 +1,46 @@ +#!/bin/bash +# +# upx.sh - Compress package binaries with UPX +# +# Copyright (c) 2011-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_UPX_SH" ] && return +LIBMAKEPKG_TIDY_UPX_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('upx') +tidy_modify+=('tidy_upx') + +tidy_upx() { + if check_option "upx" "y"; then + msg2 "$(gettext "Compressing binaries with %s...")" "UPX" + local binary + find . -type f -perm -u+w 2>/dev/null | while read -r binary ; do + case "$(file --brief --mime-type "$binary")" in + 'application/x-executable' | 'application/x-dosexec') + upx "${UPXFLAGS[@]}" "$binary" &>/dev/null || + warning "$(gettext "Could not compress binary : %s")" "${binary/$pkgdir\//}" + ;; + esac + done + fi +} diff --git a/scripts/libmakepkg/tidy/zipman.sh.in b/scripts/libmakepkg/tidy/zipman.sh.in new file mode 100644 index 00000000..a08a60fa --- /dev/null +++ b/scripts/libmakepkg/tidy/zipman.sh.in @@ -0,0 +1,61 @@ +#!/bin/bash +# +# zipman.sh - Compress man and info pages +# +# Copyright (c) 2011-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_TIDY_ZIPMAN_SH" ] && return +LIBMAKEPKG_TIDY_ZIPMAN_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" +source "$LIBRARY/util/option.sh" + + +packaging_options+=('zipman') +tidy_modify+=('tidy_zipman') + +tidy_zipman() { + if check_option "zipman" "y" && [[ -n ${MAN_DIRS[*]} ]]; then + msg2 "$(gettext "Compressing man and info pages...")" + local file files inode link + while read -rd ' ' inode; do + read file + find ${MAN_DIRS[@]} -type l 2>/dev/null | + while read -r link ; do + if [[ "${file}" -ef "${link}" ]] ; then + rm -f "$link" "${link}.gz" + if [[ ${file%/*} = ${link%/*} ]]; then + ln -s -- "${file##*/}.gz" "${link}.gz" + else + ln -s -- "/${file}.gz" "${link}.gz" + fi + fi + done + if [[ -z ${files[$inode]} ]]; then + files[$inode]=$file + gzip -9 -n -f "$file" + else + rm -f "$file" + ln "${files[$inode]}.gz" "${file}.gz" + chmod 644 "${file}.gz" + fi + done < <(find ${MAN_DIRS[@]} -type f \! -name "*.gz" \! -name "*.bz2" \ + -exec @INODECMD@ '{}' + 2>/dev/null) + fi +} diff --git a/scripts/libmakepkg/util.sh.in b/scripts/libmakepkg/util.sh.in new file mode 100644 index 00000000..86c76590 --- /dev/null +++ b/scripts/libmakepkg/util.sh.in @@ -0,0 +1,28 @@ +#!/bin/bash +# +# util.sh - utility functions for makepkg +# +# Copyright (c) 2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_UTIL_SH" ] && return +LIBMAKEPKG_UTIL_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +for lib in "$LIBRARY/util/"*.sh; do + source "$lib" +done diff --git a/scripts/libmakepkg/util/message.sh b/scripts/libmakepkg/util/message.sh new file mode 100644 index 00000000..15208ef8 --- /dev/null +++ b/scripts/libmakepkg/util/message.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# +# message.sh - functions for outputting messages in makepkg +# +# Copyright (c) 2006-2015 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_UTIL_MESSAGE_SH" ] && return +LIBMAKEPKG_UTIL_MESSAGE_SH=1 + + +plain() { + local mesg=$1; shift + printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +msg() { + local mesg=$1; shift + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +msg2() { + local mesg=$1; shift + printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +warning() { + local mesg=$1; shift + printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +error() { + local mesg=$1; shift + printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} diff --git a/scripts/libmakepkg/util/option.sh b/scripts/libmakepkg/util/option.sh new file mode 100644 index 00000000..fc649288 --- /dev/null +++ b/scripts/libmakepkg/util/option.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# +# option.sh - functions to test if build/packaging options are enabled +# +# Copyright (c) 2009-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[ -n "$LIBMAKEPKG_UTIL_OPTION_SH" ] && return +LIBMAKEPKG_UTIL_OPTION_SH=1 + + +## +# usage : in_opt_array( $needle, $haystack ) +# return : 0 - enabled +# 1 - disabled +# 127 - not found +## +in_opt_array() { + local needle=$1; shift + + local i opt + for (( i = $#; i > 0; i-- )); do + opt=${!i} + if [[ $opt = "$needle" ]]; then + # enabled + return 0 + elif [[ $opt = "!$needle" ]]; then + # disabled + return 1 + fi + done + + # not found + return 127 +} + + +## +# Checks to see if options are present in makepkg.conf or PKGBUILD; +# PKGBUILD options always take precedence. +# +# usage : check_option( $option, $expected_val ) +# return : 0 - matches expected +# 1 - does not match expected +# 127 - not found +## +check_option() { + in_opt_array "$1" ${options[@]} + case $? in + 0) # assert enabled + [[ $2 = y ]] + return ;; + 1) # assert disabled + [[ $2 = n ]] + return + esac + + # fall back to makepkg.conf options + in_opt_array "$1" ${OPTIONS[@]} + case $? in + 0) # assert enabled + [[ $2 = y ]] + return ;; + 1) # assert disabled + [[ $2 = n ]] + return + esac + + # not found + return 127 +} + + +## +# Check if option is present in BUILDENV +# +# usage : check_buildenv( $option, $expected_val ) +# return : 0 - matches expected +# 1 - does not match expected +# 127 - not found +## +check_buildenv() { + in_opt_array "$1" ${BUILDENV[@]} + case $? in + 0) # assert enabled + [[ $2 = "y" ]] + return ;; + 1) # assert disabled + [[ $2 = "n" ]] + return ;; + esac + + # not found + return 127 +} diff --git a/scripts/makepkg-template.pl.in b/scripts/makepkg-template.pl.in index d9da1674..71d2aae2 100755 --- a/scripts/makepkg-template.pl.in +++ b/scripts/makepkg-template.pl.in @@ -2,7 +2,7 @@ # makepkg-template - template system for makepkg # @configure_input@ # -# Copyright (c) 2013-2014 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -109,7 +109,7 @@ sub load_template { my ($version) = (abs_path($path) =~ /-([0-9.]+)[.]template$/); if (!$version) { - die sprintf(gettext("Couldn't detect version for template '%s'"), $values->{name}); + die sprintf(gettext("Couldn't detect version for template '%s'\n"), $values->{name}); } my $parsed = process_file($path); @@ -128,7 +128,7 @@ sub process_file { my $nesting_level = 0; my $linenumber = 0; - open (my $fh, "<", $filename) or die sprintf(gettext("failed to open '%s': %s"), $filename, $!); + open (my $fh, "<", $filename) or die sprintf(gettext("failed to open '%s': %s\n"), $filename, $!); my @lines = <$fh>; close $fh; @@ -186,7 +186,7 @@ sub version { my ($exitstatus) = @_; printf "makepkg-template (pacman) %s\n", '@PACKAGE_VERSION@'; print gettext( - 'Copyright (c) 2013-2014 Pacman Development Team <pacman-dev@archlinux.org>.'."\n". + 'Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org>.'."\n". 'This is free software; see the source for copying conditions.'."\n". 'There is NO WARRANTY, to the extent permitted by law.'."\n"); exit($exitstatus); diff --git a/scripts/makepkg-wrapper.sh.in b/scripts/makepkg-wrapper.sh.in index fd83a01f..400db40f 100644 --- a/scripts/makepkg-wrapper.sh.in +++ b/scripts/makepkg-wrapper.sh.in @@ -2,7 +2,7 @@ # # makepkg - a wrapper for running the real makepkg in the source tree # -# Copyright (c) 2013-2014 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2013-2015 Pacman Development Team <pacman-dev@archlinux.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 227563ce..acee796e 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -3,7 +3,7 @@ # makepkg - make packages compatible for use with pacman # @configure_input@ # -# Copyright (c) 2006-2014 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2006-2015 Pacman Development Team <pacman-dev@archlinux.org> # Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> # Copyright (c) 2005 by Aurelien Foret <orelien@chez.com> # Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org> @@ -48,13 +48,11 @@ declare -r startdir="$PWD" LIBRARY=${LIBRARY:-'@libmakepkgdir@'} -packaging_options=('strip' 'docs' 'libtool' 'staticlibs' 'emptydirs' 'zipman' - 'purge' 'upx' 'debug') -other_options=('ccache' 'distcc' 'buildflags' 'makeflags') +build_options=('ccache' 'distcc' 'buildflags' 'makeflags') splitpkg_overrides=('pkgdesc' 'arch' 'url' 'license' 'groups' 'depends' 'optdepends' 'provides' 'conflicts' 'replaces' 'backup' 'options' 'install' 'changelog') -readonly -a packaging_options other_options splitpkg_overrides +readonly -a build_options splitpkg_overrides known_hash_algos=('md5' 'sha1' 'sha224' 'sha256' 'sha384' 'sha512') @@ -100,31 +98,10 @@ shopt -s extglob ### SUBROUTINES ### -plain() { - local mesg=$1; shift - printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -msg() { - local mesg=$1; shift - printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -msg2() { - local mesg=$1; shift - printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -warning() { - local mesg=$1; shift - printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -error() { - local mesg=$1; shift - printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - +# Import libmakepkg +for lib in "$LIBRARY"/*.sh; do + source "$lib" +done ## # Special exit call for traps, Don't print any error messages when inside, @@ -913,92 +890,6 @@ get_pkg_arch() { } ## -# Checks to see if options are present in makepkg.conf or PKGBUILD; -# PKGBUILD options always take precedence. -# -# usage : check_option( $option, $expected_val ) -# return : 0 - matches expected -# 1 - does not match expected -# 127 - not found -## -check_option() { - in_opt_array "$1" ${options[@]} - case $? in - 0) # assert enabled - [[ $2 = y ]] - return ;; - 1) # assert disabled - [[ $2 = n ]] - return - esac - - # fall back to makepkg.conf options - in_opt_array "$1" ${OPTIONS[@]} - case $? in - 0) # assert enabled - [[ $2 = y ]] - return ;; - 1) # assert disabled - [[ $2 = n ]] - return - esac - - # not found - return 127 -} - - -## -# Check if option is present in BUILDENV -# -# usage : check_buildenv( $option, $expected_val ) -# return : 0 - matches expected -# 1 - does not match expected -# 127 - not found -## -check_buildenv() { - in_opt_array "$1" ${BUILDENV[@]} - case $? in - 0) # assert enabled - [[ $2 = "y" ]] - return ;; - 1) # assert disabled - [[ $2 = "n" ]] - return ;; - esac - - # not found - return 127 -} - - -## -# usage : in_opt_array( $needle, $haystack ) -# return : 0 - enabled -# 1 - disabled -# 127 - not found -## -in_opt_array() { - local needle=$1; shift - - local i opt - for (( i = $#; i > 0; i-- )); do - opt=${!i} - if [[ $opt = "$needle" ]]; then - # enabled - return 0 - elif [[ $opt = "!$needle" ]]; then - # disabled - return 1 - fi - done - - # not found - return 127 -} - - -## # usage : in_array( $needle, $haystack ) # return : 0 - found # 1 - not found @@ -1267,22 +1158,23 @@ verify_integrity_one() { } verify_integrity_sums() { - local integ=$1 arch=$2 integrity_sums=() sources=() + local integ=$1 arch=$2 integrity_sums=() sources=() srcname if [[ $arch ]]; then array_build integrity_sums "${integ}sums_$arch" - array_build sources "source_$arch" + srcname=source_$arch else array_build integrity_sums "${integ}sums" - array_build sources source + srcname=source fi + array_build sources "$srcname" if (( ${#integrity_sums[@]} == 0 && ${#sources[@]} == 0 )); then return 1 fi if (( ${#integrity_sums[@]} == ${#sources[@]} )); then - msg "$(gettext "Validating source files with %s...")" "${integ}sums" + msg "$(gettext "Validating %s files with %s...")" "$srcname" "${integ}sums" local idx errors=0 for (( idx = 0; idx < ${#sources[*]}; idx++ )); do verify_integrity_one "${sources[idx]}" "$integ" "${integrity_sums[idx]}" || errors=1 @@ -1335,7 +1227,7 @@ check_checksums() { done if (( ${#correlation[*]} )); then - error "$(gettext "Integrity checks are missing.")" + error "$(gettext "Integrity checks are missing for: %s")" "${!correlation[*]}" exit 1 # TODO: error code fi } @@ -1723,185 +1615,6 @@ run_package() { run_function_safe "$pkgfunc" } -build_id() { - LANG=C readelf -n $1 | sed -n '/Build ID/ { s/.*: //p; q; }' -} - -strip_file() { - local binary=$1; shift - - if check_option "debug" "y"; then - local bid=$(build_id "$binary") - - # has this file already been stripped - if [[ -n "$bid" ]]; then - if [[ -f "$dbgdir/.build-id/${bid:0:2}/${bid:2}.debug" ]]; then - return - fi - elif [[ -f "$dbgdir/$binary.debug" ]]; then - return - fi - - mkdir -p "$dbgdir/${binary%/*}" - objcopy --only-keep-debug "$binary" "$dbgdir/$binary.debug" - objcopy --add-gnu-debuglink="$dbgdir/${binary#/}.debug" "$binary" - - # create any needed hardlinks - while read -rd '' file ; do - if [[ "${binary}" -ef "${file}" && ! -f "$dbgdir/${file}.debug" ]]; then - mkdir -p "$dbgdir/${file%/*}" - ln "$dbgdir/${binary}.debug" "$dbgdir/${file}.debug" - fi - done < <(find . -type f -perm -u+w -print0 2>/dev/null) - - if [[ -n "$bid" ]]; then - local target - mkdir -p "$dbgdir/.build-id/${bid:0:2}" - - target="../../../../../${binary#./}" - target="${target/..\/..\/usr\/lib\/}" - target="${target/..\/usr\/}" - ln -s "$target" "$dbgdir/.build-id/${bid:0:2}/${bid:2}" - - target="../../${binary#./}.debug" - ln -s "$target" "$dbgdir/.build-id/${bid:0:2}/${bid:2}.debug" - fi - fi - - strip $@ "$binary" -} - -tidy_install() { - cd_safe "$pkgdir" - msg "$(gettext "Tidying install...")" - - if check_option "docs" "n" && [[ -n ${DOC_DIRS[*]} ]]; then - msg2 "$(gettext "Removing doc files...")" - rm -rf -- ${DOC_DIRS[@]} - fi - - if check_option "purge" "y" && [[ -n ${PURGE_TARGETS[*]} ]]; then - msg2 "$(gettext "Purging unwanted files...")" - local pt - for pt in "${PURGE_TARGETS[@]}"; do - if [[ ${pt} = "${pt//\/}" ]]; then - find . ! -type d -name "${pt}" -exec rm -f -- '{}' + - else - rm -f ${pt} - fi - done - fi - - if check_option "libtool" "n"; then - msg2 "$(gettext "Removing "%s" files...")" "libtool" - find . ! -type d -name "*.la" -exec rm -f -- '{}' + - fi - - if check_option "staticlibs" "n"; then - msg2 "$(gettext "Removing static library files...")" - local l - while read -rd '' l; do - if [[ -f "${l%.a}.so" || -h "${l%.a}.so" ]]; then - rm "$l" - fi - done < <(find . ! -type d -name "*.a" -print0) - fi - - if check_option "emptydirs" "n"; then - msg2 "$(gettext "Removing empty directories...")" - find . -depth -type d -exec rmdir '{}' + 2>/dev/null - fi - - # check existence of backup files - local file - for file in "${backup[@]}"; do - if [[ ! -f $file ]]; then - warning "$(gettext "%s entry file not in package : %s")" "backup" "$file" - fi - done - - # check for references to the build and package directory - if find "${pkgdir}" -type f -print0 | xargs -0 grep -q -I "${srcdir}" ; then - warning "$(gettext "Package contains reference to %s")" "\$srcdir" - fi - if find "${pkgdir}" -type f -print0 | xargs -0 grep -q -I "${pkgdirbase}" ; then - warning "$(gettext "Package contains reference to %s")" "\$pkgdir" - fi - - if check_option "zipman" "y" && [[ -n ${MAN_DIRS[*]} ]]; then - msg2 "$(gettext "Compressing man and info pages...")" - local file files inode link - while read -rd ' ' inode; do - read file - find ${MAN_DIRS[@]} -type l 2>/dev/null | - while read -r link ; do - if [[ "${file}" -ef "${link}" ]] ; then - rm -f "$link" "${link}.gz" - if [[ ${file%/*} = ${link%/*} ]]; then - ln -s -- "${file##*/}.gz" "${link}.gz" - else - ln -s -- "/${file}.gz" "${link}.gz" - fi - fi - done - if [[ -z ${files[$inode]} ]]; then - files[$inode]=$file - gzip -9 -n -f "$file" - else - rm -f "$file" - ln "${files[$inode]}.gz" "${file}.gz" - chmod 644 "${file}.gz" - fi - done < <(find ${MAN_DIRS[@]} -type f \! -name "*.gz" \! -name "*.bz2" \ - -exec @INODECMD@ '{}' + 2>/dev/null) - fi - - if check_option "strip" "y"; then - msg2 "$(gettext "Stripping unneeded symbols from binaries and libraries...")" - # make sure library stripping variables are defined to prevent excess stripping - [[ -z ${STRIP_SHARED+x} ]] && STRIP_SHARED="-S" - [[ -z ${STRIP_STATIC+x} ]] && STRIP_STATIC="-S" - - if check_option "debug" "y"; then - dbgdir="$pkgdir-@DEBUGSUFFIX@/usr/lib/debug" - mkdir -p "$dbgdir" - fi - - local binary strip_flags - find . -type f -perm -u+w -print0 2>/dev/null | while read -rd '' binary ; do - case "$(file -bi "$binary")" in - *application/x-sharedlib*) # Libraries (.so) - strip_flags="$STRIP_SHARED";; - *application/x-archive*) # Libraries (.a) - strip_flags="$STRIP_STATIC";; - *application/x-object*) - case "$binary" in - *.ko) # Kernel module - strip_flags="$STRIP_SHARED";; - *) - continue;; - esac;; - *application/x-executable*) # Binaries - strip_flags="$STRIP_BINARIES";; - *) - continue ;; - esac - strip_file "$binary" ${strip_flags} - done - fi - - if check_option "upx" "y"; then - msg2 "$(gettext "Compressing binaries with %s...")" "UPX" - local binary - find . -type f -perm -u+w 2>/dev/null | while read -r binary ; do - if [[ $(file -bi "$binary") = *'application/x-executable'* ]]; then - upx $UPXFLAGS "$binary" &>/dev/null || - warning "$(gettext "Could not compress binary : %s")" "${binary/$pkgdir\//}" - fi - done - fi -} - find_libdepends() { local d sodepends; @@ -2754,7 +2467,7 @@ lint_options() { for i in "${options_list[@]}"; do # check if option matches a known option or its inverse - for kopt in "${packaging_options[@]}" "${other_options[@]}"; do + for kopt in "${packaging_options[@]}" "${build_options[@]}"; do if [[ $i = "$kopt" || $i = "!$kopt" ]]; then # continue to the next $i continue 2 @@ -2990,6 +2703,14 @@ check_software() { fi fi + # optipng - PNG image optimization + if check_option "optipng" "y"; then + if ! type -p optipng >/dev/null; then + error "$(gettext "Cannot find the %s binary required for optimizing PNG images.")" "optipng" + ret=1 + fi + fi + # distcc - compilation with distcc if check_buildenv "distcc" "y" && ! check_option "distcc" "n"; then if ! type -p distcc >/dev/null; then @@ -3105,6 +2826,7 @@ run_split_packaging() { backup_package_variables run_package $pkgname tidy_install + lint_package create_package create_debug_package restore_package_variables @@ -3192,7 +2914,7 @@ usage() { version() { printf "makepkg (pacman) %s\n" "$makepkg_version" printf -- "$(gettext "\ -Copyright (c) 2006-2014 Pacman Development Team <pacman-dev@archlinux.org>.\n\ +Copyright (c) 2006-2015 Pacman Development Team <pacman-dev@archlinux.org>.\n\ Copyright (C) 2002-2006 Judd Vinet <jvinet@zeroflux.org>.\n\n\ This is free software; see the source for copying conditions.\n\ There is NO WARRANTY, to the extent permitted by law.\n")" @@ -3562,6 +3284,7 @@ if (( INFAKEROOT )); then run_package fi tidy_install + lint_package create_package create_debug_package else diff --git a/scripts/pacman-db-upgrade.sh.in b/scripts/pacman-db-upgrade.sh.in index 7d01bce9..a8beb808 100644 --- a/scripts/pacman-db-upgrade.sh.in +++ b/scripts/pacman-db-upgrade.sh.in @@ -3,7 +3,7 @@ # pacman-db-upgrade - upgrade the local pacman db to a newer format # @configure_input@ # -# Copyright (c) 2010-2014 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2010-2015 Pacman Development Team <pacman-dev@archlinux.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -52,7 +52,7 @@ usage() { version() { printf "pacman-db-upgrade (pacman) %s\n" "$myver" printf -- "$(gettext "\ -Copyright (c) 2010-2014 Pacman Development Team <pacman-dev@archlinux.org>.\n\ +Copyright (c) 2010-2015 Pacman Development Team <pacman-dev@archlinux.org>.\n\ This is free software; see the source for copying conditions.\n\ There is NO WARRANTY, to the extent permitted by law.\n")" } diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in index 5ba0ad8f..82328515 100644 --- a/scripts/pacman-key.sh.in +++ b/scripts/pacman-key.sh.in @@ -4,7 +4,7 @@ # Based on apt-key, from Debian # @configure_input@ # -# Copyright (c) 2010-2014 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2010-2015 Pacman Development Team <pacman-dev@archlinux.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -92,7 +92,7 @@ usage() { version() { printf "pacman-key (pacman) %s\n" "${myver}" printf -- "$(gettext "\ -Copyright (c) 2010-2014 Pacman Development Team <pacman-dev@archlinux.org>.\n\ +Copyright (c) 2010-2015 Pacman Development Team <pacman-dev@archlinux.org>.\n\ This is free software; see the source for copying conditions.\n\ There is NO WARRANTY, to the extent permitted by law.\n")" } diff --git a/scripts/pacman-optimize.sh.in b/scripts/pacman-optimize.sh.in index 7c809193..3e038fb3 100644 --- a/scripts/pacman-optimize.sh.in +++ b/scripts/pacman-optimize.sh.in @@ -3,7 +3,7 @@ # pacman-optimize # @configure_input@ # -# Copyright (c) 2006-2014 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2006-2015 Pacman Development Team <pacman-dev@archlinux.org> # Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> # # This program is free software; you can redistribute it and/or modify @@ -51,7 +51,7 @@ does not have to move around the disk as much.\n")" version() { printf "pacman-optimize (pacman) %s\n" "$myver" printf -- "$(gettext "\ -Copyright (c) 2006-2014 Pacman Development Team <pacman-dev@archlinux.org>.\n\ +Copyright (c) 2006-2015 Pacman Development Team <pacman-dev@archlinux.org>.\n\ Copyright (C) 2002-2006 Judd Vinet <jvinet@zeroflux.org>.\n\n\ This is free software; see the source for copying conditions.\n\ There is NO WARRANTY, to the extent permitted by law.\n")" diff --git a/scripts/pkgdelta.sh.in b/scripts/pkgdelta.sh.in index be49326e..fe63974d 100644 --- a/scripts/pkgdelta.sh.in +++ b/scripts/pkgdelta.sh.in @@ -140,7 +140,7 @@ create_xdelta() deltafile=$(dirname "$newfile")/$pkgname-${oldver}_to_${newver}-$arch.delta local ret=0 - xdelta3 -q -f -s "$oldfile" "$newfile" "$deltafile" || ret=$? + xdelta3 -q -f -9 -S lzma -s "$oldfile" "$newfile" "$deltafile" || ret=$? if (( ret )); then error "$(gettext "Delta could not be created.")" return 1 diff --git a/scripts/po/POTFILES.in b/scripts/po/POTFILES.in index f9e8a481..b25e53b6 100644 --- a/scripts/po/POTFILES.in +++ b/scripts/po/POTFILES.in @@ -8,5 +8,19 @@ scripts/pacman-key.sh.in scripts/pacman-optimize.sh.in scripts/pkgdelta.sh.in scripts/repo-add.sh.in +scripts/libmakepkg/lint_package.sh.in +scripts/libmakepkg/lint_package/build_references.sh.in +scripts/libmakepkg/lint_package/missing_backup.sh.in +scripts/libmakepkg/tidy.sh.in +scripts/libmakepkg/tidy/docs.sh.in +scripts/libmakepkg/tidy/emptydirs.sh.in +scripts/libmakepkg/tidy/libtool.sh.in +scripts/libmakepkg/tidy/optipng.sh.in +scripts/libmakepkg/tidy/purge.sh.in +scripts/libmakepkg/tidy/staticlibs.sh.in +scripts/libmakepkg/tidy/strip.sh.in +scripts/libmakepkg/tidy/upx.sh.in +scripts/libmakepkg/tidy/zipman.sh.in +scripts/libmakepkg/util/message.sh scripts/library/output_format.sh scripts/library/parseopts.sh diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index 4325dbfb..bf374443 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -4,7 +4,7 @@ # repo-remove - remove a package entry from a given repo database file # @configure_input@ # -# Copyright (c) 2006-2014 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2006-2015 Pacman Development Team <pacman-dev@archlinux.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -34,6 +34,7 @@ ONLYADDNEW=0 RMEXISTING=0 WITHFILES=0 SIGN=0 +KEY=0 VERIFY=0 REPO_DB_FILE= LOCKFILE= @@ -59,7 +60,7 @@ Multiple packages to add can be specified on the command line.\n")" printf -- "$(gettext "Options:\n")" printf -- "$(gettext " -d, --delta generate and add delta for package update\n")" printf -- "$(gettext " -n, --new only add packages that are not already in the database\n")" - printf -- "$(gettext " -R, --remove remove package file from disk when updating database entry\n")" + printf -- "$(gettext " -R, --remove remove old package file from disk after updating database\n")" printf -- "$(gettext " -f, --files update database's file list\n")" elif [[ $cmd == "repo-remove" ]] ; then printf -- "$(gettext "Usage: repo-remove [options] <path-to-db> <packagename|delta> ...\n")" @@ -93,7 +94,7 @@ version() { cmd=${0##*/} printf "%s (pacman) %s\n\n" "$cmd" "$myver" printf -- "$(gettext "\ -Copyright (c) 2006-2014 Pacman Development Team <pacman-dev@archlinux.org>\n\n\ +Copyright (c) 2006-2015 Pacman Development Team <pacman-dev@archlinux.org>\n\n\ This is free software; see the source for copying conditions.\n\ There is NO WARRANTY, to the extent permitted by law.\n")" } @@ -198,6 +199,17 @@ check_gpg() { error "$(gettext "Cannot find the gpg binary! Is GnuPG installed?")" exit 1 # $E_MISSING_PROGRAM fi + + if (( ! VERIFY )); then + if ! gpg --list-key ${GPGKEY} &>/dev/null; then + if [[ ! -z $GPGKEY ]]; then + error "$(gettext "The key ${GPGKEY} does not exist in your keyring.")" + elif (( ! KEY )); then + error "$(gettext "There is no key in your keyring.")" + fi + exit 1 + fi + fi } # sign the package database once repackaged @@ -249,7 +261,7 @@ verify_repo_extension() { *.@(db|files).tar.xz) TAR_OPT="J" ;; *.@(db|files).tar.Z) TAR_OPT="Z" ;; *.@(db|files).tar) TAR_OPT="" ;; - *) error "$(gettext "'%s' does not have a valid archive extension.")" \ + *) error "$(gettext "'%s' does not have a valid database archive extension.")" \ "$repofile" exit 1 ;; esac @@ -306,14 +318,13 @@ db_write_entry() { local oldfilename=$(grep -A1 FILENAME "$pkgentry/desc" | tail -n1) local oldfile="$(dirname "$1")/$oldfilename" fi - elif (( RMEXISTING )); then - # only remove existing package if we're not doing deltas + fi + if (( RMEXISTING )); then + # gather information needed to remove old file pkgentry=$(find_pkgentry "$pkgname") if [[ -n $pkgentry ]]; then local oldfilename="$(sed -n '/^%FILENAME%$/ {n;p;q;}' "$pkgentry/desc")" local oldfile="$(dirname "$1")/$oldfilename" - msg2 "$(gettext "Removing existing package '%s'")" "$oldfilename" - rm -f ${oldfile} ${oldfile}.sig fi fi fi @@ -412,6 +423,11 @@ db_write_entry() { fi fi + if (( RMEXISTING )); then + msg2 "$(gettext "Removing old package file '%s'")" "$oldfilename" + rm -f ${oldfile} ${oldfile}.sig + fi + return 0 } # end db_write_entry @@ -532,7 +548,7 @@ add() { } remove() { - if [[ ${1##*.} == "delta" ]]; then + if [[ $1 = *-*-*_to_*-*-*.delta ]]; then deltafile=$1 msg "$(gettext "Searching for delta '%s'...")" "$deltafile" if db_remove_delta "$deltafile"; then @@ -626,28 +642,14 @@ while (( $# )); do -f|--files) WITHFILES=1;; --nocolor) USE_COLOR='n';; -s|--sign) - check_gpg SIGN=1 - if ! gpg --list-key ${GPGKEY} &>/dev/null; then - if [[ ! -z $GPGKEY ]]; then - error "$(gettext "The key ${GPGKEY} does not exist in your keyring.")" - else - error "$(gettext "There is no key in your keyring.")" - fi - exit 1 - fi ;; -k|--key) - check_gpg + KEY=1 shift GPGKEY=$1 - if ! gpg --list-key ${GPGKEY} &>/dev/null; then - error "$(gettext "The key ${GPGKEY} does not exist in your keyring.")" - exit 1 - fi ;; -v|--verify) - check_gpg VERIFY=1 ;; *) @@ -674,6 +676,10 @@ fi verify_repo_extension "$REPO_DB_FILE" >/dev/null check_repo_db +if (( SIGN || KEY || VERIFY )); then + check_gpg +fi + for arg in "${args[@]:1}"; do case $cmd in repo-add) add "$arg" ;; @@ -709,12 +715,13 @@ if (( success )); then if [[ -f $REPO_DB_FILE ]]; then ln -f "$REPO_DB_FILE" "$REPO_DB_FILE.old" 2>/dev/null || \ mv -f "$REPO_DB_FILE" "$REPO_DB_FILE.old" - fi - if [[ -f $REPO_DB_FILE.sig ]]; then - ln -f "$REPO_DB_FILE.sig" "$REPO_DB_FILE.old.sig" 2>/dev/null || \ - mv -f "$REPO_DB_FILE.sig" "$REPO_DB_FILE.old.sig" - else - rm -f "$REPO_DB_FILE.old.sig" + + if [[ -f $REPO_DB_FILE.sig ]]; then + ln -f "$REPO_DB_FILE.sig" "$REPO_DB_FILE.old.sig" 2>/dev/null || \ + mv -f "$REPO_DB_FILE.sig" "$REPO_DB_FILE.old.sig" + else + rm -f "$REPO_DB_FILE.old.sig" + fi fi # rotate the newly-created database and signature into place |