On 03/05/13 04:55, Florian Pritz wrote:
This allows for somewhat easy templating for PKGBUILDs.
Signed-off-by: Florian Pritz <bluewind@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