Pastebin is 300% more awesome when you are logged in. Sign Up, it's FREE!
Guest

Untitled

By: a guest on Aug 10th, 2010  |  syntax: None  |  size: 56.59 KB  |  hits: 120  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #!/bin/bash -e
  2. #
  3. #   makepkg - make packages compatible for use with pacman
  4. #   Generated from makepkg.in; do not edit by hand.
  5. #
  6. #   Copyright (c) 2006-2009 Pacman Development Team <pacman-dev@archlinux.org>
  7. #   Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
  8. #   Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
  9. #   Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
  10. #   Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
  11. #   Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk>
  12. #   Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.org>
  13. #
  14. #   This program is free software; you can redistribute it and/or modify
  15. #   it under the terms of the GNU General Public License as published by
  16. #   the Free Software Foundation; either version 2 of the License, or
  17. #   (at your option) any later version.
  18. #
  19. #   This program is distributed in the hope that it will be useful,
  20. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22. #   GNU General Public License for more details.
  23. #
  24. #   You should have received a copy of the GNU General Public License
  25. #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  26. #
  27.  
  28. # makepkg uses quite a few external programs during its execution. You
  29. # need to have at least the following installed for makepkg to function:
  30. #   bsdtar (libarchive), bzip2, coreutils, fakeroot, find (findutils),
  31. #   getopt (util-linux), gettext, grep, gzip, openssl, sed, tput (ncurses)
  32.  
  33. # gettext initialization
  34. export TEXTDOMAIN='pacman'
  35. export TEXTDOMAINDIR='/usr/share/locale'
  36.  
  37. # file -i does not work on Mac OSX unless legacy mode is set
  38. export COMMAND_MODE='legacy'
  39.  
  40. myver='3.3.3'
  41. confdir='/etc'
  42. BUILDSCRIPT='PKGBUILD'
  43. startdir="$PWD"
  44. srcdir="$startdir/src"
  45. pkgdir="$startdir/pkg"
  46.  
  47. packaging_options=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'purge')
  48. other_options=('ccache' 'distcc' 'makeflags' 'force')
  49. splitpkg_overrides=('pkgver' 'pkgrel' 'pkgdesc' 'arch' 'license' 'groups' \
  50.                     'depends' 'optdepends' 'provides' 'conflicts' 'replaces' \
  51.                     'backup' 'options' 'install' 'changelog')
  52. readonly -a packaging_options other_options splitpkg_overrides
  53.  
  54. # Options
  55. ASROOT=0
  56. CLEANUP=0
  57. CLEANCACHE=0
  58. DEP_BIN=0
  59. FORCE=0
  60. INFAKEROOT=0
  61. GENINTEG=0
  62. SKIPINTEG=0
  63. INSTALL=0
  64. NOBUILD=0
  65. NODEPS=0
  66. NOEXTRACT=0
  67. RMDEPS=0
  68. REPKG=0
  69. LOGGING=0
  70. SOURCEONLY=0
  71. IGNOREARCH=0
  72. HOLDVER=0
  73. BUILDFUNC=0
  74. PKGFUNC=0
  75. SPLITPKG=0
  76. PKGLIST=""
  77.  
  78. # Forces the pkgver of the current PKGBUILD. Used by the fakeroot call
  79. # when dealing with svn/cvs/etc PKGBUILDs.
  80. FORCE_VER=""
  81.  
  82. PACMAN_OPTS=
  83.  
  84. ### SUBROUTINES ###
  85.  
  86. plain() {
  87.         local mesg=$1; shift
  88.         printf "${BOLD}    ${mesg}${ALL_OFF}\n" "$@" >&2
  89. }
  90.  
  91. msg() {
  92.         local mesg=$1; shift
  93.         printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
  94. }
  95.  
  96. msg2() {
  97.         local mesg=$1; shift
  98.         printf "${BLUE}  ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
  99. }
  100.  
  101. warning() {
  102.         local mesg=$1; shift
  103.         printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
  104. }
  105.  
  106. error() {
  107.         local mesg=$1; shift
  108.         printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
  109. }
  110.  
  111.  
  112. ##
  113. # Special exit call for traps, Don't print any error messages when inside,
  114. # the fakeroot call, the error message will be printed by the main call.
  115. ##
  116. trap_exit() {
  117.         if (( ! INFAKEROOT )); then
  118.                 echo
  119.                 error "$@"
  120.         fi
  121.         [[ -n $srclinks ]] && rm -rf "$srclinks"
  122.         exit 1
  123. }
  124.  
  125.  
  126. ##
  127. # Clean up function. Called automatically when the script exits.
  128. ##
  129. clean_up() {
  130.         local EXIT_CODE=$?
  131.  
  132.         if (( INFAKEROOT )); then
  133.                 # Don't clean up when leaving fakeroot, we're not done yet.
  134.                 return
  135.         fi
  136.  
  137.         if (( ! EXIT_CODE && CLEANUP )); then
  138.                 # If it's a clean exit and -c/--clean has been passed...
  139.                 msg "$(gettext "Cleaning up...")"
  140.                 rm -rf "$pkgdir" "$srcdir"
  141.                 if [[ -n $pkgbase ]]; then
  142.                         # Can't do this unless the BUILDSCRIPT has been sourced.
  143.                         if (( BUILDFUNC )); then
  144.                                 rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"*
  145.                         fi
  146.                         if (( PKGFUNC )); then
  147.                                 rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
  148.                         elif (( SPLITPKG )); then
  149.                                 for pkg in ${pkgname[@]}; do
  150.                                         rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package_${pkg}.log"*
  151.                                 done
  152.                         fi
  153.  
  154.                         # clean up dangling symlinks to packages
  155.                         for pkg in ${pkgname[@]}; do
  156.                                 for file in ${pkg}-*-*-${CARCH}${PKGEXT}; do
  157.                                         if [[ -h $file && ! -e $file ]]; then
  158.                                                 rm -f $file
  159.                                         fi
  160.                                 done
  161.                         done
  162.                 fi
  163.         fi
  164.  
  165.         remove_deps
  166. }
  167.  
  168.  
  169. ##
  170. # Signal Traps
  171. ##
  172. set -E
  173. trap 'clean_up' 0
  174. trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
  175. trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
  176. trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR
  177.  
  178. # a source entry can have two forms :
  179. # 1) "filename::http://path/to/file"
  180. # 2) "http://path/to/file"
  181.  
  182. # extract the filename from a source entry
  183. get_filename() {
  184.         # if a filename is specified, use it
  185.         local filename="${1%%::*}"
  186.         # if it is just an URL, we only keep the last component
  187.         echo "${filename##*/}"
  188. }
  189.  
  190. # extract the URL from a source entry
  191. get_url() {
  192.         # strip an eventual filename
  193.         echo "${1#*::}"
  194. }
  195.  
  196. ##
  197. # Checks to see if options are present in makepkg.conf or PKGBUILD;
  198. # PKGBUILD options always take precedence.
  199. #
  200. #  usage : check_option( $option )
  201. # return : y - enabled
  202. #          n - disabled
  203. #          ? - not found
  204. ##
  205. check_option() {
  206.         local ret=$(in_opt_array "$1" ${options[@]})
  207.         if [[ $ret != '?' ]]; then
  208.                 echo $ret
  209.                 return
  210.         fi
  211.  
  212.         # fall back to makepkg.conf options
  213.         ret=$(in_opt_array "$1" ${OPTIONS[@]})
  214.         if [[ $ret != '?' ]]; then
  215.                 echo $ret
  216.                 return
  217.         fi
  218.  
  219.         echo '?' # Not Found
  220. }
  221.  
  222.  
  223. ##
  224. # Check if option is present in BUILDENV
  225. #
  226. #  usage : check_buildenv( $option )
  227. # return : y - enabled
  228. #          n - disabled
  229. #          ? - not found
  230. ##
  231. check_buildenv() {
  232.         echo $(in_opt_array "$1" ${BUILDENV[@]})
  233. }
  234.  
  235.  
  236. ##
  237. #  usage : in_opt_array( $needle, $haystack )
  238. # return : y - enabled
  239. #          n - disabled
  240. #          ? - not found
  241. ##
  242. in_opt_array() {
  243.         local needle="${1,,}"; shift
  244.  
  245.         local opt
  246.         for opt in "$@"; do
  247.                 opt="${opt,,}"
  248.                 if [[ $opt = $needle ]]; then
  249.                         echo 'y' # Enabled
  250.                         return
  251.                 elif [[ $opt = "!$needle" ]]; then
  252.                         echo 'n' # Disabled
  253.                         return
  254.                 fi
  255.         done
  256.  
  257.         echo '?' # Not Found
  258. }
  259.  
  260.  
  261. ##
  262. #  usage : in_array( $needle, $haystack )
  263. # return : 0 - found
  264. #          1 - not found
  265. ##
  266. in_array() {
  267.         local needle=$1; shift
  268.         [[ -z $1 ]] && return 1 # Not Found
  269.         local item
  270.         for item in "$@"; do
  271.                 [[ $item = $needle ]] && return 0 # Found
  272.         done
  273.         return 1 # Not Found
  274. }
  275.  
  276. get_downloadclient() {
  277.         # $1 = URL with valid protocol prefix
  278.         local url=$1
  279.         local proto="${url%%://*}"
  280.  
  281.         # loop through DOWNLOAD_AGENTS variable looking for protocol
  282.         local i
  283.         for i in "${DLAGENTS[@]}"; do
  284.                 local handler="${i%%::*}"
  285.                 if [[ $proto = $handler ]]; then
  286.                         agent="${i##*::}"
  287.                         break
  288.                 fi
  289.         done
  290.  
  291.         # if we didn't find an agent, return an error
  292.         if [[ -z $agent ]]; then
  293.                 error "$(gettext "There is no agent set up to handle %s URLs. Check %s.")" "$proto" "$MAKEPKG_CONF"
  294.                 plain "$(gettext "Aborting...")"
  295.                 exit 1 # $E_CONFIG_ERROR
  296.         fi
  297.  
  298.         # ensure specified program is installed
  299.         local program="${agent%% *}"
  300.         if [[ ! -x $program ]]; then
  301.                 local baseprog=$(basename $program)
  302.                 error "$(gettext "The download program %s is not installed.")" "$baseprog"
  303.                 plain "$(gettext "Aborting...")"
  304.                 exit 1 # $E_MISSING_PROGRAM
  305.         fi
  306.  
  307.         echo "$agent"
  308. }
  309.  
  310. download_file() {
  311.         # download command
  312.         local dlcmd=$1
  313.         # URL of the file
  314.         local url=$2
  315.         # destination file
  316.         local file=$3
  317.         # temporary download file, default to last component of the URL
  318.         local dlfile="${url##*/}"
  319.  
  320.         # replace %o by the temporary dlfile if it exists
  321.         if echo "$dlcmd" | grep -q "%o" ; then
  322.                 dlcmd=${dlcmd//\%o/\"$file.part\"}
  323.                 dlfile="$file.part"
  324.         fi
  325.         # add the URL, either in place of %u or at the end
  326.         if echo "$dlcmd" | grep -q "%u" ; then
  327.                 dlcmd=${dlcmd//\%u/\"$url\"}
  328.         else
  329.                 dlcmd="$dlcmd \"$url\""
  330.         fi
  331.  
  332.         local ret=0
  333.         eval "$dlcmd || ret=\$?"
  334.         if (( ret )); then
  335.                 [[ ! -s $dlfile ]] && rm -f -- "$dlfile"
  336.                 return $ret
  337.         fi
  338.  
  339.         # rename the temporary download file to the final destination
  340.         if [[ $dlfile != $file ]]; then
  341.                 mv -f "$SRCDEST/$dlfile" "$SRCDEST/$file"
  342.         fi
  343. }
  344.  
  345. run_pacman() {
  346.         local ret=0
  347.         if (( ! ASROOT )) && [[ $1 != "-T" ]] && sudo -l $PACMAN &>/dev/null; then
  348.                 sudo $PACMAN $PACMAN_OPTS "$@" || ret=$?
  349.         else
  350.                 $PACMAN $PACMAN_OPTS "$@" || ret=$?
  351.         fi
  352.         return $ret
  353. }
  354.  
  355. check_deps() {
  356.         (( $# > 0 )) || return
  357.  
  358.         local ret=0
  359.         pmout=$(run_pacman -T "$@")
  360.         ret=$?
  361.         if (( ret == 127 )); then #unresolved deps
  362.                 echo "$pmout"
  363.         elif (( ret )); then
  364.                 error "$(gettext "'%s' returned a fatal error (%i): %s")" "$PACMAN" "$ret" "$pmout"
  365.                 exit 1
  366.         fi
  367. }
  368.  
  369. handle_deps() {
  370.         local R_DEPS_SATISFIED=0
  371.         local R_DEPS_MISSING=1
  372.  
  373.         (( $# == 0 )) && return $R_DEPS_SATISFIED
  374.  
  375.         local deplist="$*"
  376.  
  377.         if (( ! DEP_BIN )); then
  378.                 return $R_DEPS_MISSING
  379.         fi
  380.  
  381.         if (( DEP_BIN )); then
  382.                 # install missing deps from binary packages (using pacman -S)
  383.                 msg "$(gettext "Installing missing dependencies...")"
  384.  
  385.                 if ! run_pacman -S --asdeps $deplist; then
  386.                         error "$(gettext "'%s' failed to install missing dependencies.")" "$PACMAN"
  387.                         exit 1 # TODO: error code
  388.                 fi
  389.         fi
  390.  
  391.         # we might need the new system environment
  392.         # avoid triggering the ERR trap
  393.         local restoretrap=$(trap -p ERR)
  394.         trap - ERR
  395.         source /etc/profile &>/dev/null
  396.         eval $restoretrap
  397.  
  398.         return $R_DEPS_SATISFIED
  399. }
  400.  
  401. resolve_deps() {
  402.         # $pkgdeps is a GLOBAL variable, used by remove_deps()
  403.         local R_DEPS_SATISFIED=0
  404.         local R_DEPS_MISSING=1
  405.  
  406.         local deplist="$(check_deps $*)"
  407.         if [[ -z $deplist ]]; then
  408.                 return $R_DEPS_SATISFIED
  409.         fi
  410.  
  411.         if handle_deps $deplist; then
  412.                 pkgdeps="$pkgdeps $deplist"
  413.                 # check deps again to make sure they were resolved
  414.                 deplist="$(check_deps $*)"
  415.                 [[ -z $deplist ]] && return $R_DEPS_SATISFIED
  416.         elif (( DEP_BIN )); then
  417.                 error "$(gettext "Failed to install all missing dependencies.")"
  418.         fi
  419.  
  420.         msg "$(gettext "Missing Dependencies:")"
  421.         local dep
  422.         for dep in $deplist; do
  423.                 msg2 "$dep"
  424.         done
  425.  
  426.         return $R_DEPS_MISSING
  427. }
  428.  
  429. # fix flyspray bug #5923
  430. remove_deps() {
  431.         # $pkgdeps is a GLOBAL variable, set by resolve_deps()
  432.         (( ! RMDEPS )) && return
  433.         [[ -z $pkgdeps ]] && return
  434.  
  435.         local dep depstrip deplist
  436.         deplist=""
  437.         for dep in $pkgdeps; do
  438.                 depstrip="${dep%%[<=>]*}"
  439.                 deplist="$deplist $depstrip"
  440.         done
  441.  
  442.         msg "Removing installed dependencies..."
  443.  
  444.         # exit cleanly on failure to remove deps as package has been built successfully
  445.         if ! run_pacman -Rns $deplist; then
  446.                 warning "$(gettext "Failed to remove installed dependencies.")"
  447.                 return 0
  448.         fi
  449. }
  450.  
  451. download_sources() {
  452.         msg "$(gettext "Retrieving Sources...")"
  453.  
  454.         if [[ ! -w $SRCDEST ]] ; then
  455.                 error "$(gettext "You do not have write permission to store downloads in %s.")" "$SRCDEST"
  456.                 plain "$(gettext "Aborting...")"
  457.                 exit 1
  458.         fi
  459.  
  460.         pushd "$SRCDEST" &>/dev/null
  461.  
  462.         local netfile
  463.         for netfile in "${source[@]}"; do
  464.                 local file=$(get_filename "$netfile")
  465.                 local url=$(get_url "$netfile")
  466.                 if [[ -f $startdir/$file ]]; then
  467.                         msg2 "$(gettext "Found %s in build dir")" "$file"
  468.                         rm -f "$srcdir/$file"
  469.                         ln -s "$startdir/$file" "$srcdir/"
  470.                         continue
  471.                 elif [[ -f $SRCDEST/$file ]]; then
  472.                         msg2 "$(gettext "Using cached copy of %s")" "$file"
  473.                         rm -f "$srcdir/$file"
  474.                         ln -s "$SRCDEST/$file" "$srcdir/"
  475.                         continue
  476.                 fi
  477.  
  478.                 # if we get here, check to make sure it was a URL, else fail
  479.                 if [[ $file = $url ]]; then
  480.                         error "$(gettext "%s was not found in the build directory and is not a URL.")" "$file"
  481.                         exit 1 # $E_MISSING_FILE
  482.                 fi
  483.  
  484.                 # find the client we should use for this URL
  485.                 local dlclient=$(get_downloadclient "$url") || exit $?
  486.  
  487.                 msg2 "$(gettext "Downloading %s...")" "$file"
  488.                 # fix flyspray bug #3289
  489.                 local ret=0
  490.                 download_file "$dlclient" "$url" "$file" || ret=$?
  491.                 if (( ret )); then
  492.                         error "$(gettext "Failure while downloading %s")" "$file"
  493.                         plain "$(gettext "Aborting...")"
  494.                         exit 1
  495.                 fi
  496.                 rm -f "$srcdir/$file"
  497.                 ln -s "$SRCDEST/$file" "$srcdir/"
  498.         done
  499.  
  500.         popd &>/dev/null
  501. }
  502.  
  503. generate_checksums() {
  504.         msg "$(gettext "Generating checksums for source files...")"
  505.         plain ""
  506.  
  507.         if [ ! $(type -p openssl) ]; then
  508.                 error "$(gettext "Cannot find openssl.")"
  509.                 exit 1 # $E_MISSING_PROGRAM
  510.         fi
  511.  
  512.         local integ
  513.         for integ in ${INTEGRITY_CHECK[@]}; do
  514.                 integ="${integ,,}"
  515.                 case "$integ" in
  516.                         md5|sha1|sha256|sha384|sha512) : ;;
  517.                         *)
  518.                                 error "$(gettext "Invalid integrity algorithm '%s' specified.")" "$integ"
  519.                                 exit 1;; # $E_CONFIG_ERROR
  520.                 esac
  521.  
  522.                 local ct=0
  523.                 local numsrc=${#source[@]}
  524.                 echo -n "${integ}sums=("
  525.  
  526.                 local i
  527.                 local indent=''
  528.                 for (( i = 0; i < ${#integ} + 6; i++ )); do
  529.                         indent="$indent "
  530.                 done
  531.  
  532.                 local netfile
  533.                 for netfile in "${source[@]}"; do
  534.                         local file="$(get_filename "$netfile")"
  535.  
  536.                         if [[ ! -f $file ]] ; then
  537.                                 if [[ ! -f $SRCDEST/$file ]] ; then
  538.                                         error "$(gettext "Unable to find source file %s to generate checksum.")" "$file"
  539.                                         plain "$(gettext "Aborting...")"
  540.                                         exit 1
  541.                                 else
  542.                                         file="$SRCDEST/$file"
  543.                                 fi
  544.                         fi
  545.  
  546.                         local sum="$(openssl dgst -${integ} "$file")"
  547.                         sum=${sum##* }
  548.                         (( ct )) && echo -n "$indent"
  549.                         echo -n "'$sum'"
  550.                         ct=$(($ct+1))
  551.                         (( $ct < $numsrc )) && echo
  552.                 done
  553.  
  554.                 echo ")"
  555.         done
  556. }
  557.  
  558. check_checksums() {
  559.         (( ! ${#source[@]} )) && return 0
  560.  
  561.         if [ ! $(type -p openssl) ]; then
  562.                 error "$(gettext "Cannot find openssl.")"
  563.                 exit 1 # $E_MISSING_PROGRAM
  564.         fi
  565.  
  566.         local correlation=0
  567.         local integ required
  568.         for integ in md5 sha1 sha256 sha384 sha512; do
  569.                 local integrity_sums=($(eval echo "\${${integ}sums[@]}"))
  570.                 if (( ${#integrity_sums[@]} == ${#source[@]} )); then
  571.                         msg "$(gettext "Validating source files with %s...")" "${integ}sums"
  572.                         correlation=1
  573.                         local errors=0
  574.                         local idx=0
  575.                         local file
  576.                         for file in "${source[@]}"; do
  577.                                 local found=1
  578.                                 file="$(get_filename "$file")"
  579.                                 echo -n "    $file ... " >&2
  580.  
  581.                                 if [[ ! -f $file ]] ; then
  582.                                         if [[ ! -f $SRCDEST/$file ]] ; then
  583.                                                 echo "$(gettext "NOT FOUND")" >&2
  584.                                                 errors=1
  585.                                                 found=0
  586.                                         else
  587.                                                 file="$SRCDEST/$file"
  588.                                         fi
  589.                                 fi
  590.  
  591.                                 if (( $found )) ; then
  592.                                         local expectedsum="${integrity_sums[$idx],,}"
  593.                                         local realsum="$(openssl dgst -${integ} "$file")"
  594.                                         realsum="${realsum##* }"
  595.                                         if [[ $expectedsum = $realsum ]]; then
  596.                                                 echo "$(gettext "Passed")" >&2
  597.                                         else
  598.                                                 echo "$(gettext "FAILED")" >&2
  599.                                                 errors=1
  600.                                         fi
  601.                                 fi
  602.  
  603.                                 idx=$((idx + 1))
  604.                         done
  605.  
  606.                         if (( errors )); then
  607.                                 error "$(gettext "One or more files did not pass the validity check!")"
  608.                                 exit 1 # TODO: error code
  609.                         fi
  610.                 elif (( ${#integrity_sums[@]} )); then
  611.                         error "$(gettext "Integrity checks (%s) differ in size from the source array.")" "$integ"
  612.                         exit 1 # TODO: error code
  613.                 fi
  614.         done
  615.  
  616.         if (( ! correlation )); then
  617.                 if (( SKIPINTEG )); then
  618.                         warning "$(gettext "Integrity checks are missing.")"
  619.                 else
  620.                         error "$(gettext "Integrity checks are missing.")"
  621.                         exit 1 # TODO: error code
  622.                 fi
  623.         fi
  624. }
  625.  
  626. extract_sources() {
  627.         msg "$(gettext "Extracting Sources...")"
  628.         local netfile
  629.         for netfile in "${source[@]}"; do
  630.                 file=$(get_filename "$netfile")
  631.                 if in_array "$file" ${noextract[@]}; then
  632.                         #skip source files in the noextract=() array
  633.                         #  these are marked explicitly to NOT be extracted
  634.                         continue
  635.                 fi
  636.  
  637.                 if [[ ! -f $file ]] ; then
  638.                         if [[ ! -f $SRCDEST/$file ]] ; then
  639.                                 error "$(gettext "Unable to find source file %s for extraction.")" "$file"
  640.                                 plain "$(gettext "Aborting...")"
  641.                                 exit 1
  642.                         else
  643.                                 file="$SRCDEST/$file"
  644.                         fi
  645.                 fi
  646.  
  647.                 # fix flyspray #6246
  648.                 local file_type=$(file -bizL "$file")
  649.                 local ext=${file##*.}
  650.                 local cmd=''
  651.                 case "$file_type" in
  652.                         *application/x-tar*|*application/zip*|*application/x-zip*|*application/x-cpio*)
  653.                                 cmd="bsdtar" ;;
  654.                         *application/x-gzip*)
  655.                                 case "$ext" in
  656.                                         gz|z|Z) cmd="gzip" ;;
  657.                                         *) continue;;
  658.                                 esac ;;
  659.                         *application/x-bzip*)
  660.                                 case "$ext" in
  661.                                         bz2|bz) cmd="bzip2" ;;
  662.                                         *) continue;;
  663.                                 esac ;;
  664.                         *application/x-xz*)
  665.                                 case "$ext" in
  666.                                         xz) cmd="xz" ;;
  667.                                         *) continue;;
  668.                                 esac ;;
  669.                         *)
  670.                                 # Don't know what to use to extract this file,
  671.                                 # skip to the next file
  672.                                 continue;;
  673.                 esac
  674.  
  675.                 local ret=0
  676.                 msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
  677.                 if [[ $cmd = bsdtar ]]; then
  678.                         $cmd -xf "$file" || ret=?
  679.                 else
  680.                         rm -f "${file%.*}"
  681.                         $cmd -dcf "$file" > "${file%.*}" || ret=?
  682.                 fi
  683.                 if (( ret )); then
  684.                         error "$(gettext "Failed to extract %s")" "$file"
  685.                         plain "$(gettext "Aborting...")"
  686.                         exit 1
  687.                 fi
  688.         done
  689.  
  690.         if (( EUID == 0 )); then
  691.                 # change perms of all source files to root user & root group
  692.                 chown -R 0:0 "$srcdir"
  693.         fi
  694. }
  695.  
  696. error_function() {
  697.         if [[ -p $logpipe ]]; then
  698.                 rm "$logpipe"
  699.         fi
  700.         # first exit all subshells, then print the error
  701.         if (( ! BASH_SUBSHELL )); then
  702.                 plain "$(gettext "Aborting...")"
  703.                 remove_deps
  704.         fi
  705.         exit 2 # $E_BUILD_FAILED
  706. }
  707.  
  708. run_function() {
  709.         if [[ -z $1 ]]; then
  710.                 return 1
  711.         fi
  712.         pkgfunc="$1"
  713.  
  714.         # clear user-specified makeflags if requested
  715.         if [[ $(check_option makeflags) = "n" ]]; then
  716.                 MAKEFLAGS=""
  717.         fi
  718.  
  719.         msg "$(gettext "Starting %s()...")" "$pkgfunc"
  720.         cd "$srcdir"
  721.  
  722.         # ensure all necessary build variables are exported
  723.         export CFLAGS CXXFLAGS LDFLAGS MAKEFLAGS CHOST
  724.         # save our shell options so pkgfunc() can't override what we need
  725.         local shellopts=$(shopt -p)
  726.  
  727.         local ret=0
  728.         if (( LOGGING )); then
  729.                 BUILDLOG="${startdir}/${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-$pkgfunc.log"
  730.                 if [[ -f $BUILDLOG ]]; then
  731.                         local i=1
  732.                         while true; do
  733.                                 if [[ -f $BUILDLOG.$i ]]; then
  734.                                         i=$(($i +1))
  735.                                 else
  736.                                         break
  737.                                 fi
  738.                         done
  739.                         mv "$BUILDLOG" "$BUILDLOG.$i"
  740.                 fi
  741.  
  742.                 # ensure overridden package variables survive tee with split packages
  743.                 logpipe=$(mktemp -u "$startdir/logpipe.XXXXXXXX")
  744.                 mknod "$logpipe" p
  745.                 exec 3>&1
  746.                 tee "$BUILDLOG" < "$logpipe" &
  747.                 exec 1>"$logpipe" 2>"$logpipe"
  748.                 restoretrap=$(trap -p ERR)
  749.                 trap 'error_function' ERR
  750.                 $pkgfunc 2>&1
  751.                 eval $restoretrap
  752.                 sync
  753.                 exec 1>&3 2>&3 3>&-
  754.                 rm "$logpipe"
  755.         else
  756.                 restoretrap=$(trap -p ERR)
  757.                 trap 'error_function' ERR
  758.                 $pkgfunc 2>&1
  759.                 eval $restoretrap
  760.         fi
  761.         # reset our shell options
  762.         eval "$shellopts"
  763. }
  764.  
  765. run_build() {
  766.         # use distcc if it is requested (check buildenv and PKGBUILD opts)
  767.         if [[ $(check_buildenv distcc) = "y" && $(check_option distcc) != "n" ]]; then
  768.                 [[ -d /usr/lib/distcc/bin ]] && export PATH="/usr/lib/distcc/bin:$PATH"
  769.                 export DISTCC_HOSTS
  770.         elif [[ $(check_option distcc) = "n" ]]; then
  771.                 # if it is not wanted, clear the makeflags too
  772.                 MAKEFLAGS=""
  773.         fi
  774.  
  775.         # use ccache if it is requested (check buildenv and PKGBUILD opts)
  776.         if [[ $(check_buildenv ccache) = "y" && $(check_option ccache) != "n" ]]; then
  777.                 [[ -d /usr/lib/ccache/bin ]] && export PATH="/usr/lib/ccache/bin:$PATH"
  778.         fi
  779.  
  780.         run_function "build"
  781. }
  782.  
  783. run_package() {
  784.         if [[ -z $1 ]]; then
  785.                 pkgfunc="package"
  786.         else
  787.                 pkgfunc="package_$1"
  788.         fi
  789.  
  790.         run_function "$pkgfunc"
  791. }
  792.  
  793. tidy_install() {
  794.         cd "$pkgdir"
  795.         msg "$(gettext "Tidying install...")"
  796.  
  797.         if [[ $(check_option docs) = "n" && -n ${DOC_DIRS[*]} ]]; then
  798.                 msg2 "$(gettext "Removing doc files...")"
  799.                 rm -rf ${DOC_DIRS[@]}
  800.         fi
  801.  
  802.         if [[ $(check_option purge) = "y" && -n ${PURGE_TARGETS[*]} ]]; then
  803.                 msg2 "$(gettext "Purging other files...")"
  804.                 local pt
  805.                 for pt in "${PURGE_TARGETS[@]}"; do
  806.                         if [[ ${pt} = ${pt//\/} ]]; then
  807.                                 find . -type f -name "${pt}" -exec rm -f -- '{}' \;
  808.                         else
  809.                                 rm -f ${pt}
  810.                         fi
  811.                 done
  812.         fi
  813.  
  814.         if [[ $(check_option zipman) = "y" && -n ${MAN_DIRS[*]} ]]; then
  815.                 msg2 "$(gettext "Compressing man and info pages...")"
  816.                 local manpage ext file link hardlinks hl
  817.                 find ${MAN_DIRS[@]} -type f 2>/dev/null |
  818.                 while read manpage ; do
  819.                         # check file still exists (potentially compressed with hard link)
  820.                         if [[ -f ${manpage} ]]; then
  821.                                 ext="${manpage##*.}"
  822.                                 file="${manpage##*/}"
  823.                                 if [[ $ext != gz && $ext != bz2 ]]; then
  824.                                         # update symlinks to this manpage
  825.                                         find ${MAN_DIRS[@]} -lname "$file" 2>/dev/null |
  826.                                         while read link ; do
  827.                                                 rm -f "$link"
  828.                                                 ln -sf "${file}.gz" "${link}.gz"
  829.                                         done
  830.                                         # find hard links and remove them
  831.                                         #   the '|| true' part keeps the script from bailing if find returned an
  832.                                         #   error, such as when one of the man directories doesn't exist
  833.                                         hardlinks="$(find ${MAN_DIRS[@]} \! -name "$file" -samefile "$manpage" 2>/dev/null)" || true
  834.                                         for hl in ${hardlinks}; do
  835.                                                 rm -f "${hl}";
  836.                                         done
  837.                                         # compress the original
  838.                                         gzip -9 "$manpage"
  839.                                         # recreate hard links removed earlier
  840.                                         for hl in ${hardlinks}; do
  841.                                                 ln "${manpage}.gz" "${hl}.gz"
  842.                                                 chmod 644 ${hl}.gz
  843.                                         done
  844.                                 fi
  845.                         fi
  846.                 done
  847.         fi
  848.  
  849.         if [[ $(check_option strip) = y && -n ${STRIP_DIRS[*]} ]]; then
  850.                 msg2 "$(gettext "Stripping debugging symbols from binaries and libraries...")"
  851.                 local binary
  852.                 find ${STRIP_DIRS[@]} -type f 2>/dev/null | while read binary ; do
  853.                         case "$(file -biz "$binary")" in
  854.                                 *compressed-encoding*)      # Skip compressed binaries
  855.                                         ;;
  856.                                 *application/x-sharedlib*)  # Libraries (.so)
  857.                                         /usr/bin/strip -S "$binary";;
  858.                                 *application/x-archive*)    # Libraries (.a)
  859.                                         /usr/bin/strip -S "$binary";;
  860.                                 *application/x-executable*) # Binaries
  861.                                         /usr/bin/strip "$binary";;
  862.                         esac
  863.                 done
  864.         fi
  865.  
  866.         if [[ $(check_option libtool) = "n" ]]; then
  867.                 msg2 "$(gettext "Removing libtool .la files...")"
  868.                 find . ! -type d -name "*.la" -exec rm -f -- '{}' \;
  869.         fi
  870.  
  871.         if [[ $(check_option emptydirs) = "n" ]]; then
  872.                 msg2 "$(gettext "Removing empty directories...")"
  873.                 find . -depth -type d -empty -delete
  874.         fi
  875. }
  876.  
  877. write_pkginfo() {
  878.         local builddate=$(date -u "+%s")
  879.         if [[ -n $PACKAGER ]]; then
  880.                 local packager="$PACKAGER"
  881.         else
  882.                 local packager="Unknown Packager"
  883.         fi
  884.         local size="$(du -sk)"
  885.         size="$(( ${size%%[^0-9]*} * 1024 ))"
  886.  
  887.         msg2 "$(gettext "Generating .PKGINFO file...")"
  888.         echo "# Generated by makepkg $myver" >.PKGINFO
  889.         if (( INFAKEROOT )); then
  890.                 echo "# using $(fakeroot -v)" >>.PKGINFO
  891.         fi
  892.         echo "# $(LC_ALL=C date -u)" >>.PKGINFO
  893.         echo "pkgname = $1" >>.PKGINFO
  894.         (( SPLITPKG )) && echo pkgbase = $pkgbase >>.PKGINFO
  895.         echo "pkgver = $pkgver-$pkgrel" >>.PKGINFO
  896.         echo "pkgdesc = $pkgdesc" >>.PKGINFO
  897.         echo "url = $url" >>.PKGINFO
  898.         echo "builddate = $builddate" >>.PKGINFO
  899.         echo "packager = $packager" >>.PKGINFO
  900.         echo "size = $size" >>.PKGINFO
  901.         echo "arch = $PKGARCH" >>.PKGINFO
  902.         if [[ $(check_option force) = "y" ]]; then
  903.                 echo "force = true" >> .PKGINFO
  904.         fi
  905.  
  906.         local it
  907.         for it in "${license[@]}"; do
  908.                 echo "license = $it" >>.PKGINFO
  909.         done
  910.         for it in "${replaces[@]}"; do
  911.                 echo "replaces = $it" >>.PKGINFO
  912.         done
  913.         for it in "${groups[@]}"; do
  914.                 echo "group = $it" >>.PKGINFO
  915.         done
  916.         for it in "${depends[@]}"; do
  917.                 echo "depend = $it" >>.PKGINFO
  918.         done
  919.         for it in "${optdepends[@]}"; do
  920.                 echo "optdepend = $it" >>.PKGINFO
  921.         done
  922.         for it in "${conflicts[@]}"; do
  923.                 echo "conflict = $it" >>.PKGINFO
  924.         done
  925.         for it in "${provides[@]}"; do
  926.                 echo "provides = $it" >>.PKGINFO
  927.         done
  928.         for it in "${backup[@]}"; do
  929.                 echo "backup = $it" >>.PKGINFO
  930.         done
  931.         for it in "${packaging_options[@]}"; do
  932.                 local ret="$(check_option $it)"
  933.                 if [[ $ret != "?" ]]; then
  934.                         if [[ $ret = y ]]; then
  935.                                 echo "makepkgopt = $it" >>.PKGINFO
  936.                         else
  937.                                 echo "makepkgopt = !$it" >>.PKGINFO
  938.                         fi
  939.                 fi
  940.         done
  941.  
  942.         # TODO maybe remove this at some point
  943.         # warn if license array is not present or empty
  944.         if [[ -z $license ]]; then
  945.                 warning "$(gettext "Please add a license line to your %s!")" "$BUILDSCRIPT"
  946.                 plain "$(gettext "Example for GPL\'ed software: license=('GPL').")"
  947.         fi
  948. }
  949.  
  950. check_package() {
  951.         cd "$pkgdir"
  952.  
  953.         # check existence of backup files
  954.         local file
  955.         for file in "${backup[@]}"; do
  956.                 if [[ ! -f $file ]]; then
  957.                         warning "$(gettext "Invalid backup entry : %s")" "$file"
  958.                 fi
  959.         done
  960.  
  961.         # check for references to the build directory
  962.         if grep -R "${srcdir}" "${pkgdir}" &>/dev/null; then
  963.                 warning "$(gettext "Package contains reference to %s")" "\$srcdir"
  964.         fi
  965. }
  966.  
  967. create_package_pacman() {
  968.         if [[ -z $1 ]]; then
  969.                 nameofpkg="$pkgname"
  970.         else
  971.                 nameofpkg="$1"
  972.         fi
  973.  
  974.         if [[ $arch = "any" ]]; then
  975.                 PKGARCH="any"
  976.         else
  977.                 PKGARCH=$CARCH
  978.         fi
  979.  
  980.         write_pkginfo $nameofpkg
  981.  
  982.         local comp_files=".PKGINFO"
  983.  
  984.         # check for an install script
  985.         if [[ -n $install ]]; then
  986.                 msg2 "$(gettext "Adding install script...")"
  987.                 cp "$startdir/$install" .INSTALL
  988.                 comp_files="$comp_files .INSTALL"
  989.         fi
  990.  
  991.         # do we have a changelog?
  992.         if [[ -n $changelog ]]; then
  993.                 msg2 "$(gettext "Adding package changelog...")"
  994.                 cp "$startdir/$changelog" .CHANGELOG
  995.                 comp_files="$comp_files .CHANGELOG"
  996.         fi
  997.  
  998.         # tar it up
  999.         msg2 "$(gettext "Compressing package...")"
  1000.  
  1001.         case "$PKGEXT" in
  1002.                 *tar.gz)  EXT=${PKGEXT%.gz} ;;
  1003.                 *tar.bz2) EXT=${PKGEXT%.bz2} ;;
  1004.                 *tar.xz)  EXT=${PKGEXT%.xz} ;;
  1005.                 *) warning "$(gettext "'%s' is not a valid archive extension.")" \
  1006.                 "$PKGEXT" ; EXT=$PKGEXT ;;
  1007.         esac
  1008.         local tar_file="$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}${EXT}"
  1009.         local pkg_file="$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}${PKGEXT}"
  1010.  
  1011.         local ret=0
  1012.  
  1013.         # when fileglobbing, we want * in an empty directory to expand to
  1014.         # the null string rather than itself
  1015.         shopt -s nullglob
  1016.         bsdtar -cf - $comp_files * > "$tar_file" || ret=$?
  1017.         shopt -u nullglob
  1018.  
  1019.         if (( ! ret )); then
  1020.                 case "$PKGEXT" in
  1021.                         *tar.gz)  gzip -f -n "$tar_file" ;;
  1022.                         *tar.bz2) bzip2 -f "$tar_file" ;;
  1023.                         *tar.xz)  xz -z -f "$tar_file" ;;
  1024.                 esac
  1025.                 ret=$?
  1026.         fi
  1027.  
  1028.         if (( ret )); then
  1029.                 error "$(gettext "Failed to create package file.")"
  1030.                 exit 1 # TODO: error code
  1031.         fi
  1032.  
  1033.         if (( ! ret )) && [[ "$PKGDEST" != "${startdir}" ]]; then
  1034.                 ln -sf "${pkg_file}" "${pkg_file/$PKGDEST/$startdir}"
  1035.                 ret=$?
  1036.         fi
  1037.  
  1038.         if (( ret )); then
  1039.                 warning "$(gettext "Failed to create symlink to package file.")"
  1040.         fi
  1041. }
  1042.  
  1043. create_package_deb() {
  1044.         if [[ -z $1 ]]; then
  1045.                 nameofpkg="$pkgname"
  1046.         else
  1047.                 nameofpkg="$1"
  1048.         fi
  1049.  
  1050.         if [[ $arch = "any" ]]; then
  1051.                 PKGARCH="any"
  1052.         else
  1053.                 PKGARCH=$CARCH
  1054.         fi
  1055.  
  1056.         tar cf "data.tar" *
  1057.         gzip -f -n "data.tar"
  1058.  
  1059.         local control_files="control"
  1060.  
  1061.         local builddate=$(date -u "+%s")
  1062.         if [[ -n $PACKAGER ]]; then
  1063.                 local packager="$PACKAGER"
  1064.         else
  1065.                 local packager="Unknown Packager"
  1066.         fi
  1067.         local size="$(du -sk)"
  1068.         size="$(( ${size%%[^0-9]*} * 1024 ))"
  1069.  
  1070.         msg2 "$(gettext "Generating control file...")"
  1071.  
  1072.         echo "Package: $nameofpkg" >>control
  1073.         echo "Version: $pkgver" >>control
  1074.         echo "Architecture: $PKGARCH" >>control
  1075.         echo "Maintainer: $packager" >>control
  1076.         echo "Installed-Size: $size" >>control
  1077.  
  1078.         echo -n "Depends: " >>control
  1079.         n=0
  1080.         for it in "${depends[@]}"; do
  1081.                 n=$(expr $n + 1)
  1082.                 echo -n "$it" >>control
  1083.                 if [ ! $n = "${#depends[@]}" ]
  1084.                 then
  1085.                         echo -n ", ">>control
  1086.                 fi
  1087.         done
  1088.         echo >>control
  1089.  
  1090.         echo -n "Conflicts: ">>control
  1091.         n=0
  1092.         for it in "${conflicts[@]}"; do
  1093.                 n=$(expr $n + 1)
  1094.                 echo -n "$it" >>control
  1095.                 if [ ! $n = "${#conflicts[@]}" ]
  1096.                 then
  1097.                         echo -n ", " >>control
  1098.                 fi
  1099.         done
  1100.         echo >>control
  1101.  
  1102.         echo -n "Suggests: " >> control
  1103.         for it in "${provides[@]}"; do
  1104.                 echo -n "$it" >>control
  1105.                 if [ ! $n = "${#provides[@]}" ]
  1106.                 then
  1107.                         echo -n ", " >>control
  1108.                 fi
  1109.         done
  1110.         echo >> control
  1111.  
  1112.         echo "Description: $pkgdesc" >>control
  1113.  
  1114.         tar cf "control.tar" $control_files
  1115.         gzip -f -n "control.tar"
  1116.  
  1117.         echo "2.0" > debian-binary
  1118.  
  1119.         rm $control_files
  1120.  
  1121.         # tar it up
  1122.         msg2 "$(gettext "Compressing package...")"
  1123.  
  1124.         local files="control.tar.gz data.tar.gz debian-binary"
  1125.  
  1126.         PKGEXT='.deb'
  1127.  
  1128.         local pkg_file="$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}${PKGEXT}"
  1129.  
  1130.         local ret=0
  1131.  
  1132.         ar rcs $pkg_file $files || ret=$?
  1133.  
  1134.         rm $files
  1135.  
  1136.         if (( ret )); then
  1137.                 error "$(gettext "Failed to create package file.")"
  1138.                 exit 1 # TODO: error code
  1139.         fi
  1140.  
  1141.         if (( ! ret )) && [[ "$PKGDEST" != "${startdir}" ]]; then
  1142.                 ln -sf "${pkg_file}" "${pkg_file/$PKGDEST/$startdir}"
  1143.                 ret=$?
  1144.         fi
  1145.  
  1146.         if (( ret )); then
  1147.                 warning "$(gettext "Failed to create symlink to package file.")"
  1148.         fi
  1149. }
  1150.  
  1151. create_package() {
  1152.         if [[ ! -d $pkgdir ]]; then
  1153.                 error "$(gettext "Missing pkg/ directory.")"
  1154.                 plain "$(gettext "Aborting...")"
  1155.                 exit 1 # $E_MISSING_PKGDIR
  1156.         fi
  1157.  
  1158.         check_package
  1159.  
  1160.         cd "$pkgdir"
  1161.         msg "$(gettext "Creating package...")"
  1162.  
  1163.         if [[ -z $1 ]]; then
  1164.                 nameofpkg="$pkgname"
  1165.         else
  1166.                 nameofpkg="$1"
  1167.         fi
  1168.  
  1169.         if [[ $arch = "any" ]]; then
  1170.                 PKGARCH="any"
  1171.         else
  1172.                 PKGARCH=$CARCH
  1173.         fi
  1174.  
  1175.         case "$PKGEXT" in
  1176.                 .pkg.tar.*) create_package_pacman $1 ;;
  1177.                 .deb) create_package_deb $1 ;;
  1178.                 .rpm) create_package_rpm $1 ;;
  1179.                 .tar)
  1180.                         tar cf "$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}${PKGEXT}" *
  1181.                 ;;
  1182.                 .tar.gz)
  1183.                         tar cf "$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}${PKGEXT}" *
  1184.                         gzip -f -n "$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}.tar"
  1185.                 ;;
  1186.                 .tar.bz2)
  1187.                         tar cf "$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}${PKGEXT}" *
  1188.                         bzip2 -f -n "$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}.tar"
  1189.                 ;;
  1190.                 .ebuild);;
  1191.                 .pisi);;
  1192.                 .lzm);;
  1193.                 .pup|.pet);;
  1194.                 *) create_package_pacman $1;;
  1195.         esac
  1196. }
  1197.  
  1198. create_srcpackage() {
  1199.         cd "$startdir"
  1200.  
  1201.         # Get back to our src directory so we can begin with sources.
  1202.         mkdir -p "$srcdir"
  1203.         cd "$srcdir"
  1204.         download_sources
  1205.         # We can only check checksums if we have all files.
  1206.         check_checksums
  1207.         cd "$startdir"
  1208.  
  1209.         msg "$(gettext "Creating source package...")"
  1210.         local srclinks="$(mktemp -d "$startdir"/srclinks.XXXXXXXXX)"
  1211.         mkdir "${srclinks}"/${pkgbase}
  1212.  
  1213.         msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
  1214.         ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
  1215.  
  1216.         if [[ -n $install ]]; then
  1217.                 if [[ -f $install ]]; then
  1218.                         msg2 "$(gettext "Adding install script...")"
  1219.                         ln -s "${startdir}/$install" "${srclinks}/${pkgbase}/"
  1220.                 else
  1221.                         error "$(gettext "Install scriptlet (%s) does not exist.")" "$install"
  1222.                 fi
  1223.         fi
  1224.  
  1225.         if [[ -n $changelog ]]; then
  1226.                 if [[ -f $changelog ]]; then
  1227.                         msg2 "$(gettext "Adding package changelog...")"
  1228.                         ln -s "${startdir}/$changelog" "${srclinks}/${pkgbase}/"
  1229.                 else
  1230.                         error "$(gettext "Changelog file (%s) does not exist.")" "$changelog"
  1231.                 fi
  1232.         fi
  1233.  
  1234.         local netfile
  1235.         for netfile in "${source[@]}"; do
  1236.                 local file=$(get_filename "$netfile")
  1237.                 if [[ -f $netfile ]]; then
  1238.                         msg2 "$(gettext "Adding %s...")" "$netfile"
  1239.                         ln -s "${startdir}/$netfile" "${srclinks}/${pkgbase}"
  1240.                 elif (( SOURCEONLY == 2 )) && [[ -f $SRCDEST/$file ]]; then
  1241.                         msg2 "$(gettext "Adding %s...")" "$file"
  1242.                         ln -s "$SRCDEST/$file" "${srclinks}/${pkgbase}/"
  1243.                 fi
  1244.         done
  1245.  
  1246.         local TAR_OPT
  1247.         case "$SRCEXT" in
  1248.                 *tar.gz)  TAR_OPT="z" ;;
  1249.                 *tar.bz2) TAR_OPT="j" ;;
  1250.                 *tar.xz)  TAR_OPT="J" ;;
  1251.                 *) warning "$(gettext "'%s' is not a valid archive extension.")" \
  1252.                 "$SRCEXT" ;;
  1253.         esac
  1254.  
  1255.         local pkg_file="$SRCPKGDEST/${pkgbase}-${pkgver}-${pkgrel}${SRCEXT}"
  1256.  
  1257.         # tar it up
  1258.         msg2 "$(gettext "Compressing source package...")"
  1259.         cd "${srclinks}"
  1260.         if ! bsdtar -c${TAR_OPT}Lf "$pkg_file" ${pkgbase}; then
  1261.                 error "$(gettext "Failed to create source package file.")"
  1262.                 exit 1 # TODO: error code
  1263.         fi
  1264.         cd "${startdir}"
  1265.         rm -rf "${srclinks}"
  1266. }
  1267.  
  1268. install_package() {
  1269.         (( ! INSTALL )) && return
  1270.  
  1271.         if (( ! SPLITPKG )); then
  1272.                 msg "$(gettext "Installing package %s with %s -U...")" "$pkgname" "$PACMAN"
  1273.         else
  1274.                 msg "$(gettext "Installing %s package group with %s -U...")" "$pkgbase" "$PACMAN"
  1275.         fi
  1276.  
  1277.         local pkglist
  1278.         for pkg in ${pkgname[@]}; do
  1279.                 if [[ -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} ]]; then
  1280.                         pkglist="${pkglist} $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
  1281.                 else
  1282.                         pkglist="${pkglist} $PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT}"
  1283.                 fi
  1284.         done
  1285.  
  1286.         if ! run_pacman -U $pkglist; then
  1287.                 warning "$(gettext "Failed to install built package(s).")"
  1288.                 return 0
  1289.         fi
  1290. }
  1291.  
  1292. check_sanity() {
  1293.         # check for no-no's in the build script
  1294.         if [[ -z $pkgname ]]; then
  1295.                 error "$(gettext "%s is not allowed to be empty.")" "pkgname"
  1296.                 return 1
  1297.         fi
  1298.         if [[ -z $pkgver ]]; then
  1299.                 error "$(gettext "%s is not allowed to be empty.")" "pkgver"
  1300.                 return 1
  1301.         fi
  1302.         if [[ -z $pkgrel ]]; then
  1303.                 error "$(gettext "%s is not allowed to be empty.")" "pkgrel"
  1304.                 return 1
  1305.         fi
  1306.  
  1307.         local name
  1308.         for name in "${pkgname[@]}"; do
  1309.                 if [[ ${name:0:1} = "-" ]]; then
  1310.                         error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname"
  1311.                         return 1
  1312.                 fi
  1313.         done
  1314.  
  1315.         if [[ ${pkgbase:0:1} = "-" ]]; then
  1316.                 error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgbase"
  1317.                 return 1
  1318.         fi
  1319.         if [[ $pkgver != ${pkgver//-/} ]]; then
  1320.                 error "$(gettext "%s is not allowed to contain hyphens.")" "pkgver"
  1321.                 return 1
  1322.         fi
  1323.         if [[ $pkgrel != ${pkgrel//-/} ]]; then
  1324.                 error "$(gettext "%s is not allowed to contain hyphens.")" "pkgrel"
  1325.                 return 1
  1326.         fi
  1327.  
  1328.         if [[ $arch != 'any' ]]; then
  1329.                 if ! in_array $CARCH ${arch[@]}; then
  1330.                         if (( ! IGNOREARCH )); then
  1331.                                 error "$(gettext "%s is not available for the '%s' architecture.")" "$pkgbase" "$CARCH"
  1332.                                 plain "$(gettext "Note that many packages may need a line added to their %s")" "$BUILDSCRIPT"
  1333.                                 plain "$(gettext "such as arch=('%s').")" "$CARCH"
  1334.                                 return 1
  1335.                         fi
  1336.                 fi
  1337.         fi
  1338.  
  1339.         local provide
  1340.         for provide in ${provides[@]}; do
  1341.                 if [[ $provide != ${provide//</} || $provide != ${provide//>/} ]]; then
  1342.                         error "$(gettext "Provides array cannot contain comparison (< or >) operators.")"
  1343.                         return 1
  1344.                 fi
  1345.         done
  1346.  
  1347.         local file
  1348.         for file in "${backup[@]}"; do
  1349.                 if [[ ${file:0:1} = "/" ]]; then
  1350.                         error "$(gettext "Invalid backup entry : %s")" "$file"
  1351.                         return 1
  1352.                 fi
  1353.         done
  1354.  
  1355.         local optdepend
  1356.         for optdepend in "${optdepends[@]}"; do
  1357.                 pkg=${optdepend%%:*}
  1358.                 if [[ ! $pkg =~ ^[[:alnum:]\>\<\=\.\+\_\-]*$ ]]; then
  1359.                         error "$(gettext "Invalid syntax for optdepend : '%s'")" "$optdepend"
  1360.                 fi
  1361.         done
  1362.  
  1363.         if [[ $install && ! -f $install ]]; then
  1364.                 error "$(gettext "Install scriptlet (%s) does not exist.")" "$install"
  1365.                 return 1
  1366.         fi
  1367.  
  1368.         if [[ -n $changelog && ! -f $changelog ]]; then
  1369.                 error "$(gettext "Changelog file (%s) does not exist.")" "$changelog"
  1370.                 return 1
  1371.         fi
  1372.  
  1373.         local valid_options=1
  1374.         local opt known kopt
  1375.         for opt in ${options[@]}; do
  1376.                 known=0
  1377.                 # check if option matches a known option or its inverse
  1378.                 for kopt in ${packaging_options[@]} ${other_options[@]}; do
  1379.                         if [[ ${opt} = ${kopt} || ${opt} = "!${kopt}" ]]; then
  1380.                                 known=1
  1381.                         fi
  1382.                 done
  1383.                 if (( ! known )); then
  1384.                         error "$(gettext "options array contains unknown option '%s'")" "$opt"
  1385.                         valid_options=0
  1386.                 fi
  1387.         done
  1388.         if (( ! valid_options )); then
  1389.                 return 1
  1390.         fi
  1391.  
  1392.         if (( ${#pkgname[@]} > 1 )); then
  1393.                 for pkg in ${pkgname[@]}; do
  1394.                         if [ "$(type -t package_${pkg})" != "function" ]; then
  1395.                                 error "$(gettext "missing package function for split package '%s'")" "$pkg"
  1396.                                 return 1
  1397.                         fi
  1398.                 done
  1399.         fi
  1400.  
  1401.         if [[ -n "${PKGLIST[@]}" ]]; then
  1402.                 for pkg in ${PKGLIST[@]}; do
  1403.                         if ! in_array $pkg ${pkgname[@]}; then
  1404.                                 error "$(gettext "requested package %s is not provided in %s")" "$pkg" "$BUILDSCRIPT"
  1405.                                 return 1
  1406.                         fi
  1407.                 done
  1408.         fi
  1409.  
  1410.         return 0
  1411. }
  1412.  
  1413. devel_check() {
  1414.         newpkgver=""
  1415.  
  1416.         # Do not update pkgver if --holdver is set, when building a source package, repackaging,
  1417.         # reading PKGBUILD from pipe (-f), or if we cannot write to the file (-w)
  1418.         if (( HOLDVER || SOURCEONLY || REPKG )) \
  1419.                             || [[ ! -f $BUILDFILE || ! -w $BUILDFILE ]]; then
  1420.                 return
  1421.         fi
  1422.  
  1423.         if [[ -z $FORCE_VER ]]; then
  1424.                 # Check if this is a svn/cvs/etc PKGBUILD; set $newpkgver if so.
  1425.                 # This will only be used on the first call to makepkg; subsequent
  1426.                 # calls to makepkg via fakeroot will explicitly pass the version
  1427.                 # number to avoid having to determine the version number twice.
  1428.                 # Also do a brief check to make sure we have the VCS tool available.
  1429.                 oldpkgver=$pkgver
  1430.                 if [[ -n ${_darcstrunk} && -n ${_darcsmod} ]] ; then
  1431.                         [ $(type -p darcs) ] || return 0
  1432.                         msg "$(gettext "Determining latest darcs revision...")"
  1433.                         newpkgver=$(date +%Y%m%d)
  1434.                 elif [[ -n ${_cvsroot} && -n ${_cvsmod} ]] ; then
  1435.                         [ $(type -p cvs) ] || return 0
  1436.                         msg "$(gettext "Determining latest cvs revision...")"
  1437.                         newpkgver=$(date +%Y%m%d)
  1438.                 elif [[ -n ${_gitroot} && -n ${_gitname} ]] ; then
  1439.                         [ $(type -p git) ] || return 0
  1440.                         msg "$(gettext "Determining latest git revision...")"
  1441.                         newpkgver=$(date +%Y%m%d)
  1442.                 elif [[ -n ${_svntrunk} && -n ${_svnmod} ]] ; then
  1443.                         [ $(type -p svn) ] || return 0
  1444.                         msg "$(gettext "Determining latest svn revision...")"
  1445.                         newpkgver=$(LC_ALL=C svn info $_svntrunk | sed -n 's/^Last Changed Rev: \([0-9]*\)$/\1/p')
  1446.                 elif [[ -n ${_bzrtrunk} && -n ${_bzrmod} ]] ; then
  1447.                         [ $(type -p bzr) ] || return 0
  1448.                         msg "$(gettext "Determining latest bzr revision...")"
  1449.                         newpkgver=$(bzr revno ${_bzrtrunk})
  1450.                 elif [[ -n ${_hgroot} && -n ${_hgrepo} ]] ; then
  1451.                         [ $(type -p hg) ] || return 0
  1452.                         msg "$(gettext "Determining latest hg revision...")"
  1453.                         if [[ -d ./src/$_hgrepo ]] ; then
  1454.                                 cd ./src/$_hgrepo
  1455.                                 hg pull
  1456.                                 hg update
  1457.                         else
  1458.                                 [[ ! -d ./src/ ]] && mkdir ./src/
  1459.                                 hg clone $_hgroot/$_hgrepo ./src/$_hgrepo
  1460.                                 cd ./src/$_hgrepo
  1461.                         fi
  1462.                         newpkgver=$(hg tip --template "{rev}")
  1463.                         cd ../../
  1464.                 fi
  1465.  
  1466.                 if [[ -n $newpkgver ]]; then
  1467.                         msg2 "$(gettext "Version found: %s")" "$newpkgver"
  1468.                 fi
  1469.  
  1470.         else
  1471.                 # Version number retrieved from fakeroot->makepkg argument
  1472.                 newpkgver=$FORCE_VER
  1473.         fi
  1474. }
  1475.  
  1476. devel_update() {
  1477.         # This is lame, but if we're wanting to use an updated pkgver for
  1478.         # retrieving svn/cvs/etc sources, we'll update the PKGBUILD with
  1479.         # the new pkgver and then re-source it. This is the most robust
  1480.         # method for dealing with PKGBUILDs that use, e.g.:
  1481.         #
  1482.         #  pkgver=23
  1483.         #  ...
  1484.         #  _foo=pkgver
  1485.         #
  1486.         if [[ -n $newpkgver ]]; then
  1487.                 if [[ $newpkgver != $pkgver ]]; then
  1488.                         if [[ -f $BUILDFILE && -w $BUILDFILE ]]; then
  1489.                                 sed -i "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "$BUILDFILE"
  1490.                                 sed -i "s/^pkgrel=[^ ]*/pkgrel=1/" "$BUILDFILE"
  1491.                                 source "$BUILDFILE"
  1492.                         fi
  1493.                 fi
  1494.         fi
  1495. }
  1496.  
  1497. backup_package_variables() {
  1498.         for var in ${splitpkg_overrides[@]}; do
  1499.                 indirect="${var}_backup"
  1500.                 eval "${indirect}=(\"\${$var[@]}\")"
  1501.         done
  1502. }
  1503.  
  1504. restore_package_variables() {
  1505.         for var in ${splitpkg_overrides[@]}; do
  1506.                 indirect="${var}_backup"
  1507.                 if [[ -n ${!indirect} ]]; then
  1508.                         eval "${var}=(\"\${$indirect[@]}\")"
  1509.                 else
  1510.                         unset ${var}
  1511.                 fi
  1512.         done
  1513. }
  1514.  
  1515. # getopt like parser
  1516. parse_options() {
  1517.         local short_options=$1; shift;
  1518.         local long_options=$1; shift;
  1519.         local ret=0;
  1520.         local unused_options=""
  1521.  
  1522.         while [[ -n $1 ]]; do
  1523.                 if [[ ${1:0:2} = '--' ]]; then
  1524.                         if [[ -n ${1:2} ]]; then
  1525.                                 local match=""
  1526.                                 for i in ${long_options//,/ }; do
  1527.                                         if [[ ${1:2} = ${i//:} ]]; then
  1528.                                                 match=$i
  1529.                                                 break
  1530.                                         fi
  1531.                                 done
  1532.                                 if [[ -n $match ]]; then
  1533.                                         if [[ ${1:2} = $match ]]; then
  1534.                                                 printf ' %s' "$1"
  1535.                                         else
  1536.                                                 if [[ -n $2 ]]; then
  1537.                                                         printf ' %s' "$1"
  1538.                                                         shift
  1539.                                                         printf " '%s'" "$1"
  1540.                                                 else
  1541.                                                         echo "makepkg: option '$1' $(gettext "requires an argument")" >&2
  1542.                                                         ret=1
  1543.                                                 fi
  1544.                                         fi
  1545.                                 else
  1546.                                         echo "makepkg: $(gettext "unrecognized option") '$1'" >&2
  1547.                                         ret=1
  1548.                                 fi
  1549.                         else
  1550.                                 shift
  1551.                                 break
  1552.                         fi
  1553.                 elif [[ ${1:0:1} = '-' ]]; then
  1554.                         for ((i=1; i<${#1}; i++)); do
  1555.                                 if [[ $short_options =~ ${1:i:1} ]]; then
  1556.                                         if [[ $short_options =~ "${1:i:1}:" ]]; then
  1557.                                                 if [[ -n ${1:$i+1} ]]; then
  1558.                                                         printf ' -%s' "${1:i:1}"
  1559.                                                         printf " '%s'" "${1:$i+1}"
  1560.                                                 else
  1561.                                                         if [[ -n $2 ]]; then
  1562.                                                                 printf ' -%s' "${1:i:1}"
  1563.                                                                 shift
  1564.                                                                 printf " '%s'" "${1}"
  1565.                                                         else
  1566.                                                                 echo "makepkg: option $(gettext "requires an argument") -- '${1:i:1}'" >&2
  1567.                                                                 ret=1
  1568.                                                         fi
  1569.                                                 fi
  1570.                                                 break
  1571.                                         else
  1572.                                                 printf ' -%s' "${1:i:1}"
  1573.                                         fi
  1574.                                 else
  1575.                                         echo "makepkg: $(gettext "invalid option") -- '${1:i:1}'" >&2
  1576.                                         ret=1
  1577.                                 fi
  1578.                         done
  1579.                 else
  1580.                         unused_options="${unused_options} '$1'"
  1581.                 fi
  1582.                 shift
  1583.         done
  1584.  
  1585.         printf " --"
  1586.         if [[ -n $unused_options ]]; then
  1587.                 for i in ${unused_options[@]}; do
  1588.                         printf ' %s' "$i"
  1589.                 done
  1590.         fi
  1591.         if [[ -n $1 ]]; then
  1592.                 while [[ -n $1 ]]; do
  1593.                         printf " '%s'" "${1}"
  1594.                         shift
  1595.                 done
  1596.         fi
  1597.         printf "\n"
  1598.  
  1599.         return $ret
  1600. }
  1601.  
  1602. usage() {
  1603.         printf "makepkg (pacman) %s\n" "$myver"
  1604.         echo
  1605.         printf "$(gettext "Usage: %s [options]")\n" "$0"
  1606.         echo
  1607.         echo "$(gettext "Options:")"
  1608.         printf "$(gettext "  -A, --ignorearch Ignore incomplete arch field in %s")\n" "$BUILDSCRIPT"
  1609.         echo "$(gettext "  -c, --clean      Clean up work files after build")"
  1610.         echo "$(gettext "  -C, --cleancache Clean up source files from the cache")"
  1611.         echo "$(gettext "  -d, --nodeps     Skip all dependency checks")"
  1612.         echo "$(gettext "  -e, --noextract  Do not extract source files (use existing src/ dir)")"
  1613.         echo "$(gettext "  -f, --force      Overwrite existing package")"
  1614.         echo "$(gettext "  -g, --geninteg   Generate integrity checks for source files")"
  1615.         echo "$(gettext "  -h, --help       This help")"
  1616.         echo "$(gettext "  -i, --install    Install package after successful build")"
  1617.         echo "$(gettext "  -L, --log        Log package build process")"
  1618.         echo "$(gettext "  -m, --nocolor    Disable colorized output messages")"
  1619.         echo "$(gettext "  -o, --nobuild    Download and extract files only")"
  1620.         printf "$(gettext "  -p <file>        Use an alternate build script (instead of '%s')")\n" "$BUILDSCRIPT"
  1621.         echo "$(gettext "  -P <format>     Specify the format of your package (pacman|deb) defaults to pacman")"
  1622.         echo "$(gettext "  -r, --rmdeps     Remove installed dependencies after a successful build")"
  1623.         echo "$(gettext "  -R, --repackage  Repackage contents of the package without rebuilding")"
  1624.         echo "$(gettext "  -s, --syncdeps   Install missing dependencies with pacman")"
  1625.         echo "$(gettext "  --allsource      Generate a source-only tarball including downloaded sources")"
  1626.         echo "$(gettext "  --asroot         Allow makepkg to run as root user")"
  1627.         printf "$(gettext "  --config <file>  Use an alternate config file (instead of '%s')")\n" "$confdir/makepkg.conf"
  1628.         echo "$(gettext "  --holdver        Prevent automatic version bumping for development PKGBUILDs")"
  1629.         echo "$(gettext "  --pkg <list>     Only build listed packages from a split package")"
  1630.         echo "$(gettext "  --skipinteg      Do not fail when integrity checks are missing")"
  1631.         echo "$(gettext "  --source         Generate a source-only tarball without downloaded sources")"
  1632.         echo
  1633.         echo "$(gettext "These options can be passed to pacman:")"
  1634.         echo
  1635.         echo "$(gettext "  --noconfirm      Do not ask for confirmation when resolving dependencies")"
  1636.         echo "$(gettext "  --noprogressbar  Do not show a progress bar when downloading files")"
  1637.         echo
  1638.         printf "$(gettext "If -p is not specified, makepkg will look for '%s'")\n" "$BUILDSCRIPT"
  1639.         echo
  1640. }
  1641.  
  1642. version() {
  1643.         printf "makepkg (pacman) %s\n" "$myver"
  1644.         printf "$(gettext "\
  1645. Copyright (c) 2006-2009 Pacman Development Team <pacman-dev@archlinux.org>.\n\
  1646. Copyright (C) 2002-2006 Judd Vinet <jvinet@zeroflux.org>.\n\n\
  1647. This is free software; see the source for copying conditions.\n\
  1648. There is NO WARRANTY, to the extent permitted by law.\n")"
  1649. }
  1650.  
  1651. # PROGRAM START
  1652.  
  1653. # determine whether we have gettext; make it a no-op if we do not
  1654. if [ ! $(type -t gettext) ]; then
  1655.         gettext() {
  1656.                 echo "$@"
  1657.         }
  1658. fi
  1659.  
  1660. ARGLIST=("$@")
  1661.  
  1662. # Parse Command Line Options.
  1663. OPT_SHORT="AcCdefFghiLmop:P:rRsV"
  1664. OPT_LONG="allsource,asroot,ignorearch,clean,cleancache,nodeps"
  1665. OPT_LONG="$OPT_LONG,noextract,force,forcever:,geninteg,help,holdver"
  1666. OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,pkg:,rmdeps,repackage,skipinteg"
  1667. OPT_LONG="$OPT_LONG,source,syncdeps,version,config:"
  1668. # Pacman Options
  1669. OPT_LONG="$OPT_LONG,noconfirm,noprogressbar"
  1670. OPT_TEMP="$(parse_options $OPT_SHORT $OPT_LONG "$@" || echo 'PARSE_OPTIONS FAILED')"
  1671. if echo "$OPT_TEMP" | grep -q 'PARSE_OPTIONS FAILED'; then
  1672.         # This is a small hack to stop the script bailing with 'set -e'
  1673.         echo; usage; exit 1 # E_INVALID_OPTION;
  1674. fi
  1675. eval set -- "$OPT_TEMP"
  1676. unset OPT_SHORT OPT_LONG OPT_TEMP
  1677.  
  1678. # default config is makepkg.conf
  1679. MAKEPKG_CONF=${MAKEPKG_CONF:-$confdir/makepkg.conf}
  1680.  
  1681. # Source the config file; fail if it is not found
  1682. if [[ -r $MAKEPKG_CONF ]]; then
  1683.         source "$MAKEPKG_CONF"
  1684. else
  1685.         error "$(gettext "%s not found.")" "$MAKEPKG_CONF"
  1686.         plain "$(gettext "Aborting...")"
  1687.         exit 1 # $E_CONFIG_ERROR
  1688. fi
  1689.  
  1690. # Source user-specific makepkg.conf overrides
  1691. if [[ -r ~/.makepkg.conf ]]; then
  1692.         source ~/.makepkg.conf
  1693. fi
  1694.  
  1695. while true; do
  1696.         case "$1" in
  1697.                 # Pacman Options
  1698.                 --noconfirm)      PACMAN_OPTS="$PACMAN_OPTS --noconfirm" ;;
  1699.                 --noprogressbar)  PACMAN_OPTS="$PACMAN_OPTS --noprogressbar" ;;
  1700.  
  1701.                 # Makepkg Options
  1702.                 --allsource)      SOURCEONLY=2 ;;
  1703.                 --asroot)         ASROOT=1 ;;
  1704.                 -A|--ignorearch)  IGNOREARCH=1 ;;
  1705.                 -c|--clean)       CLEANUP=1 ;;
  1706.                 -C|--cleancache)  CLEANCACHE=1 ;;
  1707.                 --config)         shift; MAKEPKG_CONF=$1 ;;
  1708.                 -d|--nodeps)      NODEPS=1 ;;
  1709.                 -e|--noextract)   NOEXTRACT=1 ;;
  1710.                 -f|--force)       FORCE=1 ;;
  1711.                 #hidden opt used by fakeroot call for svn/cvs/etc PKGBUILDs to set pkgver
  1712.                 --forcever)       shift; FORCE_VER=$1;;
  1713.                 -F)               INFAKEROOT=1 ;;
  1714.                 -g|--geninteg)    GENINTEG=1 ;;
  1715.                 --holdver)        HOLDVER=1 ;;
  1716.                 -i|--install)     INSTALL=1 ;;
  1717.                 -L|--log)         LOGGING=1 ;;
  1718.                 -m|--nocolor)     USE_COLOR='n' ;;
  1719.                 -o|--nobuild)     NOBUILD=1 ;;
  1720.                 -p)               shift; BUILDFILE=$1 ;;
  1721.                 -P)               shift; PKGEXT=".$1";;
  1722.                 --pkg)            shift; PKGLIST=$1 ;;
  1723.                 -r|--rmdeps)      RMDEPS=1 ;;
  1724.                 -R|--repackage)   REPKG=1 ;;
  1725.                 --skipinteg)      SKIPINTEG=1 ;;
  1726.                 --source)         SOURCEONLY=1 ;;
  1727.                 -s|--syncdeps)    DEP_BIN=1 ;;
  1728.  
  1729.                 -h|--help)        usage; exit 0 ;; # E_OK
  1730.                 -V|--version)     version; exit 0 ;; # E_OK
  1731.  
  1732.                 --)               OPT_IND=0; shift; break;;
  1733.                 *)                usage; exit 1 ;; # E_INVALID_OPTION
  1734.         esac
  1735.         shift
  1736. done
  1737.  
  1738. #preserve environment variables
  1739. _PKGDEST=${PKGDEST}
  1740. _SRCDEST=${SRCDEST}
  1741. _SRCPKGDEST=${SRCPKGDEST}
  1742.  
  1743. # set pacman command if not already defined
  1744. PACMAN=${PACMAN:-pacman}
  1745.  
  1746. # check if messages are to be printed using color
  1747. unset ALL_OFF BOLD BLUE GREEN RED YELLOW
  1748. if [[ -t 2 && ! $USE_COLOR = "n" && $(check_buildenv color) = "y" ]]; then
  1749.         ALL_OFF="$(tput sgr0)"
  1750.         BOLD="$(tput bold)"
  1751.         BLUE="${BOLD}$(tput setaf 4)"
  1752.         GREEN="${BOLD}$(tput setaf 2)"
  1753.         RED="${BOLD}$(tput setaf 1)"
  1754.         YELLOW="${BOLD}$(tput setaf 3)"
  1755. fi
  1756. readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
  1757.  
  1758. # override settings with an environment variable for batch processing
  1759. PKGDEST=${_PKGDEST:-$PKGDEST}
  1760. PKGDEST=${PKGDEST:-$startdir} #default to $startdir if undefined
  1761. SRCDEST=${_SRCDEST:-$SRCDEST}
  1762. SRCDEST=${SRCDEST:-$startdir} #default to $startdir if undefined
  1763. SRCPKGDEST=${_SRCPKGDEST:-$SRCPKGDEST}
  1764. SRCPKGDEST=${SRCPKGDEST:-$PKGDEST} #default to $PKGDEST if undefined
  1765.  
  1766.  
  1767. if (( HOLDVER )) && [[ -n $FORCE_VER ]]; then
  1768.         # The '\\0' is here to prevent gettext from thinking --holdver is an option
  1769.         error "$(gettext "\\0--holdver and --forcever cannot both be specified" )"
  1770.         exit 1
  1771. fi
  1772.  
  1773. if (( CLEANCACHE )); then
  1774.         #fix flyspray feature request #5223
  1775.         if [[ -n $SRCDEST && $SRCDEST != $startdir ]]; then
  1776.                 msg "$(gettext "Cleaning up ALL files from %s.")" "$SRCDEST"
  1777.                 echo -n "$(gettext "    Are you sure you wish to do this? ")"
  1778.                 echo -n "$(gettext "[y/N]")"
  1779.                 read answer
  1780.                 answer="${answer^^}"
  1781.                 if [[ $answer = $(gettext YES) || $answer = $(gettext Y) ]]; then
  1782.                         rm "$SRCDEST"/*
  1783.                         if (( $? )); then
  1784.                                 error "$(gettext "Problem removing files; you may not have correct permissions in %s")" "$SRCDEST"
  1785.                                 exit 1
  1786.                         else
  1787.                                 # removal worked
  1788.                                 msg "$(gettext "Source cache cleaned.")"
  1789.                                 exit 0
  1790.                         fi
  1791.                 else
  1792.                         # answer = no
  1793.                         msg "$(gettext "No files have been removed.")"
  1794.                         exit 0
  1795.                 fi
  1796.         else
  1797.                 # $SRCDEST is $startdir, two possibilities
  1798.                 error "$(gettext "Source destination must be defined in %s.")" "$MAKEPKG_CONF"
  1799.                 plain "$(gettext "In addition, please run makepkg -C outside of your cache directory.")"
  1800.                 exit 1
  1801.         fi
  1802. fi
  1803.  
  1804. if (( ! INFAKEROOT )); then
  1805.         if (( EUID == 0 && ! ASROOT )); then
  1806.                 # Warn those who like to live dangerously.
  1807.                 error "$(gettext "Running makepkg as root is a BAD idea and can cause")"
  1808.                 plain "$(gettext "permanent, catastrophic damage to your system. If you")"
  1809.                 plain "$(gettext "wish to run as root, please use the --asroot option.")"
  1810.                 exit 1 # $E_USER_ABORT
  1811.         elif (( EUID > 0 && ASROOT )); then
  1812.                 # Warn those who try to use the --asroot option when they are not root
  1813.                 error "$(gettext "The --asroot option is meant for the root user only.")"
  1814.                 plain "$(gettext "Please rerun makepkg without the --asroot flag.")"
  1815.                 exit 1 # $E_USER_ABORT
  1816.         elif [[ $(check_buildenv fakeroot) = "y" ]] && (( EUID > 0 )); then
  1817.                 if [ ! $(type -p fakeroot) ]; then
  1818.                         error "$(gettext "Fakeroot must be installed if using the 'fakeroot' option")"
  1819.                         plain "$(gettext "in the BUILDENV array in %s.")" "$MAKEPKG_CONF"
  1820.                         exit 1
  1821.                 fi
  1822.         elif (( EUID > 0 )); then
  1823.                 warning "$(gettext "Running makepkg as an unprivileged user will result in non-root")"
  1824.                 plain "$(gettext "ownership of the packaged files. Try using the fakeroot environment by")"
  1825.                 plain "$(gettext "placing 'fakeroot' in the BUILDENV array in %s.")" "$MAKEPKG_CONF"
  1826.                 sleep 1
  1827.         fi
  1828. else
  1829.         if [[ -z $FAKEROOTKEY ]]; then
  1830.                 error "$(gettext "Do not use the '-F' option. This option is only for use by makepkg.")"
  1831.                 exit 1 # TODO: error code
  1832.         fi
  1833. fi
  1834.  
  1835. # check for sudo if we will need it during makepkg execution
  1836. if (( ! ASROOT && ( DEP_BIN || RMDEPS || INSTALL ) )); then
  1837.         if [ ! "$(type -p sudo)" ]; then
  1838.                 error "$(gettext "Cannot find the sudo binary! Is sudo installed?")"
  1839.                 plain "$(gettext "Missing dependencies cannot be installed or removed as a normal user")"
  1840.                 plain "$(gettext "without sudo; install and configure sudo to auto-resolve dependencies.")"
  1841.                 exit 1
  1842.         fi
  1843. fi
  1844.  
  1845. unset pkgname pkgbase pkgver pkgrel pkgdesc url license groups provides
  1846. unset md5sums replaces depends conflicts backup source install changelog build
  1847. unset makedepends optdepends options noextract
  1848.  
  1849. BUILDFILE=${BUILDFILE:-$BUILDSCRIPT}
  1850. if [[ ! -f $BUILDFILE ]]; then
  1851.         if [[ -t 0 ]]; then
  1852.                 error "$(gettext "%s does not exist.")" "$BUILDFILE"
  1853.                 exit 1
  1854.         else
  1855.                 # PKGBUILD passed through a pipe
  1856.                 BUILDFILE=/dev/stdin
  1857.                 source "$BUILDFILE"
  1858.         fi
  1859. else
  1860.         crlftest=$(file "$BUILDFILE" | grep -F 'CRLF' || true)
  1861.         if [[ -n $crlftest ]]; then
  1862.                 error "$(gettext "%s contains CRLF characters and cannot be sourced.")" "$BUILDFILE"
  1863.                 exit 1
  1864.         fi
  1865.  
  1866.         if [[ ${BUILDFILE:0:1} != "/" ]]; then
  1867.                 BUILDFILE="$startdir/$BUILDFILE"
  1868.         fi
  1869.         source "$BUILDFILE"
  1870. fi
  1871.  
  1872. if (( GENINTEG )); then
  1873.         mkdir -p "$srcdir"
  1874.         cd "$srcdir"
  1875.         download_sources
  1876.         generate_checksums
  1877.         exit 0 # $E_OK
  1878. fi
  1879.  
  1880. # check the PKGBUILD for some basic requirements
  1881. check_sanity || exit 1
  1882.  
  1883. # We need to run devel_update regardless of whether we are in the fakeroot
  1884. # build process so that if the user runs makepkg --forcever manually, we
  1885. # 1) output the correct pkgver, and 2) use the correct filename when
  1886. # checking if the package file already exists - fixes FS #9194
  1887. devel_check
  1888. devel_update
  1889.  
  1890. if (( ${#pkgname[@]} > 1 )); then
  1891.         SPLITPKG=1
  1892. fi
  1893.  
  1894. # test for available PKGBUILD functions
  1895. # The exclamation mark is required here to avoid triggering the ERR trap when
  1896. # a tested function does not exist.
  1897. if [[ $(! type -t build) = "function" ]]; then
  1898.         BUILDFUNC=1
  1899. fi
  1900. if [ "$(type -t package)" = "function" ]; then
  1901.         PKGFUNC=1
  1902. elif [ $SPLITPKG -eq 0 -a "$(type -t package_${pkgname})" = "function" ]; then
  1903.         SPLITPKG=1
  1904. fi
  1905.  
  1906. pkgbase=${pkgbase:-${pkgname[0]}}
  1907.  
  1908. if [[ -n "${PKGLIST[@]}" ]]; then
  1909.         unset pkgname
  1910.         pkgname="${PKGLIST[@]}"
  1911. fi
  1912.  
  1913. if (( ! SPLITPKG )); then
  1914.         if [[ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} \
  1915.              || -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-any${PKGEXT} ]] \
  1916.                          && ! (( FORCE || SOURCEONLY || NOBUILD )); then
  1917.                 if (( INSTALL )); then
  1918.                         warning "$(gettext "A package has already been built, installing existing package...")"
  1919.                         install_package
  1920.                         exit $?
  1921.                 else
  1922.                         error "$(gettext "A package has already been built. (use -f to overwrite)")"
  1923.                         exit 1
  1924.                 fi
  1925.         fi
  1926. else
  1927.         allpkgbuilt=1
  1928.         somepkgbuilt=0
  1929.         for pkg in ${pkgname[@]}; do
  1930.                 if [[ -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} \
  1931.                      || -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT} ]]; then
  1932.                         somepkgbuilt=1
  1933.                 else
  1934.                         allpkgbuilt=0
  1935.                 fi
  1936.         done
  1937.         if ! (( FORCE || SOURCEONLY || NOBUILD )); then
  1938.                 if (( allpkgbuilt )); then
  1939.                         if (( INSTALL )); then
  1940.                                 warning "$(gettext "The package group has already been built, installing existing packages...")"
  1941.                                 install_package
  1942.                                 exit $?
  1943.                         else
  1944.                                 error "$(gettext "The package group has already been built. (use -f to overwrite)")"
  1945.                                 exit 1
  1946.                         fi
  1947.                 fi
  1948.                 if (( somepkgbuilt )); then
  1949.                         error "$(gettext "Part of the package group has already been built. (use -f to overwrite)")"
  1950.                         exit 1
  1951.                 fi
  1952.         fi
  1953.         unset allpkgbuilt somepkgbuilt
  1954. fi
  1955.  
  1956. # Run the bare minimum in fakeroot
  1957. if (( INFAKEROOT )); then
  1958.         if (( ! SPLITPKG )); then
  1959.                 if (( ! PKGFUNC )); then
  1960.                         if (( BUILDFUNC && ! REPKG )); then
  1961.                                 run_build
  1962.                                 tidy_install
  1963.                         fi
  1964.                 else
  1965.                         run_package
  1966.                         tidy_install
  1967.                 fi
  1968.                 create_package
  1969.         else
  1970.                 for pkg in ${pkgname[@]}; do
  1971.                         pkgdir="$pkgdir/$pkg"
  1972.                         mkdir -p "$pkgdir"
  1973.                         backup_package_variables
  1974.                         run_package $pkg
  1975.                         tidy_install
  1976.                         create_package $pkg
  1977.                         restore_package_variables
  1978.                         pkgdir="${pkgdir%/*}"
  1979.                 done
  1980.         fi
  1981.  
  1982.         msg "$(gettext "Leaving fakeroot environment.")"
  1983.         exit 0 # $E_OK
  1984. fi
  1985.  
  1986. msg "$(gettext "Making package: %s")" "$pkgbase $pkgver-$pkgrel ($(date))"
  1987.  
  1988. # if we are creating a source-only package, go no further
  1989. if (( SOURCEONLY )); then
  1990.         if [[ -f $SRCPKGDEST/${pkgbase}-${pkgver}-${pkgrel}${SRCEXT} ]] \
  1991.              && (( ! FORCE )); then
  1992.                 error "$(gettext "A source package has already been built. (use -f to overwrite)")"
  1993.                 exit 1
  1994.         fi
  1995.         create_srcpackage
  1996.         msg "$(gettext "Source package created: %s")" "$pkgbase ($(date))"
  1997.         exit 0
  1998. fi
  1999.  
  2000. # fix flyspray bug #5973
  2001. if (( NODEPS || NOBUILD || REPKG )); then
  2002.         # no warning message needed for nobuild, repkg
  2003.         if (( NODEPS )); then
  2004.                 warning "$(gettext "Skipping dependency checks.")"
  2005.         fi
  2006. elif [ $(type -p "${PACMAN%% *}") ]; then
  2007.         unset pkgdeps # Set by resolve_deps() and used by remove_deps()
  2008.         deperr=0
  2009.  
  2010.         msg "$(gettext "Checking Runtime Dependencies...")"
  2011.         resolve_deps ${depends[@]} || deperr=1
  2012.  
  2013.         msg "$(gettext "Checking Buildtime Dependencies...")"
  2014.         resolve_deps ${makedepends[@]} || deperr=1
  2015.  
  2016.         if (( deperr )); then
  2017.                 error "$(gettext "Could not resolve all dependencies.")"
  2018.                 exit 1
  2019.         fi
  2020. else
  2021.         warning "$(gettext "%s was not found in PATH; skipping dependency checks.")" "${PACMAN%% *}"
  2022. fi
  2023.  
  2024. # ensure we have a sane umask set
  2025. umask 0022
  2026.  
  2027. # get back to our src directory so we can begin with sources
  2028. mkdir -p "$srcdir"
  2029. cd "$srcdir"
  2030.  
  2031. if (( NOEXTRACT )); then
  2032.         warning "$(gettext "Skipping source retrieval        -- using existing src/ tree")"
  2033.         warning "$(gettext "Skipping source integrity checks -- using existing src/ tree")"
  2034.         warning "$(gettext "Skipping source extraction       -- using existing src/ tree")"
  2035.  
  2036.         if (( NOEXTRACT )) && [[ -z $(ls "$srcdir" 2>/dev/null) ]]; then
  2037.                 error "$(gettext "The source directory is empty, there is nothing to build!")"
  2038.                 plain "$(gettext "Aborting...")"
  2039.                 exit 1
  2040.         fi
  2041. elif (( REPKG )); then
  2042.         if (( ! PKGFUNC && ! SPLITPKG )) \
  2043.              && [[ ! -d $pkgdir || -z $(ls "$pkgdir" 2>/dev/null) ]]; then
  2044.                 error "$(gettext "The package directory is empty, there is nothing to repackage!")"
  2045.                 plain "$(gettext "Aborting...")"
  2046.                 exit 1
  2047.         fi
  2048. else
  2049.         download_sources
  2050.         check_checksums
  2051.         extract_sources
  2052. fi
  2053.  
  2054. if (( NOBUILD )); then
  2055.         msg "$(gettext "Sources are ready.")"
  2056.         exit 0 #E_OK
  2057. else
  2058.         # check for existing pkg directory; don't remove if we are repackaging
  2059.         if [[ -d $pkgdir ]] && (( ! REPKG || PKGFUNC || SPLITPKG )); then
  2060.                 msg "$(gettext "Removing existing pkg/ directory...")"
  2061.                 rm -rf "$pkgdir"
  2062.         fi
  2063.         mkdir -p "$pkgdir"
  2064.         cd "$startdir"
  2065.  
  2066.         # if we are root or if fakeroot is not enabled, then we don't use it
  2067.         if [[ $(check_buildenv fakeroot) != "y" ]] || (( EUID == 0 )); then
  2068.                 if (( ! REPKG )); then
  2069.                         devel_update
  2070.                         (( BUILDFUNC )) && run_build
  2071.                 fi
  2072.                 if (( ! SPLITPKG )); then
  2073.                         if (( PKGFUNC )); then
  2074.                                 run_package
  2075.                                 tidy_install
  2076.                         elif (( ! REPKG )); then
  2077.                                 tidy_install
  2078.                         fi
  2079.                         create_package
  2080.                 else
  2081.                         for pkg in ${pkgname[@]}; do
  2082.                                 pkgdir="$pkgdir/$pkg"
  2083.                                 mkdir -p "$pkgdir"
  2084.                                 backup_package_variables
  2085.                                 run_package $pkg
  2086.                                 tidy_install
  2087.                                 create_package $pkg
  2088.                                 restore_package_variables
  2089.                                 pkgdir="${pkgdir%/*}"
  2090.                         done
  2091.                 fi
  2092.         else
  2093.                 if (( ! REPKG && ( PKGFUNC || SPLITPKG ) )); then
  2094.                         devel_update
  2095.                         (( BUILDFUNC )) && run_build
  2096.                         cd "$startdir"
  2097.                 fi
  2098.  
  2099.                 msg "$(gettext "Entering fakeroot environment...")"
  2100.  
  2101.                 if [[ -n $newpkgver ]]; then
  2102.                         fakeroot -- $0 --forcever $newpkgver -F "${ARGLIST[@]}" || exit $?
  2103.                 else
  2104.                         fakeroot -- $0 -F "${ARGLIST[@]}" || exit $?
  2105.                 fi
  2106.         fi
  2107. fi
  2108.  
  2109. msg "$(gettext "Finished making: %s")" "$pkgbase $pkgver-$pkgrel ($(date))"
  2110.  
  2111. install_package
  2112.  
  2113. exit 0 #E_OK
  2114.  
  2115. # vim: set ts=2 sw=2 noet: