[arch-general] makepkg patch - generate .SRCINFO file when running "--source"

vlad vla at uni-bonn.de
Tue Jul 27 09:25:56 EDT 2010


Hello list,

Here is a patch against makepkg from git which introduces a new function
"write_srcinfo()". This generates a file .SRCINFO - like the .PKGINFO
one - when "makepkg --source" is run and then it is added to the src.tar.gz
archive. 
I think having such a file is an important step for getting split packages to
the AUR. It is also useful for third party applications. Since this file is
generated during making the source archive, there is no need for parsing/sourcing
the PKGBUILD everytime meta infos are needed afterwards.
This is also a way of standardizing the source archive.

.SRCINFO looks like (generated for gcc from core):
"
# Generated by makepkg 3.4.0
# Tue Jul 27 12:56:38 UTC 2010
global pkgbase = gcc
global pkgname = gcc
global pkgname = gcc-libs
global pkgname = gcc-fortran
global pkgname = gcc-objc
global pkgname = gcc-ada
global pkgver = 4.5.0-6
global pkgdesc = The GNU Compiler Collection
global url = http://gcc.gnu.org
global packager = Vlad George <donvla at users.sourceforge.net>
global builddate = 1280235398
global source = ftp://gcc.gnu.org/pub/gcc/snapshots/4.5-20100610/gcc-core-4.5-20100610.tar.bz2
global source = ftp://gcc.gnu.org/pub/gcc/snapshots/4.5-20100610/gcc-g++-4.5-20100610.tar.bz2
global source = ftp://gcc.gnu.org/pub/gcc/snapshots/4.5-20100610/gcc-fortran-4.5-20100610.tar.bz2
global source = ftp://gcc.gnu.org/pub/gcc/snapshots/4.5-20100610/gcc-objc-4.5-20100610.tar.bz2
global source = ftp://gcc.gnu.org/pub/gcc/snapshots/4.5-20100610/gcc-ada-4.5-20100610.tar.bz2
global source = ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/libstdc++-man.20100312.tar.bz2
global source = gcc_pure64.patch
global source = gcc-hash-style-both.patch
global source = r160561.patch
global license = GPL
global license = LGPL
global license = custom
global arch = i686
global arch = x86_64
global makedepends = binutils>=2.20.1
global makedepends = libmpc>=0.8.2-2
global makedepends = cloog-ppl>=0.15.8
global makedepends = libelf
global makedepends = gcc-ada
gcc depends = binutils>=2.20.1
gcc depends = libmpc>=0.8.1-2
gcc depends = cloog-ppl>=0.15.8
gcc depends = libelf
gcc groups = base-devel
gcc install = gcc.install
gcc-libs pkgdesc = Runtime libraries shipped by GCC for C and C++ languages
gcc-libs groups = base
gcc-libs depends = glibc>=2.11.1-2
gcc-libs install = gcc-libs.install
gcc-fortran pkgdesc = Fortran front-end for GCC
gcc-fortran depends = gcc=4.5.0-6
gcc-fortran install = gcc-fortran.install
gcc-objc pkgdesc = Objective-C front-end for GCC
gcc-objc depends = gcc=4.5.0-6
gcc-ada pkgdesc = Ada front-end for GCC (GNAT)
gcc-ada depends = gcc=4.5.0-6
gcc-ada install = gcc-ada.install 
"

As you see this file contains of different parts separated by a leading
tag. "global" denotes the global PKGBUILD vars and the name of the split
package denotes the local package variables. However, this is just a
first formatting approach. This can be changed according to further
needs. I think this is a clear and easily readable/parseable output.
Note that "packager" defaults to the person who actually build the
source archive. Perhaps this has to be changed to AUR user name, not to
the makepkg.conf PACKAGER entry.

Vlad

-- 
-------------- next part --------------
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 9f3bbb2..ebc6087 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -961,6 +961,75 @@ write_pkginfo() {
 	fi
 }
 
