Advertisement
Guest User

Untitled

a guest
Aug 10th, 2010
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 56.59 KB | None | 0 0
  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:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement