[Pkg-ocaml-maint-commits] r1197 - in trunk/tools: . dh_ocaml

Stefano Zacchiroli zack@costa.debian.org
Mon, 04 Apr 2005 19:03:36 +0000


Author: zack
Date: 2005-04-04 19:03:36 +0000 (Mon, 04 Apr 2005)
New Revision: 1197

Added:
   trunk/tools/dh_ocaml/
   trunk/tools/dh_ocaml/Makefile
   trunk/tools/dh_ocaml/dh_ocaml
   trunk/tools/dh_ocaml/postinst-ocaml.in
   trunk/tools/dh_ocaml/postrm-ocaml.in
   trunk/tools/dh_ocaml/update-md5sum.sh
Log:
dh_ocaml: checkin



Property changes on: trunk/tools/dh_ocaml
___________________________________________________________________
Name: svn:ignore
   + debhelper-*+dh_ocaml
debhelper_*+dh_ocaml_all.deb
debhelper_*.dsc
debhelper_*.tar.gz
postinst-ocaml
postrm-ocaml


Added: trunk/tools/dh_ocaml/Makefile
===================================================================
--- trunk/tools/dh_ocaml/Makefile	2005-04-04 18:43:51 UTC (rev 1196)
+++ trunk/tools/dh_ocaml/Makefile	2005-04-04 19:03:36 UTC (rev 1197)
@@ -0,0 +1,29 @@
+
+SCRIPTS = postinst-ocaml postrm-ocaml
+# DEBHELPER_VERSION := $(shell grep-available -X -F Package -s Version debhelper | cut -f 2 -d ' ')
+DEBHELPER_VERSION = 4.2.32
+DEBHELPER_DSC = debhelper_$(DEBHELPER_VERSION).dsc
+NEW_DEBHELPER_VERSION = $(DEBHELPER_VERSION)+dh_ocaml
+DEBHELPER_DIR = debhelper-$(DEBHELPER_VERSION)
+NEW_DEBHELPER_DIR = debhelper-$(NEW_DEBHELPER_VERSION)
+
+all: $(SCRIPTS) debhelper
+
+$(DEBHELPER_DSC):
+	apt-get -d source debhelper
+
+debhelper: $(SCRIPTS) $(DEBHELPER_DSC)
+	rm -rf $(DEBHELPER_DIR)/ $(NEW_DEBHELPER_DIR)/
+	dpkg-source -x debhelper_$(DEBHELPER_VERSION).dsc
+	cp dh_ocaml $(DEBHELPER_DIR)/
+	cp $(SCRIPTS) $(DEBHELPER_DIR)/autoscripts/
+	cd $(DEBHELPER_DIR)	\
+		&& dch --newversion $(NEW_DEBHELPER_VERSION) "added dh_ocaml"	\
+		&& debuild binary
+
+%: %.in update-md5sum.sh
+	wml -p 1-3 $< > $@
+
+clean:
+	rm -f $(TARGETS)
+

Added: trunk/tools/dh_ocaml/dh_ocaml
===================================================================
--- trunk/tools/dh_ocaml/dh_ocaml	2005-04-04 18:43:51 UTC (rev 1196)
+++ trunk/tools/dh_ocaml/dh_ocaml	2005-04-04 19:03:36 UTC (rev 1197)
@@ -0,0 +1,256 @@
+#!/usr/bin/perl -w
+#
+# dh_ocaml - debhelper which computes OCaml md5sums and calculates OCaml
+#	     dependencies
+#
+# Copyright (C) 2005, Stefano Zacchiroli <zack@debian.org>
+#
+# Created:	  Fri, 01 Apr 2005 19:50:48 +0200 zack
+# Last-Modified:  Mon, 04 Apr 2005 20:52:23 +0200 zack
+#
+# This is free software, you can redistribute it and/or modify it under the
+# terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307  USA
+#
+
+# TODO ask Joey Hess about how much dh_ocaml follows debhelper guidelines
+# TODO check how dh_ocaml work when multiple binary packages are being built
+# TODO for libraries: add proper dependencies on ocaml (and findlib?)
+# TODO for binaries: check if package is shipping any bytecode binaries (head -1
+#	should be enough) and add proper dependencies on ocaml
+# TODO complete POD documentation
+# TODO add comment headers for uncommented subs
+
+=head1 NAME
+
+dh_ocaml - compute OCaml md5sums and calculate OCaml dependencies
+
+=cut
+
+use strict;
+use Debian::Debhelper::Dh_Lib;
+init();
+
+# dh_perl documentation follows, cut and pasted here since I don't know POD
+# syntax
+# -- Zack
+# 
+# =head1 SYNOPSIS
+# 
+# B<dh_ocaml> [S<I<debhelper options>>] [B<-d>] [S<I<library dirs ...>>]
+# 
+# =head1 DESCRIPTION
+# 
+# dh_perl is a debhelper program that is responsible for generating
+# the ${perl:Depends} substitutions and adding them to substvars files.
+# 
+# The program will look at perl scripts and modules in your package,
+# and will use this information to generate a dependency on perl or
+# perlapi. The dependency will be substituted into your package's control
+# file wherever you place the token "${perl:Depends}".
+# 
+# =head1 OPTIONS
+# 
+# =over 4
+# 
+# =item B<-d>
+# 
+# In some specific cases you may want to depend on perl-base rather than the
+# full perl package. If so, you can pass the -d option to make dh_perl generate
+# a dependency on the correct base package. This is only necessary for some
+# packages that are included in the base system.
+# 
+# Note that this flag may cause no dependency on perl-base to be generated at
+# all. perl-base is Essential, so its dependency can be left out, unless a
+# versioned dependency is needed.
+# 
+# =item B<-V>
+# 
+# By default, scripts and architecture independent modules don't depend
+# on any specific version of perl.  The -V option causes the current
+# version of the perl (or perl-base with -d) package to be specified.
+# 
+# =item I<library dirs>
+# 
+# If your package installs perl modules in non-standard
+# directories, you can make dh_perl check those directories by passing their
+# names on the command line. It will only check the vendorlib and vendorarch
+# directories by default.
+# 
+# =back
+# 
+# =head1 CONFORMS TO
+# 
+# Debian policy, version 3.0.1
+# 
+# Perl policy, version 1.18
+# 
+# =cut
+
+my $ocamlc = "/usr/bin/ocamlc";
+my $ocamlobjinfo = "/usr/bin/ocamlobjinfo";
+foreach my $bin ($ocamlc, $ocamlobjinfo) {
+  error "$bin does not exists or is not executable" unless -x $bin;
+}
+
+my $ocaml_version = `$ocamlc -version`;
+my $ocaml_lib_dir = `$ocamlc -where`;
+chomp ($ocaml_version, $ocaml_lib_dir);
+my $md5sums_dir = "/var/lib/ocaml/md5sums";
+my $md5sums_ext = ".md5sums";
+my $md5sums_registry_path = "$md5sums_dir/MD5SUMS";
+my $dep_substvar = "ocaml:Depends";
+
+# given as input a directory, returns a list of all ocaml objects installed (at
+# any depth) in that directory
+sub find_objects($) {
+  my ($dir) = @_;
+  my $cmd = "find $dir$ocaml_lib_dir -type f -name '*.cma'";
+  verbose_print $cmd;
+  my $out = `$cmd` or error "can't execute \"$cmd\" for pipe-reading";
+  my @objects = split /\n/, $out;
+  return @objects;
+}
+
+# globals
+my %defined_md5sums;  # (unit name -> md5sum) mappings for units _defined_ by
+		      # package's objects
+my %imported_md5sums; # same mappings for units _imported_ by package's objects
+my %md5sums_registry; # parsed version of local md5sums registry
+my $registry_parsed = 0;  # flag used for lazy registry parsing
+
+# given as input a list of ocaml object filenames, fills
+# %{defin,import}ed_md5sums. Use ocamlobjinfo to retrieve md5sum information
+sub compute_md5sums(@) {
+  my @objects = @_;
+  my %md5sums;
+  foreach my $object (@objects) {
+    my $cmd = "$ocamlobjinfo $object";
+    verbose_print "\"$cmd\"";
+    open OBJINFO, "$cmd |" or error "can't execute \"$cmd\" for pipe-reading";
+    my $unit_name = "";
+    while (my $line = <OBJINFO>) {
+      chomp $line;
+      if ($line =~ /^\s*Unit\s+name\s*:\s*(\w+)\s*$/) {
+	$unit_name = $1;
+# 	verbose_print "Unit $unit_name";
+      } elsif ($line =~ /^\s*([0-9A-Fa-f]{32})\s+(\w+)\s*$/) {
+	if ($2 eq $unit_name) {
+	  $defined_md5sums{$2} = $1;
+# 	  verbose_print "Defined $1 $2";
+	} else {
+	  $imported_md5sums{$2} = $1;
+# 	  verbose_print "Imported $1 $2";
+	}
+      }
+    }
+    close OBJINFO;
+  }
+}
+
+# create /var/lib/ocaml/md5sums/ entry and create post{inst,rm} scripts for
+# updating md5sums registry on users' machines
+sub add_md5sums_registry_entry($) {
+  my ($package) = @_;
+  my $tmpdir = tmpdir($package);
+  my $md5sums_fname = "$tmpdir$md5sums_dir/$package$md5sums_ext";
+  doit("mkdir -p " . dirname($md5sums_fname));
+  open MD5SUMS, "> $md5sums_fname";
+  foreach my $unit_name (sort (keys %defined_md5sums)) {
+    print MD5SUMS "$defined_md5sums{$unit_name} $unit_name\n";
+  }
+  close MD5SUMS;
+  if (! $dh{NOSCRIPTS}) {
+    my $sed = "s/#PACKAGE#/$package/; s/#VERSION#/$dh{VERSION}/";
+    autoscript($package, "postinst", "postinst-ocaml", $sed);
+    autoscript($package, "postrm", "postrm-ocaml", $sed);
+  }
+}
+
+# lazy parsing of md5sum registry /var/lib/ocaml/md5sums/MD5SUMS
+sub load_md5sum_registry() {
+  if (! $registry_parsed) {
+    open REGISTRY, $md5sums_registry_path;
+    my $lineno = 0;
+    while (my $line = <REGISTRY>) {
+      $lineno++;
+      chomp $line;
+      next if $line =~ /(^#)|(^\s*$)/;	# skip blank lines and comments
+      if ($line =~ /^([0-9A-Fa-f]{32})(\s+\S+){3}$/) {
+	my ($md5sum, $package, $version, $unit_name) = split /\s+/, $line;
+	# mappings like:
+	# "9b93712a344b3b9849a73ce19d8c72ce Foo_bar"->"libfoo-ocaml-dev 0.2.3-5"
+	my $key = "$md5sum $unit_name";
+	if (exists($md5sums_registry{$key})) {
+	  warning("multiple entries for $key in md5sums registry, "
+	    . "ocaml dependencies may be wrong");
+	}
+	$md5sums_registry{$key} = "$package $version";
+      } else {
+	warning
+	  "can't parse md5sums registry line ($md5sums_registry_path:$lineno)";
+	next;
+      }
+    }
+    close REGISTRY;
+    $registry_parsed = 1;
+  }
+}
+
+sub lookup_dep($$) {
+  my ($md5sum, $unit_name) = @_;
+  load_md5sum_registry();
+  my $dep = $md5sums_registry{"$md5sum $unit_name"};
+  if ($dep) {
+    my ($deppackage, $version) = split /\s+/, $dep;
+    return($deppackage, ">= $version");
+  } else {
+    return(0, 0);
+  }
+}
+
+# compute dependencies of package using md5sum registry installed on the machine
+# which is building the package
+sub fill_substvars($) {
+  my ($package) = @_;
+  my $tmpdir = tmpdir($package);
+  delsubstvar($package, $dep_substvar); # idempotency
+  foreach my $unit_name (sort (keys %imported_md5sums)) {
+    next if exists $defined_md5sums{$unit_name};
+    my ($deppackage, $verinfo) =
+      lookup_dep($imported_md5sums{$unit_name}, $unit_name);
+    addsubstvar($package, $dep_substvar, $deppackage, $verinfo) if $deppackage;
+  }
+}
+
+foreach my $package (@{$dh{DOPACKAGES}}) {
+  next unless $package =~ /^lib.*-ocaml-dev$/;
+  isnative($package);	# sets $dh{VERSION}
+  my $tmpdir = tmpdir($package);
+  my @objects = find_objects($tmpdir);
+  compute_md5sums(@objects);  # fills %{defined,imported}_md5sums globals
+  add_md5sums_registry_entry($package);
+  fill_substvars($package);
+}
+
+=head1 SEE ALSO
+
+L<debhelper(7)>
+
+This program is a part of debhelper.
+
+=head1 AUTHOR
+
+Stefano Zacchiroli <zack@debian.org>
+
+=cut
+


Property changes on: trunk/tools/dh_ocaml/dh_ocaml
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/tools/dh_ocaml/postinst-ocaml.in
===================================================================
--- trunk/tools/dh_ocaml/postinst-ocaml.in	2005-04-04 18:43:51 UTC (rev 1196)
+++ trunk/tools/dh_ocaml/postinst-ocaml.in	2005-04-04 19:03:36 UTC (rev 1197)
@@ -0,0 +1,8 @@
+MD5SUMS_DIR="/var/lib/ocaml/md5sums"
+MD5SUMS_EXT=".md5sums"
+MD5SUMS_INDEX="$MD5SUMS_DIR/MD5SUMS"
+if [ "$1" = "configure" ]; then
+#include "update-md5sum.sh"
+fi
+
+# vim: set ft=wml:

Added: trunk/tools/dh_ocaml/postrm-ocaml.in
===================================================================
--- trunk/tools/dh_ocaml/postrm-ocaml.in	2005-04-04 18:43:51 UTC (rev 1196)
+++ trunk/tools/dh_ocaml/postrm-ocaml.in	2005-04-04 19:03:36 UTC (rev 1197)
@@ -0,0 +1,12 @@
+MD5SUMS_DIR="/var/lib/ocaml/md5sums"
+MD5SUMS_EXT=".md5sums"
+MD5SUMS_INDEX="$MD5SUMS_DIR/MD5SUMS"
+if [ "$1" = "remove" ]; then
+#include "update-md5sum.sh"
+  if [ ! -s $MD5SUMS_INDEX ]; then  # index is empty, remove it
+    rm -f $MD5SUMS_INDEX
+  fi
+  rmdir --ignore-fail-on-non-empty $MD5SUMS_DIR `dirname $MD5SUMS_DIR`
+fi
+
+# vim: set ft=wml:

Added: trunk/tools/dh_ocaml/update-md5sum.sh
===================================================================
--- trunk/tools/dh_ocaml/update-md5sum.sh	2005-04-04 18:43:51 UTC (rev 1196)
+++ trunk/tools/dh_ocaml/update-md5sum.sh	2005-04-04 19:03:36 UTC (rev 1197)
@@ -0,0 +1,4 @@
+  find $MD5SUMS_DIR -name "*$MD5SUMS_EXT" -exec cat {} \; 2> /dev/null |
+  while read md5sum unit; do
+    echo "$md5sum #PACKAGE# #VERSION# $unit"
+  done > $MD5SUMS_INDEX