[pacman-dev] [PATCH] makepkg: allow the use of only a package() function

Cedric Staniewski cedric at gmx.ca
Tue Oct 27 07:56:13 EDT 2009


For some packages, generally the 'any' arch ones, a build step is not
required and therefore can be skipped. In these cases, a package()
function without a build() one is sufficient.

As a side effect, this commit makes meta packages without any function
at all in the PKGBUILD possible.

Fixes FS#15147.

Signed-off-by: Cedric Staniewski <cedric at gmx.ca>
---
 doc/PKGBUILD.5.txt    |   12 ++++++------
 scripts/makepkg.sh.in |   17 +++++++++++++----
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt
index 28dd8c7..2d6589b 100644
--- a/doc/PKGBUILD.5.txt
+++ b/doc/PKGBUILD.5.txt
@@ -233,10 +233,10 @@ name. The syntax is: `source=('filename::url')`.
 
 build() Function
 ----------------
-In addition to the above directives, the build() bash function comprises the
-remainder of the PKGBUILD. This is directly sourced and executed by makepkg, so
-anything that bash or the system has available is available for use here. Be
-sure any exotic commands used are covered by `makedepends`.
+In addition to the above directives, the optional build() bash function usually
+comprises the remainder of the PKGBUILD. This is directly sourced and executed by
+makepkg, so anything that bash or the system has available is available for use
+here. Be sure any exotic commands used are covered by `makedepends`.
 
 All of the above variables such as `pkgname` and `pkgver` are available for use
 in the build function. In addition, makepkg defines three variables for your
@@ -263,8 +263,8 @@ package() Function
 An optional package() function can be specified in addition to the build() function.
 This function is run immediately after the build() function. When specified in
 combination with the fakeroot BUILDENV option in linkman:makepkg.conf[5], fakeroot
-usage will be limited to running the packaging stage. The build() function will be
-run as the user calling makepkg.
+usage will be limited to running the packaging stage. An existing build() function
+will be run as the user calling makepkg.
 
 Package Splitting
 -----------------
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index a6780d7..2b540b4 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -72,6 +72,7 @@ LOGGING=0
 SOURCEONLY=0
 IGNOREARCH=0
 HOLDVER=0
+BUILDFUNC=0
 PKGFUNC=0
 SPLITPKG=0
 PKGLIST=""
@@ -140,7 +141,9 @@ clean_up() {
 		rm -rf "$pkgdir" "$srcdir"
 		if [ -n "$pkgbase" ]; then
 			# Can't do this unless the BUILDSCRIPT has been sourced.
-			rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"*
+			if (( BUILDFUNC )); then
+				rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"*
+			fi
 			if [ "$PKGFUNC" -eq 1 ]; then
 				rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
 			elif [ "$SPLITPKG" -eq 1 ]; then
@@ -1754,6 +1757,12 @@ if [ "${#pkgname[@]}" -gt "1" ]; then
 	SPLITPKG=1
 fi
 
+# test for available PKGBUILD functions
+# The exclamation mark is required here to avoid triggering the ERR trap when
+# a tested function does not exist.
+if [[ $(! type -t build) = "function" ]]; then
+	BUILDFUNC=1
+fi
 if [ "$(type -t package)" = "function" ]; then
 	PKGFUNC=1
 elif [ $SPLITPKG -eq 0 -a "$(type -t package_${pkgname})" = "function" ]; then
@@ -1814,7 +1823,7 @@ fi
 if [ "$INFAKEROOT" -eq 1 ]; then
 	if [ "$SPLITPKG" -eq 0 ]; then
 		if [ "$PKGFUNC" -eq 0 ]; then
-			if [ "$REPKG" -eq 0 ]; then
+			if (( BUILDFUNC && ! REPKG )); then
 				run_build
 				tidy_install
 			fi
@@ -1928,7 +1937,7 @@ else
 	if [ "$(check_buildenv fakeroot)" != "y" -o $EUID -eq 0 ]; then
 		if [ "$REPKG" -eq 0 ]; then
 			devel_update
-			run_build
+			(( BUILDFUNC )) && run_build
 		fi
 		if [ "$SPLITPKG" -eq 0 ]; then
 			if [ "$PKGFUNC" -eq 1 ]; then
@@ -1953,7 +1962,7 @@ else
 	else
 		if [ "$REPKG" -eq 0 -a \( "$PKGFUNC" -eq 1 -o "$SPLITPKG" -eq 1 \) ]; then
 			devel_update
-			run_build
+			(( BUILDFUNC )) && run_build
 			cd "$startdir"
 		fi
 
-- 
1.6.5.2



More information about the pacman-dev mailing list