[pacman-dev] [PATCH v4] Add makepkg-template
Allan McRae
allan at archlinux.org
Mon May 6 00:50:08 EDT 2013
On 03/05/13 04:55, Florian Pritz wrote:
> This allows for somewhat easy templating for PKGBUILDs.
>
> Signed-off-by: Florian Pritz <bluewind at xinu.at>
> ---
>
> v4:
> - added support for "-" to --input and --output (stdin/stdout)
> - adapted manpage and fixed ordering of the arguments to the example diff call
> - lots of code suggestion + fixes by Andrew
Looks much better. Mainly minor editorial comments below.
> Dave raised that questions: Do we care that my diff example in the manpage uses
> "<()" which is a bashism?
>
> Given it's only an example and should be understandable even if you don't use
> bash I think it's better to keep it short rather than have it work everywhere.
I don't care, because I use bash... and makepkg is bash too. But if
someone provides a good argument against it, I will agree with them.
> Opinions welcome.
>
> configure.ac | 9 +++
> doc/.gitignore | 1 +
> doc/Makefile.am | 4 +
> doc/makepkg-template.1.txt | 132 ++++++++++++++++++++++++++++++++
> scripts/.gitignore | 1 +
> scripts/Makefile.am | 11 +++
> scripts/makepkg-template.pl.in | 167 +++++++++++++++++++++++++++++++++++++++++
> 7 files changed, 325 insertions(+)
> create mode 100644 doc/makepkg-template.1.txt
> create mode 100755 scripts/makepkg-template.pl.in
>
> diff --git a/configure.ac b/configure.ac
> index 81bc1b3..3b0c62c 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -97,6 +97,11 @@ AC_ARG_WITH(buildscript,
> AS_HELP_STRING([--with-buildscript=name], [set the build script name used by makepkg]),
> [BUILDSCRIPT=$withval], [BUILDSCRIPT=PKGBUILD])
>
> +# Help line for buildscript filename
> +AC_ARG_WITH(template-dir,
> + AS_HELP_STRING([--with-template-dir=name], [set the template dir used by makepkg-template]),
> + [TEMPLATE_DIR=$withval], [TEMPLATE_DIR=/usr/share/makepkg-template])
> +
Do we want that to be --with-makepkg-template-dir? I am always worried
about too generic configure names and future conflicts.
> # Help line for debug package suffix
> AC_ARG_WITH(debug-suffix,
> AS_HELP_STRING([--with-debug-suffix=name], [set the suffix for split debugging symbol packages used by makepkg]),
> @@ -457,6 +462,9 @@ AC_DEFINE_UNQUOTED([SRCEXT], "$SRCEXT", [The file extension used by pacman sourc
> # Set makepkg build script name
> AC_SUBST(BUILDSCRIPT)
> AC_DEFINE_UNQUOTED([BUILDSCRIPT], "$BUILDSCRIPT", [The build script name used by makepkg])
> +# Set makepkg-template template dir
> +AC_SUBST(TEMPLATE_DIR)
> +AC_DEFINE_UNQUOTED([TEMPLATE_DIR], "$TEMPLATE_DIR", [The template dir used by makepkg-teplate])
> # Set makepkg split debugging symbol package suffix
> AC_SUBST(DEBUGSUFFIX)
> AC_DEFINE_UNQUOTED([DEBUGSUFFIX], "$DEBUGSUFFIX", [The suffix for debugging symbol packages used by makepkg])
> @@ -524,6 +532,7 @@ ${PACKAGE_NAME}:
> package extension : ${PKGEXT}
> source pkg extension : ${SRCEXT}
> build script name : ${BUILDSCRIPT}
> + template dir : ${TEMPLATE_DIR}
>
> Compilation options:
> Use libcurl : ${have_libcurl}
> diff --git a/doc/.gitignore b/doc/.gitignore
> index a96ddb3..ad496ce 100644
> --- a/doc/.gitignore
> +++ b/doc/.gitignore
> @@ -1,6 +1,7 @@
> PKGBUILD.5
> libalpm.3
> makepkg.8
> +makepkg-template.1
> makepkg.conf.5
> pacman.8
> pacman-key.8
> diff --git a/doc/Makefile.am b/doc/Makefile.am
> index bcb05b7..cb01255 100644
> --- a/doc/Makefile.am
> +++ b/doc/Makefile.am
> @@ -6,6 +6,7 @@
> ASCIIDOC_MANS = \
> pacman.8 \
> makepkg.8 \
> + makepkg-template.1 \
> repo-add.8 \
> vercmp.8 \
> pkgdelta.8 \
> @@ -21,6 +22,7 @@ DOXYGEN_MANS = $(wildcard man3/*.3)
> HTML_MANPAGES = \
> pacman.8.html \
> makepkg.8.html \
> + makepkg-template.1.html \
> repo-add.8.html \
> vercmp.8.html \
> pkgdelta.8.html \
> @@ -46,6 +48,7 @@ EXTRA_DIST = \
> asciidoc-override.css \
> pacman.8.txt \
> makepkg.8.txt \
> + makepkg-template.1.txt \
> repo-add.8.txt \
> vercmp.8.txt \
> pkgdelta.8.txt \
> @@ -147,6 +150,7 @@ $(HTML_OTHER): asciidoc.conf Makefile.am
> # Dependency rules
> pacman.8 pacman.8.html: pacman.8.txt
> makepkg.8 makepkg.8.html: makepkg.8.txt
> +makepkg-template.1 makepkg-template.1.html: makepkg-template.1.txt
> repo-add.8 repo-add.8.html: repo-add.8.txt
> vercmp.8 vercmp.8.html: vercmp.8.txt
> pkgdelta.8 pkgdelta.8.html: pkgdelta.8.txt
> diff --git a/doc/makepkg-template.1.txt b/doc/makepkg-template.1.txt
> new file mode 100644
> index 0000000..2f86e8f
> --- /dev/null
> +++ b/doc/makepkg-template.1.txt
> @@ -0,0 +1,132 @@
> +/////
> +vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
> +/////
> +makepkg-template(1)
That this is in a different place to the makepkg(8) man page annoys
me... but I think I'll lean towards makepkg(8) being in the wrong place.
> +===================
> +
> +Name
> +----
> +makepkg-template - package build templating utility
> +
> +
> +Synopsis
> +--------
> +'makepkg-template' [options]
> +
> +
> +Description
> +-----------
> +
> +'makepkg-template' is a script to ease the work of maintaining multiple similar
> +PKGBUILDs. It allows you to move most of the code from the PKGBUILD into a
> +template file and uses markers to allow in-place updating of existing PKGBUILDs
> +if the template has been changed.
> +
> +Template files can contain any code allowed in a PKGBUILD. You can think of
> +them like external files included with "." or "source", but they will be
> +inlined into the PKGBUILD by 'makepkg-template' so you do not depend on the
> +template file if you wish to build the package.
template file when building the package
> +
> +Markers are bash comments in the form of:
> +
> + # template start; key=value; key2=value2; ...
> +
> +and
> +
> + # template end;
> +
> +Currently used keys are: name (mandatory) and version. Values are limited to
> +alphanumerics, "@", "+", ".", "-" and "_".
That is a limit for the values for the name. Version is quite
differently limited.
> +For initial creation there is a one line shortcut which doesn't need an end:
short-cut (needs a hyphen I think)
does not (abbreviations are bad for understandability, especially for
non-native speakers)
need an end statement/comment/marker?
> +
> + # template input; key=value;
> +
> +If you use this 'makepkg-template' will replace it with start and end markers
Using this short-cut will result in 'makepkg-template' replacing it with...
> +and the template code on the first run.
> +
> +Template files should be stored in one directory and filenames should be
> +"$template_name-$version.template" with a symlink "$template_name.template"
> +pointing to the most recent template.
> +
No new paragraph
> +If the version is not set in the marker, 'makepkg-template' will automatically
> +use the most recent version of the template, otherwise the specified version
> +will be used.
> +
No new paragraph
> +This allows for easier verification of untrused PKGBUILDs if the template is
trusted
> +trusted. You verify the non-template code and then use a command similar to
> +this:
> +
> + diff -u <(makepkg-template -o -) PKGBUILD
> +
> +Template files may also contain markers leading to nested templates in the
> +resulting PKGBUILD. If you use markers in a template, please set the version
> +you used/tested with in the start/input marker so other people can properly
> +recreate from templates.
> +
> +Options
> +-------
> +
> +*-p, \--input* <buildscript>::
> + Read the package script `buildscript` instead of the `PKGBUILD` default.
> +
> +*-o, \--output* <buildscript>::
> + Write the updated file to `buildscript` instead of overwriting the input file.
> +
> +*-n, \--newest*::
> + Always use the newest available template file.
> +
> +*\--template-dir* <dir>::
> + Change the dir where we are looking for template files.
> +
> +Example PKGBUILD
> +----------------
> +
> + pkgname=perl-config-simple
> + pkgver=4.58
> + pkgrel=1
> + pkgdesc="simple configuration file class"
> + arch=(any)
> + license=(PerlArtistic GPL)
> + depends=('perl')
> + source=("http://search.cpan.org/CPAN/authors/id/S/SH/SHERZODR/Config-Simple-${pkgver}.tar.gz")
> + md5sums=(f014aec54f0a1e2e880d317180fce502)
> + _distname="Config-Simple"
> +
> + # template start; name=perl-module; version=1.0;
> + options=(!emptydirs)
options+=
> + _distdir="${_distname}-${pkgver}"
> + url="https://metacpan.org/release/${_distname}"
> +
> + build() {
> + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \
> + PERL_AUTOINSTALL=--skipdeps \
> + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$pkgdir'" \
> + PERL_MB_OPT="--installdirs vendor --destdir '$pkgdir'" \
Do you really require $pkgdir to be used during build... Not a great
practise given who know what it is set to in split-packages (well, I
know... but the point stands!)
> + MODULEBUILDRC=/dev/null
> +
> + cd "$srcdir/$_distdir"
> + /usr/bin/perl Makefile.PL
Why full path?
> + make
> + }
> +
> + check() {
> + export PERL_MM_USE_DEFAULT=1 PERL5LIB=""
> + cd "$srcdir/$_distdir"
> + make test
> + }
> +
> + package() {
> + cd "$srcdir/$_distdir"
> + make DESTDIR="$pkgdir" install
> + find "$pkgdir" -name .packlist -o -name perllocal.pod -delete
> + }
> + # template end;
> +
> +
> +
> +See Also
> +--------
> +linkman:makepkg[8], linkman:PKGBUILD[5]
> +
> +include::footer.txt[]
> diff --git a/scripts/.gitignore b/scripts/.gitignore
> index 9e403bf..26e088b 100644
> --- a/scripts/.gitignore
> +++ b/scripts/.gitignore
> @@ -1,4 +1,5 @@
> makepkg
> +makepkg-template
> pacman-db-upgrade
> pacman-key
> pacman-optimize
> diff --git a/scripts/Makefile.am b/scripts/Makefile.am
> index 784b180..1f3bae2 100644
> --- a/scripts/Makefile.am
> +++ b/scripts/Makefile.am
> @@ -5,6 +5,7 @@ SUBDIRS = po
>
> bin_SCRIPTS = \
> $(OURSCRIPTS) \
> + makepkg-template \
> repo-remove \
> repo-elephant
>
> @@ -18,6 +19,7 @@ OURSCRIPTS = \
>
> EXTRA_DIST = \
> makepkg.sh.in \
> + makepkg-template.pl.in \
> pacman-db-upgrade.sh.in \
> pacman-key.sh.in \
> pacman-optimize.sh.in \
> @@ -54,6 +56,7 @@ edit = sed \
> -e 's|@PACKAGE_BUGREPORT[@]|$(PACKAGE_BUGREPORT)|g' \
> -e 's|@PACKAGE_NAME[@]|$(PACKAGE_NAME)|g' \
> -e 's|@BUILDSCRIPT[@]|$(BUILDSCRIPT)|g' \
> + -e 's|@TEMPLATE_DIR[@]|$(TEMPLATE_DIR)|g' \
> -e 's|@DEBUGSUFFIX[@]|$(DEBUGSUFFIX)|g' \
> -e "s|@INODECMD[@]|$(INODECMD)|g" \
> -e 's|@SIZECMD[@]|$(SIZECMD)|g' \
> @@ -76,6 +79,14 @@ makepkg: \
> $(srcdir)/makepkg.sh.in \
> $(srcdir)/library/parseopts.sh
>
> +makepkg-template: \
> + $(srcdir)/makepkg-template.pl.in \
> + Makefile
> +
> + $(AM_V_at)$(RM) -f makepkg-template
> + $(AM_V_GEN)$(edit) $< > $@
> + $(AM_V_at)chmod +x,a-w $@
> +
> pacman-db-upgrade: \
> $(srcdir)/pacman-db-upgrade.sh.in \
> $(srcdir)/library/output_format.sh
> diff --git a/scripts/makepkg-template.pl.in b/scripts/makepkg-template.pl.in
> new file mode 100755
I can comment on the perl. Just a query if this is written in a certain
version of perl? Or would it be quite compatible with an older perl 5.x
release? In not we should add an autoconf check.
Allan
More information about the pacman-dev
mailing list