+write_srcinfo() {
+# usage: write_srcinfo name
+
+	local packager
+	if [[ -n ${PACKAGER} ]]; then packager="${PACKAGER}"
+	else packager="none"; fi
+	local builddate=$(date -u "+%s")
+
+	msg2 "$(gettext "Generating .SRCINFO file...")"
+	echo "# Generated by makepkg $myver"
+	echo "# $(LC_ALL=C date -u)"
+	# use "global" as tag for vars needed in entire $BUILDFILE
+	if (( SPLITPKG )); then
+		echo "global pkgbase = ${pkgbase}"
+		printf "global pkgname = %s\n"	"${pkgname[@]}"
+	else echo "global pkgname = $1"
+	fi
+	echo "global pkgver = ${pkgver}-${pkgrel}"
+	echo "global pkgdesc = ${pkgdesc}"
+	echo "global url = ${url}"
+	echo "global packager = ${packager}"
+	echo "global builddate = $builddate"
+	[[ ${changelog} ]]    && echo "global changelog = ${changelog}"
+
+  # arrays
+	[[ ${source} ]]       && printf "global source = %s\n"       "${source[@]}" 
+	[[ ${license} ]]      && printf "global license = %s\n"     "${license[@]}"
+	[[ ${groups} ]]       && printf "global group = %s\n"       "${groups[@]}"
+	printf "global arch = %s\n"        "${arch[@]}"
+	[[ ${backup} ]]       && printf "global backup = %s\n"      "${backup[@]}"
+	[[ ${depends} ]]      && printf "global depends = %s\n"      "${depends[@]}"
+	[[ ${makedepends} ]]  && printf "global makedepends = %s\n"  "${makedepends[@]}"
+	[[ ${optdepends} ]]   && printf "global optdepends = %s\n"   "${optdepends[@]}"
+	[[ ${conflicts} ]]    && printf "global conflict = %s\n"    "${conflicts[@]}"
+	[[ ${provides} ]]     && printf "global provides = %s\n"    "${provides[@]}"
+	[[ ${replaces} ]]     && printf "global replaces = %s\n"    "${replaces[@]}"
+
+	if (( SPLITPKG )); then 
+		local name vararray override tempvar
+		IFS=$'\n'
+		for name in "${pkgname[@]}"; do
+			# use $name as tag for vars needed only in package_$name 
+			# standardize function formatting: delete whitespaces/tabs at the beginning and 
+			# change trailing character to \n at the end of each line inside function; grep the variables  
+			vararray=( $(declare -f "package_${name}" | /bin/sed -e "s/^[ \t]*//" -e "s/;$/\n/" | /bin/grep -e "^[[:alpha:]]*=") )
+			for override in "${vararray[@]}"; do
+				tempvar="${override%%=*}"
+				# first check if var is in allowed overrides (splitpkg_overrides)
+				if [[ ${splitpkg_overrides[*]} =~ " ${tempvar} " ]]; then
+					declare -a temparray 
+					eval temparray="${override#*=}"
+					[[ "${tempvar}" == "pkgrel" ]] && printf "${name} pkgver = ${pkgver}-${temparray[0]}\n" && continue
+					printf "${name} ${tempvar} = %s\n" "${temparray[@]}"
+					unset temparray
+				fi
+				unset tempvar
+			done
+		done
+		unset IFS
+	fi	
+
+	# TODO maybe remove this at some point
+	# warn if license array is not present or empty
+	if [[ -z ${license} ]]; then
+		warning "$(gettext "Please add a license line to your %s!")" "${BUILDSCRIPT}"
+		plain "$(gettext "Example for GPL\'ed software: license=('GPL').")"
+	fi
+}
+
 check_package() {
 	cd "$pkgdir"
 
@@ -1091,6 +1160,8 @@ create_srcpackage() {
 	local srclinks="$(mktemp -d "$startdir"/srclinks.XXXXXXXXX)"
 	mkdir "${srclinks}"/${pkgbase}
 
+	write_srcinfo ${pkgbase} > "${srclinks}/${pkgbase}/.SRCINFO"
+
 	msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
 	ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
 


More information about the arch-general mailing list