3 # makepkg - make packages compatible for use with pacman
6 # Copyright (c) 2006-2011 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>
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.
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.
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/>.
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 # awk, bsdtar (libarchive), bzip2, coreutils, fakeroot, file, find (findutils),
31 # gettext, grep, gzip, openssl, sed, tput (ncurses), xz
33 # gettext initialization
34 export TEXTDOMAIN
='pacman'
35 export TEXTDOMAINDIR
='@localedir@'
37 # file -i does not work on Mac OSX unless legacy mode is set
38 export COMMAND_MODE
='legacy'
40 myver
='@PACKAGE_VERSION@'
41 confdir
='@sysconfdir@'
42 BUILDSCRIPT
='@BUILDSCRIPT@'
44 srcdir
="$startdir/src"
45 pkgdir
="$startdir/pkg"
47 packaging_options
=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'purge')
48 other_options
=('ccache' 'distcc' 'buildflags' 'makeflags')
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
79 # Forces the pkgver of the current PKGBUILD. Used by the fakeroot call
80 # when dealing with svn/cvs/etc PKGBUILDs.
89 printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
94 printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
99 printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
104 printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
109 printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
114 # Special exit call for traps, Don't print any error messages when inside,
115 # the fakeroot call, the error message will be printed by the main call.
118 if (( ! INFAKEROOT
)); then
122 [[ -n $srclinks ]] && rm -rf "$srclinks"
128 # Clean up function. Called automatically when the script exits.
133 if (( INFAKEROOT
)); then
134 # Don't clean up when leaving fakeroot, we're not done yet.
138 if (( ! EXIT_CODE
&& CLEANUP
)); then
141 # If it's a clean exit and -c/--clean has been passed...
142 msg
"$(gettext "Cleaning up...
")"
143 rm -rf "$pkgdir" "$srcdir"
144 if [[ -n $pkgbase ]]; then
145 # TODO: this wasn't properly fixed in commit 2020e629
146 local fullver
=$
(get_full_version
$epoch $pkgver $pkgrel)
147 # Can't do this unless the BUILDSCRIPT has been sourced.
148 if (( BUILDFUNC
)); then
149 rm -f "${pkgbase}-${fullver}-${CARCH}-build.log"*
151 if (( CHECKFUNC
)); then
152 rm -f "${pkgbase}-${fullver}-${CARCH}-check.log"*
154 if (( PKGFUNC
)); then
155 rm -f "${pkgbase}-${fullver}-${CARCH}-package.log"*
156 elif (( SPLITPKG
)); then
157 for pkg
in ${pkgname[@]}; do
158 rm -f "${pkgbase}-${fullver}-${CARCH}-package_${pkg}.log"*
162 # clean up dangling symlinks to packages
163 for pkg
in ${pkgname[@]}; do
164 for file in ${pkg}-*-*-${CARCH}{${PKGEXT},${SRCEXT}}; do
165 if [[ -h $file && ! -e $file ]]; then
182 trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
183 trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
184 trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR
186 # a source entry can have two forms :
187 # 1) "filename::http://path/to/file"
188 # 2) "http://path/to/file"
190 # Return the absolute filename of a source entry
192 # This function accepts a source entry or the already extracted filename of a
193 # source entry as input
195 local file="$(get_filename "$1")"
197 if [[ -f "$startdir/$file" ]]; then
198 file="$startdir/$file"
199 elif [[ -f "$SRCDEST/$file" ]]; then
200 file="$SRCDEST/$file"
208 # Print 'source not found' error message and exit makepkg
209 missing_source_file
() {
210 error
"$(gettext "Unable to
find source file %s.
")" "$(get_filename "$1")"
211 plain
"$(gettext "Aborting...
")"
212 exit 1 # $E_MISSING_FILE
215 # extract the filename from a source entry
217 # if a filename is specified, use it
218 local filename
="${1%%::*}"
219 # if it is just an URL, we only keep the last component
220 echo "${filename##*/}"
223 # extract the URL from a source entry
225 # strip an eventual filename
230 # usage : get_full_version( $epoch, $pkgver, $pkgrel )
231 # return : full version spec, including epoch (if necessary), pkgver, pkgrel
234 if [[ $1 -eq 0 ]]; then
235 # zero epoch case, don't include it in version
243 # Checks to see if options are present in makepkg.conf or PKGBUILD;
244 # PKGBUILD options always take precedence.
246 # usage : check_option( $option )
247 # return : y - enabled
252 local ret
=$
(in_opt_array
"$1" ${options[@]})
253 if [[ $ret != '?' ]]; then
258 # fall back to makepkg.conf options
259 ret
=$
(in_opt_array
"$1" ${OPTIONS[@]})
260 if [[ $ret != '?' ]]; then
270 # Check if option is present in BUILDENV
272 # usage : check_buildenv( $option )
273 # return : y - enabled
278 echo $
(in_opt_array
"$1" ${BUILDENV[@]})
283 # usage : in_opt_array( $needle, $haystack )
284 # return : y - enabled
289 local needle
=$
(tr '[:upper:]' '[:lower:]' <<< $1); shift
293 opt
=$
(tr '[:upper:]' '[:lower:]' <<< $opt)
294 if [[ $opt = $needle ]]; then
297 elif [[ $opt = "!$needle" ]]; then
308 # usage : in_array( $needle, $haystack )
313 local needle
=$1; shift
314 [[ -z $1 ]] && return 1 # Not Found
317 [[ $item = $needle ]] && return 0 # Found
322 get_downloadclient
() {
323 # $1 = URL with valid protocol prefix
325 local proto
="${url%%://*}"
327 # loop through DOWNLOAD_AGENTS variable looking for protocol
329 for i
in "${DLAGENTS[@]}"; do
330 local handler
="${i%%::*}"
331 if [[ $proto = $handler ]]; then
332 local agent
="${i##*::}"
337 # if we didn't find an agent, return an error
338 if [[ -z $agent ]]; then
339 error
"$(gettext "There is no agent
set up to handle
%s URLs. Check
%s.
")" "$proto" "$MAKEPKG_CONF"
340 plain
"$(gettext "Aborting...
")"
341 exit 1 # $E_CONFIG_ERROR
344 # ensure specified program is installed
345 local program
="${agent%% *}"
346 if [[ ! -x $program ]]; then
347 local baseprog
="${program##*/}"
348 error
"$(gettext "The download program
%s is not installed.
")" "$baseprog"
349 plain
"$(gettext "Aborting...
")"
350 exit 1 # $E_MISSING_PROGRAM
363 # temporary download file, default to last component of the URL
364 local dlfile
="${url##*/}"
366 # replace %o by the temporary dlfile if it exists
367 if [[ $dlcmd = *%o
* ]]; then
368 dlcmd
=${dlcmd//\%o/\"$file.part\"}
371 # add the URL, either in place of %u or at the end
372 if [[ $dlcmd = *%u
* ]]; then
373 dlcmd
=${dlcmd//\%u/\"$url\"}
375 dlcmd
="$dlcmd \"$url\""
379 eval "$dlcmd || ret=\$?"
381 [[ ! -s $dlfile ]] && rm -f -- "$dlfile"
385 # rename the temporary download file to the final destination
386 if [[ $dlfile != $file ]]; then
387 mv -f "$SRCDEST/$dlfile" "$SRCDEST/$file"
393 printf -v cmd
"%q " "$PACMAN" $PACMAN_OPTS "$@"
394 if (( ! ASROOT
)) && [[ ! $1 =~ ^
-(T|Qq
)$
]]; then
395 if [ "$(type -p sudo)" ]; then
405 (( $# > 0 )) ||
return 0
407 # Disable error trap in pacman subshell call as this breaks bash-3.2 compatibility
408 # Also, a non-zero return value is not unexpected and we are manually dealing them
412 pmout
=$
(run_pacman
-T "$@") || ret
=$?
415 if (( ret
== 127 )); then #unresolved deps
418 error
"$(gettext "'%s' returned a fatal error
(%i
): %s
")" "$PACMAN" "$ret" "$pmout"
424 local R_DEPS_SATISFIED
=0
425 local R_DEPS_MISSING
=1
427 (( $# == 0 )) && return $R_DEPS_SATISFIED
431 if (( ! DEP_BIN
)); then
432 return $R_DEPS_MISSING
435 if (( DEP_BIN
)); then
436 # install missing deps from binary packages (using pacman -S)
437 msg
"$(gettext "Installing missing dependencies...
")"
439 if ! run_pacman
-S --asdeps $deplist; then
440 error
"$(gettext "'%s' failed to
install missing dependencies.
")" "$PACMAN"
441 exit 1 # TODO: error code
445 # we might need the new system environment
446 # avoid triggering the ERR trap
447 local restoretrap
=$
(trap -p ERR
)
449 source /etc
/profile
&>/dev
/null
452 return $R_DEPS_SATISFIED
456 local R_DEPS_SATISFIED
=0
457 local R_DEPS_MISSING
=1
459 # deplist cannot be declared like this: local deplist=$(foo)
460 # Otherwise, the return value will depend on the assignment.
462 deplist
="$(set +E; check_deps $*)" ||
exit 1
463 [[ -z $deplist ]] && return $R_DEPS_SATISFIED
465 if handle_deps
$deplist; then
466 # check deps again to make sure they were resolved
467 deplist
="$(set +E; check_deps $*)" ||
exit 1
468 [[ -z $deplist ]] && return $R_DEPS_SATISFIED
471 msg
"$(gettext "Missing Dependencies
:")"
473 for dep
in $deplist; do
477 return $R_DEPS_MISSING
481 (( ! RMDEPS
)) && return
483 # check for packages removed during dependency install (e.g. due to conflicts)
484 # removing all installed packages is risky in this case
485 if [[ -n $
(comm -23 <(printf "%s\n" "${original_pkglist[@]}") \
486 <(printf "%s\n" "${current_pkglist[@]}")) ]]; then
487 warning
"$(gettext "Failed to remove installed dependencies.
")"
491 local deplist
=($
(comm -13 <(printf "%s\n" "${original_pkglist[@]}") \
492 <(printf "%s\n" "${current_pkglist[@]}")))
493 (( ${#deplist[@]} == 0 )) && return
495 msg
"Removing installed dependencies..."
496 # exit cleanly on failure to remove deps as package has been built successfully
497 if ! run_pacman
-Rn ${deplist[@]}; then
498 warning
"$(gettext "Failed to remove installed dependencies.
")"
504 msg
"$(gettext "Retrieving Sources...
")"
506 pushd "$SRCDEST" &>/dev
/null
509 for netfile
in "${source[@]}"; do
510 local file=$
(get_filepath
"$netfile" || true
)
511 if [[ -n "$file" ]]; then
512 msg2
"$(gettext "Found
%s
")" "${file##*/}"
513 ln -sf "$file" "$srcdir/"
517 file=$
(get_filename
"$netfile")
518 local url
=$
(get_url
"$netfile")
520 # if we get here, check to make sure it was a URL, else fail
521 if [[ $file = $url ]]; then
522 error
"$(gettext "%s was not found
in the build directory and is not a URL.
")" "$file"
523 exit 1 # $E_MISSING_FILE
526 # find the client we should use for this URL
527 local dlclient
=$
(get_downloadclient
"$url") ||
exit $?
529 msg2
"$(gettext "Downloading
%s...
")" "$file"
530 # fix flyspray bug #3289
532 download_file
"$dlclient" "$url" "$file" || ret
=$?
534 error
"$(gettext "Failure
while downloading
%s
")" "$file"
535 plain
"$(gettext "Aborting...
")"
538 rm -f "$srcdir/$file"
539 ln -s "$SRCDEST/$file" "$srcdir/"
549 for integ
in md5 sha1 sha256 sha384 sha512
; do
550 local integrity_sums
=($
(eval echo "\${${integ}sums[@]}"))
551 if [[ -n "$integrity_sums" ]]; then
552 integlist
=(${integlist[@]} $integ)
556 if (( ${#integlist[@]} > 0 )); then
559 echo ${INTEGRITY_CHECK[@]}
563 generate_checksums
() {
564 msg
"$(gettext "Generating checksums
for source files...
")"
567 if ! type -p openssl
>/dev
/null
; then
568 error
"$(gettext "Cannot
find openssl.
")"
569 exit 1 # $E_MISSING_PROGRAM
573 if (( $# == 0 )); then
574 integlist
=$
(get_integlist
)
580 for integ
in ${integlist[@]}; do
581 integ
=$
(tr '[:upper:]' '[:lower:]' <<< "$integ")
583 md5|sha1|sha256|sha384|sha512
) : ;;
585 error
"$(gettext "Invalid integrity algorithm
'%s' specified.
")" "$integ"
586 exit 1;; # $E_CONFIG_ERROR
590 local numsrc
=${#source[@]}
591 echo -n "${integ}sums=("
595 for (( i
= 0; i
< ${#integ} + 6; i
++ )); do
600 for netfile
in "${source[@]}"; do
601 local file="$(get_filepath "$netfile")" || missing_source_file
"$netfile"
602 local sum="$(openssl dgst -${integ} "$file")"
604 (( ct
)) && echo -n "$indent"
607 (( $ct < $numsrc )) && echo
615 (( ! ${#source[@]} )) && return 0
617 if ! type -p openssl
>/dev
/null
; then
618 error
"$(gettext "Cannot
find openssl.
")"
619 exit 1 # $E_MISSING_PROGRAM
624 for integ
in md5 sha1 sha256 sha384 sha512
; do
625 local integrity_sums
=($
(eval echo "\${${integ}sums[@]}"))
626 if (( ${#integrity_sums[@]} == ${#source[@]} )); then
627 msg
"$(gettext "Validating
source files with
%s...
")" "${integ}sums"
632 for file in "${source[@]}"; do
634 file="$(get_filename "$file")"
635 echo -n " $file ... " >&2
637 if ! file="$(get_filepath "$file")"; then
638 echo "$(gettext "NOT FOUND
")" >&2
643 if (( $found )) ; then
644 local expectedsum
=$
(tr '[:upper:]' '[:lower:]' <<< "${integrity_sums[$idx]}")
645 local realsum
="$(openssl dgst -${integ} "$file")"
646 realsum
="${realsum##* }"
647 if [[ $expectedsum = $realsum ]]; then
648 echo "$(gettext "Passed
")" >&2
650 echo "$(gettext "FAILED
")" >&2
658 if (( errors
)); then
659 error
"$(gettext "One or
more files did not pass the validity check
!")"
660 exit 1 # TODO: error code
662 elif (( ${#integrity_sums[@]} )); then
663 error
"$(gettext "Integrity checks
(%s
) differ
in size from the
source array.
")" "$integ"
664 exit 1 # TODO: error code
668 if (( ! correlation
)); then
669 error
"$(gettext "Integrity checks are missing.
")"
670 exit 1 # TODO: error code
675 msg
"$(gettext "Extracting Sources...
")"
677 for netfile
in "${source[@]}"; do
678 local file=$
(get_filename
"$netfile")
679 if in_array
"$file" ${noextract[@]}; then
680 #skip source files in the noextract=() array
681 # these are marked explicitly to NOT be extracted
687 local file_type
=$
(file -bizL "$file")
688 local ext
=${file##*.}
691 *application
/x-tar
*|
*application
/zip*|
*application
/x-zip
*|
*application
/x-cpio
*)
693 *application
/x-gzip
*)
695 gz|z|Z
) cmd
="gzip" ;;
698 *application
/x-bzip
*)
700 bz2|bz
) cmd
="bzip2" ;;
709 # See if bsdtar can recognize the file
710 if bsdtar
-tf "$file" -q '*' &>/dev
/null
; then
718 msg2
"$(gettext "Extracting
%s with
%s
")" "$file" "$cmd"
719 if [[ $cmd = bsdtar
]]; then
720 $cmd -xf "$file" || ret
=$?
723 $cmd -dcf "$file" > "${file%.*}" || ret
=$?
726 error
"$(gettext "Failed to extract
%s
")" "$file"
727 plain
"$(gettext "Aborting...
")"
732 if (( EUID
== 0 )); then
733 # change perms of all source files to root user & root group
734 chown
-R 0:0 "$srcdir"
739 if [[ -p $logpipe ]]; then
742 # first exit all subshells, then print the error
743 if (( ! BASH_SUBSHELL
)); then
744 error
"$(gettext "A failure occurred
in %s
().
")" "$1"
745 plain
"$(gettext "Aborting...
")"
748 exit 2 # $E_BUILD_FAILED
757 # clear user-specified buildflags if requested
758 if [[ $
(check_option buildflags
) = "n" ]]; then
764 # clear user-specified makeflags if requested
765 if [[ $
(check_option makeflags
) = "n" ]]; then
769 msg
"$(gettext "Starting
%s
()...
")" "$pkgfunc"
772 # ensure all necessary build variables are exported
773 export CFLAGS CXXFLAGS LDFLAGS MAKEFLAGS CHOST
774 # save our shell options so pkgfunc() can't override what we need
775 local shellopts
=$
(shopt -p)
779 if (( LOGGING
)); then
780 local fullver
=$
(get_full_version
$epoch $pkgver $pkgrel)
781 local BUILDLOG
="${startdir}/${pkgbase}-${fullver}-${CARCH}-$pkgfunc.log"
782 if [[ -f $BUILDLOG ]]; then
785 if [[ -f $BUILDLOG.
$i ]]; then
791 mv "$BUILDLOG" "$BUILDLOG.$i"
794 # ensure overridden package variables survive tee with split packages
795 logpipe
=$
(mktemp
-u "$startdir/logpipe.XXXXXXXX")
798 tee "$BUILDLOG" < "$logpipe" &
799 exec 1>"$logpipe" 2>"$logpipe"
800 restoretrap
=$
(trap -p ERR
)
801 trap 'error_function $pkgfunc' ERR
808 restoretrap
=$
(trap -p ERR
)
809 trap 'error_function $pkgfunc' ERR
813 # reset our shell options
818 # use distcc if it is requested (check buildenv and PKGBUILD opts)
819 if [[ $
(check_buildenv distcc
) = "y" && $
(check_option distcc
) != "n" ]]; then
820 [[ -d /usr
/lib
/distcc
/bin
]] && export PATH
="/usr/lib/distcc/bin:$PATH"
822 elif [[ $
(check_option distcc
) = "n" ]]; then
823 # if it is not wanted, clear the makeflags too
827 # use ccache if it is requested (check buildenv and PKGBUILD opts)
828 if [[ $
(check_buildenv ccache
) = "y" && $
(check_option ccache
) != "n" ]]; then
829 [[ -d /usr
/lib
/ccache
/bin
]] && export PATH
="/usr/lib/ccache/bin:$PATH"
847 run_function
"$pkgfunc"
852 msg
"$(gettext "Tidying
install...
")"
854 if [[ $
(check_option docs
) = "n" && -n ${DOC_DIRS[*]} ]]; then
855 msg2
"$(gettext "Removing doc files...
")"
856 rm -rf ${DOC_DIRS[@]}
859 if [[ $
(check_option purge
) = "y" && -n ${PURGE_TARGETS[*]} ]]; then
860 msg2
"$(gettext "Purging other files...
")"
862 for pt
in "${PURGE_TARGETS[@]}"; do
863 if [[ ${pt} = ${pt//\/} ]]; then
864 find .
-type f
-name "${pt}" -exec rm -f -- '{}' \
;
871 if [[ $
(check_option zipman
) = "y" && -n ${MAN_DIRS[*]} ]]; then
872 msg2
"$(gettext "Compressing man and info pages...
")"
873 local manpage ext
file link hardlinks hl
874 find ${MAN_DIRS[@]} -type f
2>/dev
/null |
875 while read manpage
; do
877 file="${manpage##*/}"
878 if [[ $ext != gz
&& $ext != bz2
]]; then
879 # update symlinks to this manpage
880 find ${MAN_DIRS[@]} -lname "$file" 2>/dev
/null |
883 ln -sf "${file}.gz" "${link}.gz"
886 # check file still exists (potentially already compressed due to hardlink)
887 if [[ -f ${manpage} ]]; then
888 # find hard links and remove them
889 # the '|| true' part keeps the script from bailing if find returned an
890 # error, such as when one of the man directories doesn't exist
891 hardlinks
="$(find ${MAN_DIRS[@]} \! -name "$file" -samefile "$manpage" 2>/dev/null)" || true
892 for hl
in ${hardlinks}; do
895 # compress the original
897 # recreate hard links removed earlier
898 for hl
in ${hardlinks}; do
899 ln "${manpage}.gz" "${hl}.gz"
907 if [[ $
(check_option strip
) = y
]]; then
908 msg2
"$(gettext "Stripping unneeded symbols from binaries and libraries...
")"
909 # make sure library stripping variables are defined to prevent excess stripping
910 [[ -z ${STRIP_SHARED+x} ]] && STRIP_SHARED
="-S"
911 [[ -z ${STRIP_STATIC+x} ]] && STRIP_STATIC
="-S"
913 find .
-type f
-perm -u+w
2>/dev
/null |
while read binary
; do
914 case "$(file -bi "$binary")" in
915 *application
/x-sharedlib
*) # Libraries (.so)
916 /usr
/bin
/strip
$STRIP_SHARED "$binary";;
917 *application
/x-archive
*) # Libraries (.a)
918 /usr
/bin
/strip
$STRIP_STATIC "$binary";;
919 *application
/x-executable
*) # Binaries
920 /usr
/bin
/strip
$STRIP_BINARIES "$binary";;
925 if [[ $
(check_option libtool
) = "n" ]]; then
926 msg2
"$(gettext "Removing libtool .la files...
")"
927 find .
! -type d
-name "*.la" -exec rm -f -- '{}' \
;
930 if [[ $
(check_option emptydirs
) = "n" ]]; then
931 msg2
"$(gettext "Removing empty directories...
")"
932 find .
-depth -type d
-empty -delete
937 local builddate
=$
(date -u "+%s")
938 if [[ -n $PACKAGER ]]; then
939 local packager
="$PACKAGER"
941 local packager
="Unknown Packager"
943 local size
="$(@DUPATH@ -sk)"
944 size
="$(( ${size%%[^0-9]*} * 1024 ))"
946 msg2
"$(gettext "Generating .PKGINFO
file...
")"
947 echo "# Generated by makepkg $myver"
948 if (( INFAKEROOT
)); then
949 echo "# using $(fakeroot -v)"
951 echo "# $(LC_ALL=C date -u)"
953 (( SPLITPKG
)) && echo pkgbase
= $pkgbase
954 echo "pkgver = $(get_full_version $epoch $pkgver $pkgrel)"
955 echo "pkgdesc = $pkgdesc"
957 echo "builddate = $builddate"
958 echo "packager = $packager"
960 echo "arch = $PKGARCH"
962 [[ $license ]] && printf "license = %s\n" "${license[@]}"
963 [[ $replaces ]] && printf "replaces = %s\n" "${replaces[@]}"
964 [[ $groups ]] && printf "group = %s\n" "${groups[@]}"
965 [[ $depends ]] && printf "depend = %s\n" "${depends[@]}"
966 [[ $optdepends ]] && printf "optdepend = %s\n" "${optdepends[@]}"
967 [[ $conflicts ]] && printf "conflict = %s\n" "${conflicts[@]}"
968 [[ $provides ]] && printf "provides = %s\n" "${provides[@]}"
969 [[ $backup ]] && printf "backup = %s\n" "${backup[@]}"
972 for it
in "${packaging_options[@]}"; do
973 local ret
="$(check_option $it)"
974 if [[ $ret != "?" ]]; then
975 if [[ $ret = y
]]; then
976 echo "makepkgopt = $it"
978 echo "makepkgopt = !$it"
983 # TODO maybe remove this at some point
984 # warn if license array is not present or empty
985 if [[ -z $license ]]; then
986 warning
"$(gettext "Please add a license line to your
%s
!")" "$BUILDSCRIPT"
987 plain
"$(gettext "Example
for GPL
\'ed software
: license
=('GPL').
")"
994 # check existence of backup files
996 for file in "${backup[@]}"; do
997 if [[ ! -f $file ]]; then
998 warning
"$(gettext "Backup entry
file not
in package
: %s
")" "$file"
1002 # check for references to the build and package directory
1003 if find "${pkgdir}" -type f
-print0 |
xargs -0 grep -q -I "${srcdir}" ; then
1004 warning
"$(gettext "Package contains reference to
%s
")" "\$srcdir"
1006 if find "${pkgdir}" -type f
-print0 |
xargs -0 grep -q -I "${pkgdir}" ; then
1007 warning
"$(gettext "Package contains reference to
%s
")" "\$pkgdir"
1013 if [[ ! -d $pkgdir ]]; then
1014 error
"$(gettext "Missing pkg
/ directory.
")"
1015 plain
"$(gettext "Aborting...
")"
1016 exit 1 # $E_MISSING_PKGDIR
1022 msg
"$(gettext "Creating package...
")"
1025 if [[ -z $1 ]]; then
1026 nameofpkg
="$pkgname"
1031 if [[ $arch = "any" ]]; then
1037 write_pkginfo
$nameofpkg > .PKGINFO
1039 local comp_files
=".PKGINFO"
1041 # check for changelog/install files
1042 for i
in 'changelog' 'install'; do
1044 dest
=$
(tr '[:lower:]' '[:upper:]' <<<".$i")
1046 if [[ -n $orig ]]; then
1047 msg2
"$(gettext "Adding
%s
file...
")" "$i"
1048 cp "$startdir/$orig" "$dest"
1050 comp_files
+=" $dest"
1055 msg2
"$(gettext "Compressing package...
")"
1059 *tar.gz
) EXT
=${PKGEXT%.gz} ;;
1060 *tar.bz2
) EXT
=${PKGEXT%.bz2} ;;
1061 *tar.xz
) EXT
=${PKGEXT%.xz} ;;
1062 *tar) EXT
=${PKGEXT} ;;
1063 *) warning
"$(gettext "'%s' is not a valid archive extension.
")" \
1064 "$PKGEXT" ; EXT
=$PKGEXT ;;
1067 local fullver
=$
(get_full_version
$epoch $pkgver $pkgrel)
1068 local pkg_file
="$PKGDEST/${nameofpkg}-${fullver}-${PKGARCH}${PKGEXT}"
1071 # when fileglobbing, we want * in an empty directory to expand to
1072 # the null string rather than itself
1074 # TODO: Maybe this can be set globally for robustness
1075 shopt -s -o pipefail
1076 bsdtar
-cf - $comp_files * |
1078 *tar.gz
) gzip -c -f -n ;;
1079 *tar.bz2
) bzip2 -c -f ;;
1080 *tar.xz
) xz
-c -z - ;;
1082 esac > ${pkg_file} || ret
=$?
1085 shopt -u -o pipefail
1088 error
"$(gettext "Failed to create package
file.
")"
1089 exit 1 # TODO: error code
1092 if (( ! ret
)) && [[ ! "$PKGDEST" -ef "${startdir}" ]]; then
1093 ln -sf "${pkg_file}" "${pkg_file/$PKGDEST/$startdir}"
1098 warning
"$(gettext "Failed to create symlink to package
file.
")"
1102 create_srcpackage
() {
1105 # Get back to our src directory so we can begin with sources.
1109 if (( ! SKIPINTEG || SOURCEONLY
== 2 )); then
1112 if (( ! SKIPINTEG
)); then
1113 # We can only check checksums if we have all files.
1116 warning
"$(gettext "Skipping integrity checks.
")"
1120 msg
"$(gettext "Creating
source package...
")"
1121 local srclinks
="$(mktemp -d "$startdir"/srclinks.XXXXXXXXX)"
1122 mkdir
"${srclinks}"/${pkgbase}
1124 msg2
"$(gettext "Adding
%s...
")" "$BUILDSCRIPT"
1125 ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
1128 for file in "${source[@]}"; do
1129 if [[ -f $file ]]; then
1130 msg2
"$(gettext "Adding
%s...
")" "$file"
1131 ln -s "${startdir}/$file" "$srclinks/$pkgbase"
1132 elif (( SOURCEONLY
== 2 )); then
1133 local absfile
=$
(get_filepath
"$file") || missing_source_file
"$file"
1134 msg2
"$(gettext "Adding
%s...
")" "${absfile##*/}"
1135 ln -s "$absfile" "$srclinks/$pkgbase"
1140 for i
in 'changelog' 'install'; do
1141 local filelist
=$
(sed -n "s/^[[:space:]]*$i=//p" "$BUILDSCRIPT")
1143 for file in $filelist; do
1144 # evaluate any bash variables used
1146 if [[ ! -f "${srclinks}/${pkgbase}/$file" ]]; then
1147 msg2
"$(gettext "Adding
%s
file (%s
)...
")" "$i" "${file}"
1148 ln -s "${startdir}/$file" "${srclinks}/${pkgbase}/"
1155 *tar.gz
) TAR_OPT
="z" ;;
1156 *tar.bz2
) TAR_OPT
="j" ;;
1157 *tar.xz
) TAR_OPT
="J" ;;
1159 *) warning
"$(gettext "'%s' is not a valid archive extension.
")" \
1163 local fullver
=$
(get_full_version
$epoch $pkgver $pkgrel)
1164 local pkg_file
="$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"
1167 msg2
"$(gettext "Compressing
source package...
")"
1169 if ! bsdtar
-c${TAR_OPT}Lf
"$pkg_file" ${pkgbase}; then
1170 error
"$(gettext "Failed to create
source package
file.
")"
1171 exit 1 # TODO: error code
1174 if (( ! ret
)) && [[ ! "$SRCPKGDEST" -ef "${startdir}" ]]; then
1175 ln -sf "${pkg_file}" "${pkg_file/$SRCPKGDEST/$startdir}"
1180 warning
"$(gettext "Failed to create symlink to
source package
file.
")"
1184 rm -rf "${srclinks}"
1188 (( ! INSTALL
)) && return
1190 if (( ! SPLITPKG
)); then
1191 msg
"$(gettext "Installing package
%s with
%s
-U...
")" "$pkgname" "$PACMAN"
1193 msg
"$(gettext "Installing
%s package group with
%s
-U...
")" "$pkgbase" "$PACMAN"
1196 local fullver pkg pkglist
1197 for pkg
in ${pkgname[@]}; do
1198 # TODO: this wasn't properly fixed in commit 2020e629
1199 fullver
=$
(get_full_version
$epoch $pkgver $pkgrel)
1200 if [[ -f $PKGDEST/${pkg}-${fullver}-${CARCH}${PKGEXT} ]]; then
1201 pkglist
+=" $PKGDEST/${pkg}-${fullver}-${CARCH}${PKGEXT}"
1203 pkglist
+=" $PKGDEST/${pkg}-${fullver}-any${PKGEXT}"
1207 if ! run_pacman
-U $pkglist; then
1208 warning
"$(gettext "Failed to
install built package
(s
).
")"
1214 # check for no-no's in the build script
1217 for i
in 'pkgname' 'pkgrel' 'pkgver'; do
1218 if [[ -z ${!i} ]]; then
1219 error
"$(gettext "%s is not allowed to be empty.
")" "$i"
1224 for i
in "${pkgname[@]}"; do
1225 if [[ ${i:0:1} = "-" ]]; then
1226 error
"$(gettext "%s is not allowed to start with a hyphen.
")" "pkgname"
1231 if [[ ${pkgbase:0:1} = "-" ]]; then
1232 error
"$(gettext "%s is not allowed to start with a hyphen.
")" "pkgbase"
1235 if [[ $pkgver =~
[:-] ]]; then
1236 error
"$(gettext "%s is not allowed to contain colons or hyphens.
")" "pkgver"
1239 if [[ $pkgrel != ${pkgrel//-/} ]]; then
1240 error
"$(gettext "%s is not allowed to contain hyphens.
")" "pkgrel"
1244 if [[ ! $epoch =~ ^
[0-9]*$
]]; then
1245 error
"$(gettext "%s must be an integer.
")" "epoch"
1249 if [[ $arch != 'any' ]]; then
1250 if ! in_array
$CARCH ${arch[@]}; then
1251 if (( ! IGNOREARCH
)); then
1252 error
"$(gettext "%s is not available
for the
'%s' architecture.
")" "$pkgbase" "$CARCH"
1253 plain
"$(gettext "Note that many packages may need a line added to their
%s
")" "$BUILDSCRIPT"
1254 plain
"$(gettext "such as arch
=('%s').
")" "$CARCH"
1260 local provides_list
=()
1261 eval $
(awk '/^[[:space:]]*provides=/,/\)/' "$BUILDFILE" | \
1262 sed -e "s/provides=/provides_list+=/" -e "s/#.*//")
1263 for i
in ${provides_list[@]}; do
1264 if [[ $i != ${i//</} ||
$i != ${i//>/} ]]; then
1265 error
"$(gettext "Provides array cannot contain comparison
(< or
>) operators.
")"
1270 local backup_list
=()
1271 eval $
(awk '/^[[:space:]]*backup=/,/\)/' "$BUILDFILE" | \
1272 sed -e "s/backup=/backup_list+=/" -e "s/#.*//")
1273 for i
in "${backup_list[@]}"; do
1274 if [[ ${i:0:1} = "/" ]]; then
1275 error
"$(gettext "Backup entry should not contain leading slash
: %s
")" "$i"
1280 local optdepends_list
=()
1281 eval $
(awk '/^[[:space:]]*optdepends=\(/,/\)[[:space:]]*(|#.*)$/' "$BUILDFILE" | \
1282 sed -e "s/optdepends=/optdepends_list+=/" -e "s/#.*//")
1283 for i
in "${optdepends_list[@]}"; do
1285 if [[ ! $pkg =~ ^
[[:alnum
:]\
>\
<\
=\.\
+\_\
-]+$
]]; then
1286 error
"$(gettext "Invalid syntax
for optdepend
: '%s'")" "$i"
1291 for i
in 'changelog' 'install'; do
1292 local filelist
=$
(sed -n "s/^[[:space:]]*$i=//p" "$BUILDFILE")
1294 for file in $filelist; do
1295 # evaluate any bash variables used
1297 if [[ ! -f $file ]]; then
1298 error
"$(gettext "%s
file (%s
) does not exist.
")" "$i" "$file"
1304 local valid_options
=1
1305 local known kopt options_list
1306 eval $
(awk '/^[[:space:]]*options=/,/\)/' "$BUILDFILE" | \
1307 sed -e "s/options=/options_list+=/" -e "s/#.*//")
1308 for i
in ${options_list[@]}; do
1310 # check if option matches a known option or its inverse
1311 for kopt
in ${packaging_options[@]} ${other_options[@]}; do
1312 if [[ ${i} = ${kopt} || ${i} = "!${kopt}" ]]; then
1316 if (( ! known )); then
1317 error "$
(gettext "options array contains unknown option '%s'")" "$i"
1321 if (( ! valid_options )); then
1325 if (( ${#pkgname[@]} > 1 )); then
1326 for i in ${pkgname[@]}; do
1327 if ! declare -f package_${i} >/dev/null; then
1328 error "$
(gettext "missing package function for split package '%s'")" "$i"
1334 for i in ${PKGLIST[@]}; do
1335 if ! in_array $i ${pkgname[@]}; then
1336 error "$
(gettext "requested package %s is not provided in %s")" "$i" "$BUILDFILE"
1347 # Do not update pkgver if --holdver is set, when building a source package, repackaging,
1348 # reading PKGBUILD from pipe (-f), or if we cannot write to the file (-w)
1349 if (( HOLDVER || SOURCEONLY || REPKG )) \
1350 || [[ ! -f $BUILDFILE || ! -w $BUILDFILE ]]; then
1354 if [[ -z $FORCE_VER ]]; then
1355 # Check if this is a svn/cvs/etc PKGBUILD; set $newpkgver if so.
1356 # This will only be used on the first call to makepkg; subsequent
1357 # calls to makepkg via fakeroot will explicitly pass the version
1358 # number to avoid having to determine the version number twice.
1359 # Also do a brief check to make sure we have the VCS tool available.
1361 if [[ -n ${_darcstrunk} && -n ${_darcsmod} ]] ; then
1362 type -p darcs >/dev/null || return 0
1363 msg "$
(gettext "Determining latest %s revision...")" 'darcs'
1364 newpkgver=$(date +%Y%m%d)
1365 elif [[ -n ${_cvsroot} && -n ${_cvsmod} ]] ; then
1366 type -p cvs >/dev/null || return 0
1367 msg "$
(gettext "Determining latest %s revision...")" 'cvs'
1368 newpkgver=$(date +%Y%m%d)
1369 elif [[ -n ${_gitroot} && -n ${_gitname} ]] ; then
1370 type -p git >/dev/null || return 0
1371 msg "$
(gettext "Determining latest %s revision...")" 'git'
1372 newpkgver=$(date +%Y%m%d)
1373 elif [[ -n ${_svntrunk} && -n ${_svnmod} ]] ; then
1374 type -p svn >/dev/null || return 0
1375 msg "$
(gettext "Determining latest %s revision...")" 'svn'
1376 newpkgver=$(LC_ALL=C svn info $_svntrunk | sed -n 's/^Last Changed Rev: \([0-9]*\)$/\1/p')
1377 elif [[ -n ${_bzrtrunk} && -n ${_bzrmod} ]] ; then
1378 type -p bzr >/dev/null || return 0
1379 msg "$
(gettext "Determining latest %s revision...")" 'bzr'
1380 newpkgver=$(bzr revno ${_bzrtrunk})
1381 elif [[ -n ${_hgroot} && -n ${_hgrepo} ]] ; then
1382 type -p hg >/dev/null || return 0
1383 msg "$
(gettext "Determining latest %s revision...")" 'hg'
1384 if [[ -d ./src/$_hgrepo ]] ; then
1389 [[ ! -d ./src/ ]] && mkdir ./src/
1390 hg clone $_hgroot/$_hgrepo ./src/$_hgrepo
1393 newpkgver=$(hg tip --template "{rev}")
1397 if [[ -n $newpkgver ]]; then
1398 msg2 "$
(gettext "Version found: %s")" "$newpkgver"
1402 # Version number retrieved from fakeroot->makepkg argument
1403 newpkgver=$FORCE_VER
1408 # This is lame, but if we're wanting to use an updated pkgver for
1409 # retrieving svn/cvs/etc sources, we'll update the PKGBUILD with
1410 # the new pkgver and then re-source it. This is the most robust
1411 # method for dealing with PKGBUILDs that use, e.g.:
1417 if [[ -n $newpkgver ]]; then
1418 if [[ $newpkgver != $pkgver ]]; then
1419 if [[ -f $BUILDFILE && -w $BUILDFILE ]]; then
1420 @SEDINPLACE@ "s
/^pkgver
=[^
]*/pkgver
=$newpkgver/" "$BUILDFILE"
1421 @SEDINPLACE@ "s
/^pkgrel
=[^
]*/pkgrel
=1/" "$BUILDFILE"
1428 backup_package_variables() {
1430 for var in ${splitpkg_overrides[@]}; do
1431 local indirect="${var}_backup
"
1432 eval "${indirect}=(\"\
${$var[@]}\")"
1436 restore_package_variables() {
1438 for var in ${splitpkg_overrides[@]}; do
1439 local indirect="${var}_backup
"
1440 if [[ -n ${!indirect} ]]; then
1441 eval "${var}=(\"\
${$indirect[@]}\")"
1448 run_split_packaging() {
1449 local pkgname_backup=${pkgname[@]}
1450 for pkgname in ${pkgname_backup[@]}; do
1451 pkgdir="$pkgdir/$pkgname"
1454 backup_package_variables
1455 run_package $pkgname
1457 create_package $pkgname
1458 restore_package_variables
1459 pkgdir="${pkgdir%/*}"
1461 pkgname=${pkgname_backup[@]}
1464 # Canonicalize a directory path if it exists
1465 canonicalize_path() {
1468 if [[ -d $path ]]; then
1478 # getopt like parser
1480 local short_options=$1; shift;
1481 local long_options=$1; shift;
1483 local unused_options=""
1486 while [[ -n $1 ]]; do
1487 if [[ ${1:0:2} = '--' ]]; then
1488 if [[ -n ${1:2} ]]; then
1490 for i in ${long_options//,/ }; do
1491 if [[ ${1:2} = ${i//:} ]]; then
1496 if [[ -n $match ]]; then
1497 if [[ ${1:2} = $match ]]; then
1500 if [[ -n $2 ]]; then
1505 echo "makepkg
: option
'$1' $
(gettext "requires an argument")" >&2
1510 echo "makepkg
: $
(gettext "unrecognized option") '$1'" >&2
1517 elif [[ ${1:0:1} = '-' ]]; then
1518 for ((i=1; i<${#1}; i++)); do
1519 if [[ $short_options =~ ${1:i:1} ]]; then
1520 if [[ $short_options =~ ${1:i:1}: ]]; then
1521 if [[ -n ${1:$i+1} ]]; then
1522 printf ' -%s' "${1:i:1}"
1523 printf " '%s'" "${1:$i+1}"
1525 if [[ -n $2 ]]; then
1526 printf ' -%s' "${1:i:1}"
1528 printf " '%s'" "${1}"
1530 echo "makepkg
: option $
(gettext "requires an argument") -- '${1:i:1}'" >&2
1536 printf ' -%s' "${1:i:1}"
1539 echo "makepkg
: $
(gettext "invalid option") -- '${1:i:1}'" >&2
1544 unused_options="${unused_options} '$1'"
1550 if [[ -n $unused_options ]]; then
1551 for i in ${unused_options[@]}; do
1555 if [[ -n $1 ]]; then
1556 while [[ -n $1 ]]; do
1557 printf " '%s'" "${1}"
1567 printf "makepkg
(pacman
) %s
\n" "$myver"
1569 printf "$
(gettext "Usage: %s [options]")\n" "$0"
1571 echo "$
(gettext "Options:")"
1572 printf "$
(gettext " -A, --ignorearch Ignore incomplete arch field in %s")\n" "$BUILDSCRIPT"
1573 echo "$
(gettext " -c, --clean Clean up work files after build")"
1574 echo "$
(gettext " -C, --cleancache Clean up source files from the cache")"
1575 echo "$
(gettext " -d, --nodeps Skip all dependency checks")"
1576 echo "$
(gettext " -e, --noextract Do not extract source files (use existing src/ dir)")"
1577 echo "$
(gettext " -f, --force Overwrite existing package")"
1578 echo "$
(gettext " -g, --geninteg Generate integrity checks for source files")"
1579 echo "$
(gettext " -h, --help This help")"
1580 echo "$
(gettext " -i, --install Install package after successful build")"
1581 echo "$
(gettext " -L, --log Log package build process")"
1582 echo "$
(gettext " -m, --nocolor Disable colorized output messages")"
1583 echo "$
(gettext " -o, --nobuild Download and extract files only")"
1584 printf "$
(gettext " -p <file> Use an alternate build script (instead of '%s')")\n" "$BUILDSCRIPT"
1585 echo "$
(gettext " -r, --rmdeps Remove installed dependencies after a successful build")"
1586 echo "$
(gettext " -R, --repackage Repackage contents of the package without rebuilding")"
1587 echo "$
(gettext " -s, --syncdeps Install missing dependencies with pacman")"
1588 echo "$
(gettext " --allsource Generate a source-only tarball including downloaded sources")"
1589 echo "$
(gettext " --asroot Allow makepkg to run as root user")"
1590 printf "$
(gettext " --check Run the check() function in the %s")\n" "$BUILDSCRIPT"
1591 printf "$
(gettext " --config <file> Use an alternate config file (instead of '%s')")\n" "$confdir/makepkg.conf
"
1592 printf "$
(gettext " --holdver Prevent automatic version bumping for development %ss")\n" "$BUILDSCRIPT"
1593 printf "$
(gettext " --nocheck Do not run the check() function in the %s")\n" "$BUILDSCRIPT"
1594 echo "$
(gettext " --pkg <list> Only build listed packages from a split package")"
1595 echo "$
(gettext " --skipinteg Do not fail when integrity checks are missing")"
1596 echo "$
(gettext " --source Generate a source-only tarball without downloaded sources")"
1598 echo "$
(gettext "These options can be passed to pacman:")"
1600 echo "$
(gettext " --noconfirm Do not ask for confirmation when resolving dependencies")"
1601 echo "$
(gettext " --noprogressbar Do not show a progress bar when downloading files")"
1603 printf "$
(gettext "If -p is not specified, makepkg will look for '%s'")\n" "$BUILDSCRIPT"
1608 printf "makepkg
(pacman
) %s
\n" "$myver"
1609 printf "$
(gettext "\
1610 Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org>.\n\
1611 Copyright (C) 2002-2006 Judd Vinet <jvinet@zeroflux.org>.\n\n\
1612 This is free software; see the source for copying conditions.\n\
1613 There is NO WARRANTY, to the extent permitted by law.\n")"
1618 # determine whether we have gettext; make it a no-op if we do not
1619 if ! type -p gettext >/dev/null; then
1627 # Parse Command Line Options.
1628 OPT_SHORT="AcCdefFghiLmop
:rRsV
"
1629 OPT_LONG="allsource
,asroot
,ignorearch
,check
,clean
,cleancache
,nodeps
"
1630 OPT_LONG+=",noextract
,force
,forcever
:,geninteg
,help,holdver
"
1631 OPT_LONG+=",install,log
,nocolor
,nobuild
,nocheck
,pkg
:,rmdeps
"
1632 OPT_LONG+=",repackage
,skipinteg
,source,syncdeps
,version
,config
:"
1634 OPT_LONG+=",noconfirm
,noprogressbar
"
1635 OPT_TEMP="$
(parse_options
$OPT_SHORT $OPT_LONG "$@" ||
echo 'PARSE_OPTIONS FAILED')"
1636 if [[ $OPT_TEMP = *'PARSE_OPTIONS FAILED'* ]]; then
1637 # This is a small hack to stop the script bailing with 'set -e'
1638 echo; usage; exit 1 # E_INVALID_OPTION;
1640 eval set -- "$OPT_TEMP"
1641 unset OPT_SHORT OPT_LONG OPT_TEMP
1646 --noconfirm) PACMAN_OPTS+=" --noconfirm" ;;
1647 --noprogressbar) PACMAN_OPTS+=" --noprogressbar" ;;
1650 --allsource) SOURCEONLY=2 ;;
1651 --asroot) ASROOT=1 ;;
1652 -A|--ignorearch) IGNOREARCH=1 ;;
1653 -c|--clean) CLEANUP=1 ;;
1654 -C|--cleancache) CLEANCACHE=1 ;;
1655 --check) RUN_CHECK='y' ;;
1656 --config) shift; MAKEPKG_CONF=$1 ;;
1657 -d|--nodeps) NODEPS=1 ;;
1658 -e|--noextract) NOEXTRACT=1 ;;
1659 -f|--force) FORCE=1 ;;
1660 #hidden opt used by fakeroot call for svn/cvs/etc PKGBUILDs to set pkgver
1661 --forcever) shift; FORCE_VER=$1;;
1663 -g|--geninteg) GENINTEG=1 ;;
1664 --holdver) HOLDVER=1 ;;
1665 -i|--install) INSTALL=1 ;;
1666 -L|--log) LOGGING=1 ;;
1667 -m|--nocolor) USE_COLOR='n' ;;
1668 --nocheck) RUN_CHECK='n' ;;
1669 -o|--nobuild) NOBUILD=1 ;;
1670 -p) shift; BUILDFILE=$1 ;;
1671 --pkg) shift; PKGLIST=($1) ;;
1672 -r|--rmdeps) RMDEPS=1 ;;
1673 -R|--repackage) REPKG=1 ;;
1674 --skipinteg) SKIPINTEG=1 ;;
1675 --source) SOURCEONLY=1 ;;
1676 -s|--syncdeps) DEP_BIN=1 ;;
1678 -h|--help) usage; exit 0 ;; # E_OK
1679 -V|--version) version; exit 0 ;; # E_OK
1681 --) OPT_IND=0; shift; break;;
1682 *) usage; exit 1 ;; # E_INVALID_OPTION
1687 # preserve environment variables and canonicalize path
1688 [[ -n ${PKGDEST} ]] && _PKGDEST=$(canonicalize_path ${PKGDEST})
1689 [[ -n ${SRCDEST} ]] && _SRCDEST=$(canonicalize_path ${SRCDEST})
1690 [[ -n ${SRCPKGDEST} ]] && _SRCPKGDEST=$(canonicalize_path ${SRCPKGDEST})
1692 # default config is makepkg.conf
1693 MAKEPKG_CONF=${MAKEPKG_CONF:-$confdir/makepkg.conf}
1695 # Source the config file; fail if it is not found
1696 if [[ -r $MAKEPKG_CONF ]]; then
1697 source "$MAKEPKG_CONF"
1699 error "$
(gettext "%s not found.")" "$MAKEPKG_CONF"
1700 plain "$
(gettext "Aborting...")"
1701 exit 1 # $E_CONFIG_ERROR
1704 # Source user-specific makepkg.conf overrides
1705 if [[ -r ~/.makepkg.conf ]]; then
1706 source ~/.makepkg.conf
1709 # set pacman command if not already defined
1710 PACMAN=${PACMAN:-pacman}
1712 # check if messages are to be printed using color
1713 unset ALL_OFF BOLD BLUE GREEN RED YELLOW
1714 if [[ -t 2 && ! $USE_COLOR = "n
" && $(check_buildenv color) = "y
" ]]; then
1715 # prefer terminal safe colored and bold text when tput is supported
1716 if tput setaf 0 &>/dev/null; then
1717 ALL_OFF="$
(tput sgr0
)"
1719 BLUE="${BOLD}$
(tput setaf
4)"
1720 GREEN="${BOLD}$
(tput setaf
2)"
1721 RED="${BOLD}$
(tput setaf
1)"
1722 YELLOW="${BOLD}$
(tput setaf
3)"
1726 BLUE="${BOLD}\e
[1;34m
"
1727 GREEN="${BOLD}\e
[1;32m
"
1728 RED="${BOLD}\e
[1;31m
"
1729 YELLOW="${BOLD}\e
[1;33m
"
1732 readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
1734 # override settings with an environment variable for batch processing
1735 PKGDEST=${_PKGDEST:-$PKGDEST}
1736 PKGDEST=${PKGDEST:-$startdir} #default to $startdir if undefined
1737 if [[ ! -w $PKGDEST ]]; then
1738 error "$
(gettext "You do not have write permission to store packages in %s.")" "$PKGDEST"
1739 plain "$
(gettext "Aborting...")"
1743 SRCDEST=${_SRCDEST:-$SRCDEST}
1744 SRCDEST=${SRCDEST:-$startdir} #default to $startdir if undefined
1745 if [[ ! -w $SRCDEST ]] ; then
1746 error "$
(gettext "You do not have write permission to store downloads in %s.")" "$SRCDEST"
1747 plain "$
(gettext "Aborting...")"
1751 SRCPKGDEST=${_SRCPKGDEST:-$SRCPKGDEST}
1752 SRCPKGDEST=${SRCPKGDEST:-$startdir} #default to $startdir if undefined
1755 if (( HOLDVER )) && [[ -n $FORCE_VER ]]; then
1756 # The '\\0' is here to prevent gettext from thinking --holdver is an option
1757 error "$
(gettext "\\0--holdver and --forcever cannot both be specified" )"
1761 if (( CLEANCACHE )); then
1762 #fix flyspray feature request #5223
1763 if [[ -n $SRCDEST && ! $SRCDEST -ef "${startdir}" ]]; then
1764 msg "$
(gettext "Cleaning up ALL files from %s.")" "$SRCDEST"
1765 echo -n "$
(gettext " Are you sure you wish to do this? ")"
1766 echo -n "$
(gettext "[y/N]")"
1768 answer=$(tr '[:lower:]' '[:upper:]' <<< "$answer")
1769 if [[ $answer = $(gettext YES) || $answer = $(gettext Y) ]]; then
1772 error "$
(gettext "Problem removing files; you may not have correct permissions in %s")" "$SRCDEST"
1776 msg "$
(gettext "Source cache cleaned.")"
1781 msg "$
(gettext "No files have been removed.")"
1785 # $SRCDEST is $startdir, two possibilities
1786 error "$
(gettext "Source destination must be defined in %s.")" "$MAKEPKG_CONF"
1787 plain "$
(gettext "In addition, please run makepkg -C outside of your cache directory.")"
1792 if (( ! INFAKEROOT )); then
1793 if (( EUID == 0 && ! ASROOT )); then
1794 # Warn those who like to live dangerously.
1795 error "$
(gettext "Running makepkg as root is a BAD idea and can cause")"
1796 plain "$
(gettext "permanent, catastrophic damage to your system. If you")"
1797 plain "$
(gettext "wish to run as root, please use the --asroot option.")"
1798 exit 1 # $E_USER_ABORT
1799 elif (( EUID > 0 && ASROOT )); then
1800 # Warn those who try to use the --asroot option when they are not root
1801 error "$
(gettext "The --asroot option is meant for the root user only.")"
1802 plain "$
(gettext "Please rerun makepkg without the --asroot flag.")"
1803 exit 1 # $E_USER_ABORT
1804 elif [[ $(check_buildenv fakeroot) = "y
" ]] && (( EUID > 0 )); then
1805 if ! type -p fakeroot >/dev/null; then
1806 error "$
(gettext "Fakeroot must be installed if using the 'fakeroot' option")"
1807 plain "$
(gettext "in the BUILDENV array in %s.")" "$MAKEPKG_CONF"
1810 elif (( EUID > 0 )); then
1811 warning "$
(gettext "Running makepkg as an unprivileged user will result in non-root")"
1812 plain "$
(gettext "ownership of the packaged files. Try using the fakeroot environment by")"
1813 plain "$
(gettext "placing 'fakeroot' in the BUILDENV array in %s.")" "$MAKEPKG_CONF"
1817 if [[ -z $FAKEROOTKEY ]]; then
1818 error "$
(gettext "Do not use the '-F' option. This option is only for use by makepkg.")"
1819 exit 1 # TODO: error code
1823 # check for sudo if we will need it during makepkg execution
1824 if (( ! ( ASROOT || INFAKEROOT ) && ( DEP_BIN || RMDEPS || INSTALL ) )); then
1825 if ! type -p sudo >/dev/null; then
1826 warning "$
(gettext "Sudo can not be found. Will use su to acquire root privileges.")"
1830 unset pkgname pkgbase pkgver pkgrel epoch pkgdesc url license groups provides
1831 unset md5sums replaces depends conflicts backup source install changelog build
1832 unset makedepends optdepends options noextract
1834 BUILDFILE=${BUILDFILE:-$BUILDSCRIPT}
1835 if [[ ! -f $BUILDFILE ]]; then
1837 error "$
(gettext "%s does not exist.")" "$BUILDFILE"
1840 # PKGBUILD passed through a pipe
1841 BUILDFILE=/dev/stdin
1845 crlftest=$(file "$BUILDFILE" | grep -F 'CRLF' || true)
1846 if [[ -n $crlftest ]]; then
1847 error "$
(gettext "%s contains CRLF characters and cannot be sourced.")" "$BUILDFILE"
1851 if [[ ${BUILDFILE:0:1} != "/" ]]; then
1852 BUILDFILE="$startdir/$BUILDFILE"
1857 # set defaults if they weren't specified in buildfile
1858 pkgbase=${pkgbase:-${pkgname[0]}}
1861 if (( GENINTEG )); then
1870 # check the PKGBUILD for some basic requirements
1871 check_sanity || exit 1
1873 # We need to run devel_update regardless of whether we are in the fakeroot
1874 # build process so that if the user runs makepkg --forcever manually, we
1875 # 1) output the correct pkgver, and 2) use the correct filename when
1876 # checking if the package file already exists - fixes FS #9194
1880 if (( ${#pkgname[@]} > 1 )); then
1884 # test for available PKGBUILD functions
1885 if declare -f build >/dev/null; then
1888 if declare -f check >/dev/null; then
1889 # "Hide
" check() function if not going to be run
1890 if [[ $RUN_CHECK = 'y' || (! $(check_buildenv check) = "n
" && ! $RUN_CHECK = "n
") ]]; then
1894 if declare -f package >/dev/null; then
1896 elif [[ $SPLITPKG -eq 0 ]] && declare -f package_${pkgname} >/dev/null; then
1900 if [[ -n "${PKGLIST[@]}" ]]; then
1902 pkgname=("${PKGLIST[@]}")
1905 if (( ! SPLITPKG )); then
1906 fullver=$(get_full_version $epoch $pkgver $pkgrel)
1907 if [[ -f $PKGDEST/${pkgname}-${fullver}-${CARCH}${PKGEXT} \
1908 || -f $PKGDEST/${pkgname}-${fullver}-any${PKGEXT} ]] \
1909 && ! (( FORCE || SOURCEONLY || NOBUILD )); then
1910 if (( INSTALL )); then
1911 warning "$
(gettext "A package has already been built, installing existing package...")"
1915 error "$
(gettext "A package has already been built. (use -f to overwrite)")"
1922 for pkg in ${pkgname[@]}; do
1923 # TODO: this wasn't properly fixed in commit 2020e629
1924 fullver=$(get_full_version $epoch $pkgver $pkgrel)
1925 if [[ -f $PKGDEST/${pkg}-${fullver}-${CARCH}${PKGEXT} \
1926 || -f $PKGDEST/${pkg}-${fullver}-any${PKGEXT} ]]; then
1932 if ! (( FORCE || SOURCEONLY || NOBUILD )); then
1933 if (( allpkgbuilt )); then
1934 if (( INSTALL )); then
1935 warning "$
(gettext "The package group has already been built, installing existing packages...")"
1939 error "$
(gettext "The package group has already been built. (use -f to overwrite)")"
1943 if (( somepkgbuilt )); then
1944 error "$
(gettext "Part of the package group has already been built. (use -f to overwrite)")"
1948 unset allpkgbuilt somepkgbuilt
1951 # Run the bare minimum in fakeroot
1952 if (( INFAKEROOT )); then
1953 if (( ! SPLITPKG )); then
1954 if (( ! PKGFUNC )); then
1955 if (( ! REPKG )); then
1956 if (( BUILDFUNC )); then
1958 (( CHECKFUNC )) && run_check
1962 warning "$
(gettext "Repackaging without the use of a package() function is deprecated.")"
1963 plain "$
(gettext "File permissions may not be preserved.")"
1974 msg "$
(gettext "Leaving fakeroot environment.")"
1978 fullver=$(get_full_version $epoch $pkgver $pkgrel)
1979 msg "$
(gettext "Making package: %s")" "$pkgbase $fullver ($
(date))"
1981 # if we are creating a source-only package, go no further
1982 if (( SOURCEONLY )); then
1983 if [[ -f $SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT} ]] \
1984 && (( ! FORCE )); then
1985 error "$
(gettext "A source package has already been built. (use -f to overwrite)")"
1989 msg "$
(gettext "Source package created: %s")" "$pkgbase ($
(date))"
1993 if (( NODEPS || ( (NOBUILD || REPKG) && !DEP_BIN ) )); then
1994 # no warning message needed for nobuild, repkg
1995 if (( NODEPS || ( REPKG && PKGFUNC ) )); then
1996 warning "$
(gettext "Skipping dependency checks.")"
1998 elif type -p "${PACMAN%% *}" >/dev/null; then
1999 if (( RMDEPS )); then
2000 original_pkglist=($(run_pacman -Qq)) # required by remove_dep
2004 msg "$
(gettext "Checking runtime dependencies...")"
2005 resolve_deps ${depends[@]} || deperr=1
2007 msg "$
(gettext "Checking buildtime dependencies...")"
2008 resolve_deps ${makedepends[@]} || deperr=1
2010 if (( CHECKFUNC )); then
2011 resolve_deps ${checkdepends[@]} || deperr=1
2014 if (( RMDEPS )); then
2015 current_pkglist=($(run_pacman -Qq)) # required by remove_deps
2018 if (( deperr )); then
2019 error "$
(gettext "Could not resolve all dependencies.")"
2023 warning "$
(gettext "%s was not found in PATH; skipping dependency checks.")" "${PACMAN%% *}"
2026 # ensure we have a sane umask set
2029 # get back to our src directory so we can begin with sources
2034 if (( NOEXTRACT )); then
2035 warning "$
(gettext "Skipping source retrieval -- using existing src/ tree")"
2036 warning "$
(gettext "Skipping source integrity checks -- using existing src/ tree")"
2037 warning "$
(gettext "Skipping source extraction -- using existing src/ tree")"
2039 if (( NOEXTRACT )) && [[ -z $(ls "$srcdir" 2>/dev/null) ]]; then
2040 error "$
(gettext "The source directory is empty, there is nothing to build!")"
2041 plain "$
(gettext "Aborting...")"
2044 elif (( REPKG )); then
2045 if (( ! PKGFUNC && ! SPLITPKG )) \
2046 && [[ ! -d $pkgdir || -z $(ls "$pkgdir" 2>/dev/null) ]]; then
2047 error "$
(gettext "The package directory is empty, there is nothing to repackage!")"
2048 plain "$
(gettext "Aborting...")"
2053 if (( ! SKIPINTEG )); then
2056 warning "$
(gettext "Skipping integrity checks.")"
2061 if (( NOBUILD )); then
2062 msg "$
(gettext "Sources are ready.")"
2065 # check for existing pkg directory; don't remove if we are repackaging
2066 if [[ -d $pkgdir ]] && (( ! REPKG || PKGFUNC || SPLITPKG )); then
2067 msg "$
(gettext "Removing existing pkg/ directory...")"
2074 # if we are root or if fakeroot is not enabled, then we don't use it
2075 if [[ $(check_buildenv fakeroot) != "y
" ]] || (( EUID == 0 )); then
2076 if (( ! REPKG )); then
2078 (( BUILDFUNC )) && run_build
2079 (( CHECKFUNC )) && run_check
2081 if (( ! SPLITPKG )); then
2082 if (( PKGFUNC )); then
2086 if (( ! REPKG )); then
2089 warning "$
(gettext "Repackaging without the use of a package() function is deprecated.")"
2090 plain "$
(gettext "File permissions may not be preserved.")"
2098 if (( ! REPKG && ( PKGFUNC || SPLITPKG ) )); then
2100 (( BUILDFUNC )) && run_build
2101 (( CHECKFUNC )) && run_check
2105 msg "$
(gettext "Entering fakeroot environment...")"
2107 if [[ -n $newpkgver ]]; then
2108 fakeroot -- $0 --forcever $newpkgver -F "${ARGLIST[@]}" || exit $?
2110 fakeroot -- $0 -F "${ARGLIST[@]}" || exit $?
2115 fullver=$(get_full_version $epoch $pkgver $pkgrel)
2116 msg "$
(gettext "Finished making: %s")" "$pkgbase $fullver ($
(date))"
2122 # vim: set ts=2 sw=2 noet: