Codebase list dh-octave / debian/0.6.0_bpo9+1 dh_octave_make.in
debian/0.6.0_bpo9+1

Tree @debian/0.6.0_bpo9+1 (Download .tar.gz)

dh_octave_make.in @debian/0.6.0_bpo9+1raw · history · blame

#!/usr/bin/perl
# dh_octave_make: Generate a Debian package from the sources of
#     an Octave-Forge package from scratch
# This file is part of the dh-octave Debian package

# Copyright (c) 2012, 2017, 2018  Rafael Laboissière <rafael@laboissiere.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.

=encoding utf8

=head1 NAME

dh_octave_make - generate a Debian package from the sources of an Octave-Forge package

=head1 SYNOPSIS

B<dh_octave_make>

=head1 DESCRIPTION

B<dh_octave_make> is a helper script for generating a first
version of a Debian package for an Octave-Forge package. The command should
be launched from the top directory of the unpacked sources of an
Octave-Forge package.  A file called F<DESCRIPTION> must be present, from
which information about the package is gathered.  The following files
are generated with sensible contents, although they need further editing:

=over

=item debian/changelog

=item debian/compat

=item debian/control

=item debian/copyright

=item debian/rules

=item debian/source/format

=item debian/watch

=back

The files above are only created if they do not exist yet.  This allows
the use of B<dh_octave_make> for updating an already
debianized source tree.

=head1 ENVIRONMENT VARIABLES

The environment variables B<DEBFULLNAME> and B<DEBEMAIL> are used for
generating the identity of the developer, which will appear in
F<debian/changelog> and F<debian/copyright>. If they do not exist, B<FULLNAME>
and B<EMAIL> are used instead.

=head1 DISCLAIMER

B<dh_octave_make> is distributed in the hope that it will be useful,
but B<without any warranty>; without even the implied warranty of
B<merchantability> or B<fitness for a particular purpose>.

=head1 COPYRIGHT

Copyright 2012, 2017, 2018 Rafael Laboissiere

This script is free software; you can redistribute it and/or
modify it under the terms of the GNU GPL, v3 or later.

=head1 AUTHOR

Rafael Laboissiere E<lt>rafael@laboissiere.netE<gt>

=cut

### Get program name
(my $prog = $0) =~ s|.*/||;

### Function for yelling on errrors
sub croak ($) {
    my $message = shift;
    die "$prog:E: $message\n"
}

### The pkgdata hash will store the data in the DESCRIPTION file
my %pkgdata;

### Function for creating a directory if it does not exist yet
sub makedir ($) {
    my $dir = shift;
    -d $dir or mkdir $dir;
}

### Function for opening a file and adding content to it
sub writefile ($$$) {
    my $mode = shift;
    my $file = shift;
    return if mode != "<<" and -e $file;
    my $content = shift;
    open (FID, $mode, $file);
    print FID $content;
    close FID;
}

### Check whether a given field exists in the DESCRIPTION file and exit the
### program with an error message, in the case the field does not exist
sub check ($) {
    my $field = shift;
    exists $pkgdata{$field} or croak "$field not found in DESCRIPTION";
}

### File DESCRIPTION is not present.  Yell loudly.
-f "DESCRIPTION" or croak "File DESCRIPTION not found";

### Read the fields present in the DESCRIPTION file
open (FID, "< DESCRIPTION");
/([^:]+): (.*)/ and $pkgdata{$1} = $2 while (<FID>);
close FID;

### Check for some mandatory fields
check ("Name");
my $name = lc $pkgdata{Name};
check ("Version");
my $version = $pkgdata{Version};
check ("Title");
my $title = $pkgdata{Title};

### Decide on the package's Architecture based on the presence of the src/
### directory, which typically contains C++ files to be compiled.
my $architecture = -d "src" ? "any" : "all";

### Create the debian/ directory, if it does not exist.
makedir "debian";

### Create the debian/compat file.
my $compat = #Compat#;
writefile (">", "debian/compat", "$compat\n");

### Create the debian/watch file.
writefile (">", "debian/watch",
           "version=4
http://sf.net/octave/$name-(.+)\\.tar\\.gz
");

### Create the debian/changelog file.
my $date = qx {date --rfc-2822};
chomp $date;
my $developer = exists $ENV{DEBFULLNAME} ? $ENV{DEBFULLNAME}
                : exists $ENV{FULLNAME} ? $ENV{FULLNAME}
                : "Joe Developer";
my $email = exists $ENV{DEBEMAIL} ? $ENV{DEBEMAIL}
                : exists $ENV{EMAIL} ? $ENV{EMAIL}
                : "joe\@developer.org";
my $author = "$developer <$email>";

writefile (">", "debian/changelog",
           "octave-$name ($version-1) UNRELEASED; urgency=low

  * Initial release (closes: #XXXXXX)

 -- $author  $date
");

### Create the debian/rules file.
writefile (">", "debian/rules",
           "#!/usr/bin/make -f
# -*- makefile -*-

%:
	dh \$@ --buildsystem=octave --with=octave
");
system ("chmod +x debian/rules");

### Create the debian/control file.
my $uploaders = "#Uploaders#";
if ($uploaders ne "") {
    $uploaders = "Uploaders: $uploaders
";
}

my $shlibs = "";
if ($architecture eq "any") {
    $shlibs = ", \${shlibs:Depends}";
}

writefile (">", "debian/control",
           "Source: octave-$name
Section: math
Priority: optional
Maintainer: Debian Octave Group <team+pkg-octave-team\@tracker.debian.org>
${uploaders}Build-Depends: debhelper (>= $compat), dh-octave (>= #Version#)
Standards-Version: #Standards-Version#
Homepage: https://octave.sourceforge.io/$name/
Vcs-Git: #Vcs-Git#
Vcs-Browser: #Vcs-Browser#
Testsuite: autopkgtest-pkg-octave

Package: octave-$name
Architecture: $architecture
Depends: \${misc:Depends}, \${octave:Depends}$shlibs
Description: $title
 \${octave:Upstream-Description}
 .
 This Octave add-on package is part of the Octave-Forge project.
");

### Create the debian/source/format file.
makedir "debian/source";
writefile (">", "debian/source/format", "3.0 (quilt)\n");

### Create the debian/copyright file.
unless (-e "debian/copyright") {

    ## Add the automated part from cme
    system ("cme update dpkg-copyright");

    ## Create the Debian specific part to the debian/control file.
    my $year = qx {date +%Y};
    chomp $year;

    writefile (">>", "debian/copyright",
	       "Files: debian/*
Copyright: $year $author
License: GPL-3+

License: GPL-3+
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 .
 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, see <http://www.gnu.org/licenses/>.
 .
 On Debian systems, the complete text of the GNU General Public
 License, version 3, can be found in the file
 `/usr/share/common-licenses/GPL-3'.
");

}