parent
d70a1dab15
commit
e6478eee5c
@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
libtoolize --force
|
|
||||||
aclocal
|
|
||||||
autoheader
|
|
||||||
automake --force-missing --add-missing
|
|
||||||
autoconf
|
|
||||||
@ -0,0 +1 @@
|
|||||||
|
link-warning.h
|
||||||
@ -0,0 +1,554 @@
|
|||||||
|
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
|
||||||
|
& eval 'exec perl -wS "$0" $argv:q'
|
||||||
|
if 0;
|
||||||
|
# Generate a release announcement message.
|
||||||
|
|
||||||
|
my $VERSION = '2015-01-28 12:02'; # UTC
|
||||||
|
# The definition above must lie within the first 8 lines in order
|
||||||
|
# for the Emacs time-stamp write hook (at end) to update it.
|
||||||
|
# If you change this file with Emacs, please let the write hook
|
||||||
|
# do its job. Otherwise, update this string manually.
|
||||||
|
|
||||||
|
# Copyright (C) 2002-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
# Written by Jim Meyering
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
use Digest::MD5;
|
||||||
|
use Digest::SHA1;
|
||||||
|
use POSIX qw(strftime);
|
||||||
|
|
||||||
|
(my $ME = $0) =~ s|.*/||;
|
||||||
|
|
||||||
|
my %valid_release_types = map {$_ => 1} qw (alpha beta stable);
|
||||||
|
my @archive_suffixes = ('tar.gz', 'tar.bz2', 'tar.lzma', 'tar.xz');
|
||||||
|
my $srcdir = '.';
|
||||||
|
|
||||||
|
sub usage ($)
|
||||||
|
{
|
||||||
|
my ($exit_code) = @_;
|
||||||
|
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||||
|
if ($exit_code != 0)
|
||||||
|
{
|
||||||
|
print $STREAM "Try '$ME --help' for more information.\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my @types = sort keys %valid_release_types;
|
||||||
|
print $STREAM <<EOF;
|
||||||
|
Usage: $ME [OPTIONS]
|
||||||
|
Generate an announcement message. Run this from builddir.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
|
||||||
|
These options must be specified:
|
||||||
|
|
||||||
|
--release-type=TYPE TYPE must be one of @types
|
||||||
|
--package-name=PACKAGE_NAME
|
||||||
|
--previous-version=VER
|
||||||
|
--current-version=VER
|
||||||
|
--gpg-key-id=ID The GnuPG ID of the key used to sign the tarballs
|
||||||
|
--url-directory=URL_DIR
|
||||||
|
|
||||||
|
The following are optional:
|
||||||
|
|
||||||
|
--news=NEWS_FILE include the NEWS section about this release
|
||||||
|
from this NEWS_FILE; accumulates.
|
||||||
|
--srcdir=DIR where to find the NEWS_FILEs (default: $srcdir)
|
||||||
|
--bootstrap-tools=TOOL_LIST a comma-separated list of tools, e.g.,
|
||||||
|
autoconf,automake,bison,gnulib
|
||||||
|
--gnulib-version=VERSION report VERSION as the gnulib version, where
|
||||||
|
VERSION is the result of running git describe
|
||||||
|
in the gnulib source directory.
|
||||||
|
required if gnulib is in TOOL_LIST.
|
||||||
|
--no-print-checksums do not emit MD5 or SHA1 checksums
|
||||||
|
--archive-suffix=SUF add SUF to the list of archive suffixes
|
||||||
|
--mail-headers=HEADERS a space-separated list of mail headers, e.g.,
|
||||||
|
To: x\@example.com Cc: y-announce\@example.com,...
|
||||||
|
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
exit $exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
=item C<%size> = C<sizes (@file)>
|
||||||
|
|
||||||
|
Compute the sizes of the C<@file> and return them as a hash. Return
|
||||||
|
C<undef> if one of the computation failed.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub sizes (@)
|
||||||
|
{
|
||||||
|
my (@file) = @_;
|
||||||
|
|
||||||
|
my $fail = 0;
|
||||||
|
my %res;
|
||||||
|
foreach my $f (@file)
|
||||||
|
{
|
||||||
|
my $cmd = "du -h $f";
|
||||||
|
my $t = `$cmd`;
|
||||||
|
# FIXME-someday: give a better diagnostic, a la $PROCESS_STATUS
|
||||||
|
$@
|
||||||
|
and (warn "command failed: '$cmd'\n"), $fail = 1;
|
||||||
|
chomp $t;
|
||||||
|
$t =~ s/^\s*([\d.]+[MkK]).*/${1}B/;
|
||||||
|
$res{$f} = $t;
|
||||||
|
}
|
||||||
|
return $fail ? undef : %res;
|
||||||
|
}
|
||||||
|
|
||||||
|
=item C<print_locations ($title, \@url, \%size, @file)
|
||||||
|
|
||||||
|
Print a section C<$title> dedicated to the list of <@file>, which
|
||||||
|
sizes are stored in C<%size>, and which are available from the C<@url>.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub print_locations ($\@\%@)
|
||||||
|
{
|
||||||
|
my ($title, $url, $size, @file) = @_;
|
||||||
|
print "Here are the $title:\n";
|
||||||
|
foreach my $url (@{$url})
|
||||||
|
{
|
||||||
|
for my $file (@file)
|
||||||
|
{
|
||||||
|
print " $url/$file";
|
||||||
|
print " (", $$size{$file}, ")"
|
||||||
|
if exists $$size{$file};
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
=item C<print_checksums (@file)
|
||||||
|
|
||||||
|
Print the MD5 and SHA1 signature section for each C<@file>.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub print_checksums (@)
|
||||||
|
{
|
||||||
|
my (@file) = @_;
|
||||||
|
|
||||||
|
print "Here are the MD5 and SHA1 checksums:\n";
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
foreach my $meth (qw (md5 sha1))
|
||||||
|
{
|
||||||
|
foreach my $f (@file)
|
||||||
|
{
|
||||||
|
open IN, '<', $f
|
||||||
|
or die "$ME: $f: cannot open for reading: $!\n";
|
||||||
|
binmode IN;
|
||||||
|
my $dig =
|
||||||
|
($meth eq 'md5'
|
||||||
|
? Digest::MD5->new->addfile(*IN)->hexdigest
|
||||||
|
: Digest::SHA1->new->addfile(*IN)->hexdigest);
|
||||||
|
close IN;
|
||||||
|
print "$dig $f\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
=item C<print_news_deltas ($news_file, $prev_version, $curr_version)
|
||||||
|
|
||||||
|
Print the section of the NEWS file C<$news_file> addressing changes
|
||||||
|
between versions C<$prev_version> and C<$curr_version>.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub print_news_deltas ($$$)
|
||||||
|
{
|
||||||
|
my ($news_file, $prev_version, $curr_version) = @_;
|
||||||
|
|
||||||
|
my $news_name = $news_file;
|
||||||
|
$news_name =~ s|^\Q$srcdir\E/||;
|
||||||
|
|
||||||
|
print "\n$news_name\n\n";
|
||||||
|
|
||||||
|
# Print all lines from $news_file, starting with the first one
|
||||||
|
# that mentions $curr_version up to but not including
|
||||||
|
# the first occurrence of $prev_version.
|
||||||
|
my $in_items;
|
||||||
|
|
||||||
|
my $re_prefix = qr/(?:\* )?(?:Noteworthy c|Major c|C)(?i:hanges)/;
|
||||||
|
|
||||||
|
my $found_news;
|
||||||
|
open NEWS, '<', $news_file
|
||||||
|
or die "$ME: $news_file: cannot open for reading: $!\n";
|
||||||
|
while (defined (my $line = <NEWS>))
|
||||||
|
{
|
||||||
|
if ( ! $in_items)
|
||||||
|
{
|
||||||
|
# Match lines like these:
|
||||||
|
# * Major changes in release 5.0.1:
|
||||||
|
# * Noteworthy changes in release 6.6 (2006-11-22) [stable]
|
||||||
|
$line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$curr_version\E(?:[^\d.]|$)/o
|
||||||
|
or next;
|
||||||
|
$in_items = 1;
|
||||||
|
print $line;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# This regexp must not match version numbers in NEWS items.
|
||||||
|
# For example, they might well say "introduced in 4.5.5",
|
||||||
|
# and we don't want that to match.
|
||||||
|
$line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$prev_version\E(?:[^\d.]|$)/o
|
||||||
|
and last;
|
||||||
|
print $line;
|
||||||
|
$line =~ /\S/
|
||||||
|
and $found_news = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close NEWS;
|
||||||
|
|
||||||
|
$in_items
|
||||||
|
or die "$ME: $news_file: no matching lines for '$curr_version'\n";
|
||||||
|
$found_news
|
||||||
|
or die "$ME: $news_file: no news item found for '$curr_version'\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub print_changelog_deltas ($$)
|
||||||
|
{
|
||||||
|
my ($package_name, $prev_version) = @_;
|
||||||
|
|
||||||
|
# Print new ChangeLog entries.
|
||||||
|
|
||||||
|
# First find all CVS-controlled ChangeLog files.
|
||||||
|
use File::Find;
|
||||||
|
my @changelog;
|
||||||
|
find ({wanted => sub {$_ eq 'ChangeLog' && -d 'CVS'
|
||||||
|
and push @changelog, $File::Find::name}},
|
||||||
|
'.');
|
||||||
|
|
||||||
|
# If there are no ChangeLog files, we're done.
|
||||||
|
@changelog
|
||||||
|
or return;
|
||||||
|
my %changelog = map {$_ => 1} @changelog;
|
||||||
|
|
||||||
|
# Reorder the list of files so that if there are ChangeLog
|
||||||
|
# files in the specified directories, they're listed first,
|
||||||
|
# in this order:
|
||||||
|
my @dir = qw ( . src lib m4 config doc );
|
||||||
|
|
||||||
|
# A typical @changelog array might look like this:
|
||||||
|
# ./ChangeLog
|
||||||
|
# ./po/ChangeLog
|
||||||
|
# ./m4/ChangeLog
|
||||||
|
# ./lib/ChangeLog
|
||||||
|
# ./doc/ChangeLog
|
||||||
|
# ./config/ChangeLog
|
||||||
|
my @reordered;
|
||||||
|
foreach my $d (@dir)
|
||||||
|
{
|
||||||
|
my $dot_slash = $d eq '.' ? $d : "./$d";
|
||||||
|
my $target = "$dot_slash/ChangeLog";
|
||||||
|
delete $changelog{$target}
|
||||||
|
and push @reordered, $target;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Append any remaining ChangeLog files.
|
||||||
|
push @reordered, sort keys %changelog;
|
||||||
|
|
||||||
|
# Remove leading './'.
|
||||||
|
@reordered = map { s!^\./!!; $_ } @reordered;
|
||||||
|
|
||||||
|
print "\nChangeLog entries:\n\n";
|
||||||
|
# print join ("\n", @reordered), "\n";
|
||||||
|
|
||||||
|
$prev_version =~ s/\./_/g;
|
||||||
|
my $prev_cvs_tag = "\U$package_name\E-$prev_version";
|
||||||
|
|
||||||
|
my $cmd = "cvs -n diff -u -r$prev_cvs_tag -rHEAD @reordered";
|
||||||
|
open DIFF, '-|', $cmd
|
||||||
|
or die "$ME: cannot run '$cmd': $!\n";
|
||||||
|
# Print two types of lines, making minor changes:
|
||||||
|
# Lines starting with '+++ ', e.g.,
|
||||||
|
# +++ ChangeLog 22 Feb 2003 16:52:51 -0000 1.247
|
||||||
|
# and those starting with '+'.
|
||||||
|
# Don't print the others.
|
||||||
|
my $prev_printed_line_empty = 1;
|
||||||
|
while (defined (my $line = <DIFF>))
|
||||||
|
{
|
||||||
|
if ($line =~ /^\+\+\+ /)
|
||||||
|
{
|
||||||
|
my $separator = "*"x70 ."\n";
|
||||||
|
$line =~ s///;
|
||||||
|
$line =~ s/\s.*//;
|
||||||
|
$prev_printed_line_empty
|
||||||
|
or print "\n";
|
||||||
|
print $separator, $line, $separator;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^\+/)
|
||||||
|
{
|
||||||
|
$line =~ s///;
|
||||||
|
print $line;
|
||||||
|
$prev_printed_line_empty = ($line =~ /^$/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close DIFF;
|
||||||
|
|
||||||
|
# The exit code should be 1.
|
||||||
|
# Allow in case there are no modified ChangeLog entries.
|
||||||
|
$? == 256 || $? == 128
|
||||||
|
or warn "warning: '$cmd' had unexpected exit code or signal ($?)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_tool_versions ($$)
|
||||||
|
{
|
||||||
|
my ($tool_list, $gnulib_version) = @_;
|
||||||
|
@$tool_list
|
||||||
|
or return ();
|
||||||
|
|
||||||
|
my $fail;
|
||||||
|
my @tool_version_pair;
|
||||||
|
foreach my $t (@$tool_list)
|
||||||
|
{
|
||||||
|
if ($t eq 'gnulib')
|
||||||
|
{
|
||||||
|
push @tool_version_pair, ucfirst $t . ' ' . $gnulib_version;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
# Assume that the last "word" on the first line of
|
||||||
|
# 'tool --version' output is the version string.
|
||||||
|
my ($first_line, undef) = split ("\n", `$t --version`);
|
||||||
|
if ($first_line =~ /.* (\d[\w.-]+)$/)
|
||||||
|
{
|
||||||
|
$t = ucfirst $t;
|
||||||
|
push @tool_version_pair, "$t $1";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
defined $first_line
|
||||||
|
and $first_line = '';
|
||||||
|
warn "$t: unexpected --version output\n:$first_line";
|
||||||
|
$fail = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fail
|
||||||
|
and exit 1;
|
||||||
|
|
||||||
|
return @tool_version_pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
# Neutralize the locale, so that, for instance, "du" does not
|
||||||
|
# issue "1,2" instead of "1.2", what confuses our regexps.
|
||||||
|
$ENV{LC_ALL} = "C";
|
||||||
|
|
||||||
|
my $mail_headers;
|
||||||
|
my $release_type;
|
||||||
|
my $package_name;
|
||||||
|
my $prev_version;
|
||||||
|
my $curr_version;
|
||||||
|
my $gpg_key_id;
|
||||||
|
my @url_dir_list;
|
||||||
|
my @news_file;
|
||||||
|
my $bootstrap_tools;
|
||||||
|
my $gnulib_version;
|
||||||
|
my $print_checksums_p = 1;
|
||||||
|
|
||||||
|
# Reformat the warnings before displaying them.
|
||||||
|
local $SIG{__WARN__} = sub
|
||||||
|
{
|
||||||
|
my ($msg) = @_;
|
||||||
|
# Warnings from GetOptions.
|
||||||
|
$msg =~ s/Option (\w)/option --$1/;
|
||||||
|
warn "$ME: $msg";
|
||||||
|
};
|
||||||
|
|
||||||
|
GetOptions
|
||||||
|
(
|
||||||
|
'mail-headers=s' => \$mail_headers,
|
||||||
|
'release-type=s' => \$release_type,
|
||||||
|
'package-name=s' => \$package_name,
|
||||||
|
'previous-version=s' => \$prev_version,
|
||||||
|
'current-version=s' => \$curr_version,
|
||||||
|
'gpg-key-id=s' => \$gpg_key_id,
|
||||||
|
'url-directory=s' => \@url_dir_list,
|
||||||
|
'news=s' => \@news_file,
|
||||||
|
'srcdir=s' => \$srcdir,
|
||||||
|
'bootstrap-tools=s' => \$bootstrap_tools,
|
||||||
|
'gnulib-version=s' => \$gnulib_version,
|
||||||
|
'print-checksums!' => \$print_checksums_p,
|
||||||
|
'archive-suffix=s' => \@archive_suffixes,
|
||||||
|
|
||||||
|
help => sub { usage 0 },
|
||||||
|
version => sub { print "$ME version $VERSION\n"; exit },
|
||||||
|
) or usage 1;
|
||||||
|
|
||||||
|
my $fail = 0;
|
||||||
|
# Ensure that each required option is specified.
|
||||||
|
$release_type
|
||||||
|
or (warn "release type not specified\n"), $fail = 1;
|
||||||
|
$package_name
|
||||||
|
or (warn "package name not specified\n"), $fail = 1;
|
||||||
|
$prev_version
|
||||||
|
or (warn "previous version string not specified\n"), $fail = 1;
|
||||||
|
$curr_version
|
||||||
|
or (warn "current version string not specified\n"), $fail = 1;
|
||||||
|
$gpg_key_id
|
||||||
|
or (warn "GnuPG key ID not specified\n"), $fail = 1;
|
||||||
|
@url_dir_list
|
||||||
|
or (warn "URL directory name(s) not specified\n"), $fail = 1;
|
||||||
|
|
||||||
|
my @tool_list = split ',', $bootstrap_tools;
|
||||||
|
|
||||||
|
grep (/^gnulib$/, @tool_list) ^ defined $gnulib_version
|
||||||
|
and (warn "when specifying gnulib as a tool, you must also specify\n"
|
||||||
|
. "--gnulib-version=V, where V is the result of running git describe\n"
|
||||||
|
. "in the gnulib source directory.\n"), $fail = 1;
|
||||||
|
|
||||||
|
exists $valid_release_types{$release_type}
|
||||||
|
or (warn "'$release_type': invalid release type\n"), $fail = 1;
|
||||||
|
|
||||||
|
@ARGV
|
||||||
|
and (warn "too many arguments:\n", join ("\n", @ARGV), "\n"),
|
||||||
|
$fail = 1;
|
||||||
|
$fail
|
||||||
|
and usage 1;
|
||||||
|
|
||||||
|
my $my_distdir = "$package_name-$curr_version";
|
||||||
|
|
||||||
|
my $xd = "$package_name-$prev_version-$curr_version.xdelta";
|
||||||
|
|
||||||
|
my @candidates = map { "$my_distdir.$_" } @archive_suffixes;
|
||||||
|
my @tarballs = grep {-f $_} @candidates;
|
||||||
|
|
||||||
|
@tarballs
|
||||||
|
or die "$ME: none of " . join(', ', @candidates) . " were found\n";
|
||||||
|
my @sizable = @tarballs;
|
||||||
|
-f $xd
|
||||||
|
and push @sizable, $xd;
|
||||||
|
my %size = sizes (@sizable);
|
||||||
|
%size
|
||||||
|
or exit 1;
|
||||||
|
|
||||||
|
my $headers = '';
|
||||||
|
if (defined $mail_headers)
|
||||||
|
{
|
||||||
|
($headers = $mail_headers) =~ s/\s+(\S+:)/\n$1/g;
|
||||||
|
$headers .= "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# The markup is escaped as <\# so that when this script is sent by
|
||||||
|
# mail (or part of a diff), Gnus is not triggered.
|
||||||
|
print <<EOF;
|
||||||
|
|
||||||
|
${headers}Subject: $my_distdir released [$release_type]
|
||||||
|
|
||||||
|
<\#secure method=pgpmime mode=sign>
|
||||||
|
|
||||||
|
FIXME: put comments here
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if (@url_dir_list == 1 && @tarballs == 1)
|
||||||
|
{
|
||||||
|
# When there's only one tarball and one URL, use a more concise form.
|
||||||
|
my $m = "$url_dir_list[0]/$tarballs[0]";
|
||||||
|
print "Here are the compressed sources and a GPG detached signature[*]:\n"
|
||||||
|
. " $m\n"
|
||||||
|
. " $m.sig\n\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print_locations ("compressed sources", @url_dir_list, %size, @tarballs);
|
||||||
|
-f $xd
|
||||||
|
and print_locations ("xdelta diffs (useful? if so, "
|
||||||
|
. "please tell bug-gnulib\@gnu.org)",
|
||||||
|
@url_dir_list, %size, $xd);
|
||||||
|
my @sig_files = map { "$_.sig" } @tarballs;
|
||||||
|
print_locations ("GPG detached signatures[*]", @url_dir_list, %size,
|
||||||
|
@sig_files);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($url_dir_list[0] =~ "gnu\.org")
|
||||||
|
{
|
||||||
|
print "Use a mirror for higher download bandwidth:\n";
|
||||||
|
if (@tarballs == 1 && $url_dir_list[0] =~ m!http://ftp\.gnu\.org/gnu/!)
|
||||||
|
{
|
||||||
|
(my $m = "$url_dir_list[0]/$tarballs[0]")
|
||||||
|
=~ s!http://ftp\.gnu\.org/gnu/!http://ftpmirror\.gnu\.org/!;
|
||||||
|
print " $m\n"
|
||||||
|
. " $m.sig\n\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print " http://www.gnu.org/order/ftp.html\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$print_checksums_p
|
||||||
|
and print_checksums (@sizable);
|
||||||
|
|
||||||
|
print <<EOF;
|
||||||
|
[*] Use a .sig file to verify that the corresponding file (without the
|
||||||
|
.sig suffix) is intact. First, be sure to download both the .sig file
|
||||||
|
and the corresponding tarball. Then, run a command like this:
|
||||||
|
|
||||||
|
gpg --verify $tarballs[0].sig
|
||||||
|
|
||||||
|
If that command fails because you don't have the required public key,
|
||||||
|
then run this command to import it:
|
||||||
|
|
||||||
|
gpg --keyserver keys.gnupg.net --recv-keys $gpg_key_id
|
||||||
|
|
||||||
|
and rerun the 'gpg --verify' command.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
my @tool_versions = get_tool_versions (\@tool_list, $gnulib_version);
|
||||||
|
@tool_versions
|
||||||
|
and print "\nThis release was bootstrapped with the following tools:",
|
||||||
|
join ('', map {"\n $_"} @tool_versions), "\n";
|
||||||
|
|
||||||
|
print_news_deltas ($_, $prev_version, $curr_version)
|
||||||
|
foreach @news_file;
|
||||||
|
|
||||||
|
$release_type eq 'stable'
|
||||||
|
or print_changelog_deltas ($package_name, $prev_version);
|
||||||
|
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
### Setup "GNU" style for perl-mode and cperl-mode.
|
||||||
|
## Local Variables:
|
||||||
|
## mode: perl
|
||||||
|
## perl-indent-level: 2
|
||||||
|
## perl-continued-statement-offset: 2
|
||||||
|
## perl-continued-brace-offset: 0
|
||||||
|
## perl-brace-offset: 0
|
||||||
|
## perl-brace-imaginary-offset: 0
|
||||||
|
## perl-label-offset: -2
|
||||||
|
## perl-extra-newline-before-brace: t
|
||||||
|
## perl-merge-trailing-else: nil
|
||||||
|
## eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
## time-stamp-start: "my $VERSION = '"
|
||||||
|
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||||
|
## time-stamp-time-zone: "UTC"
|
||||||
|
## time-stamp-end: "'; # UTC"
|
||||||
|
## End:
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
/* A C macro for declaring that specific arguments must not be NULL.
|
||||||
|
Copyright (C) 2009-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
||||||
|
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
||||||
|
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
||||||
|
#ifndef _GL_ARG_NONNULL
|
||||||
|
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
||||||
|
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
||||||
|
# else
|
||||||
|
# define _GL_ARG_NONNULL(params)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
@ -0,0 +1,271 @@
|
|||||||
|
/* C++ compatible function declaration macros.
|
||||||
|
Copyright (C) 2010-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
#ifndef _GL_CXXDEFS_H
|
||||||
|
#define _GL_CXXDEFS_H
|
||||||
|
|
||||||
|
/* The three most frequent use cases of these macros are:
|
||||||
|
|
||||||
|
* For providing a substitute for a function that is missing on some
|
||||||
|
platforms, but is declared and works fine on the platforms on which
|
||||||
|
it exists:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if !@HAVE_FOO@
|
||||||
|
_GL_FUNCDECL_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
|
||||||
|
* For providing a replacement for a function that exists on all platforms,
|
||||||
|
but is broken/insufficient and needs to be replaced on some platforms:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if @REPLACE_FOO@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef foo
|
||||||
|
# define foo rpl_foo
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (foo, ...);
|
||||||
|
_GL_CXXALIAS_RPL (foo, ...);
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
|
||||||
|
* For providing a replacement for a function that exists on some platforms
|
||||||
|
but is broken/insufficient and needs to be replaced on some of them and
|
||||||
|
is additionally either missing or undeclared on some other platforms:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if @REPLACE_FOO@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef foo
|
||||||
|
# define foo rpl_foo
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (foo, ...);
|
||||||
|
_GL_CXXALIAS_RPL (foo, ...);
|
||||||
|
# else
|
||||||
|
# if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
|
||||||
|
_GL_FUNCDECL_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* _GL_EXTERN_C declaration;
|
||||||
|
performs the declaration with C linkage. */
|
||||||
|
#if defined __cplusplus
|
||||||
|
# define _GL_EXTERN_C extern "C"
|
||||||
|
#else
|
||||||
|
# define _GL_EXTERN_C extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
|
||||||
|
declares a replacement function, named rpl_func, with the given prototype,
|
||||||
|
consisting of return type, parameters, and attributes.
|
||||||
|
Example:
|
||||||
|
_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
*/
|
||||||
|
#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
|
||||||
|
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C rettype rpl_func parameters_and_attributes
|
||||||
|
|
||||||
|
/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
|
||||||
|
declares the system function, named func, with the given prototype,
|
||||||
|
consisting of return type, parameters, and attributes.
|
||||||
|
Example:
|
||||||
|
_GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
*/
|
||||||
|
#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C rettype func parameters_and_attributes
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
|
||||||
|
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||||
|
that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
|
||||||
|
Example:
|
||||||
|
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
||||||
|
*/
|
||||||
|
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
|
||||||
|
_GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
rettype (*const func) parameters = ::rpl_func; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
||||||
|
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
||||||
|
except that the C function rpl_func may have a slightly different
|
||||||
|
declaration. A cast is used to silence the "invalid conversion" error
|
||||||
|
that would otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
rettype (*const func) parameters = \
|
||||||
|
reinterpret_cast<rettype(*)parameters>(::rpl_func); \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||||
|
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
||||||
|
is defined.
|
||||||
|
Example:
|
||||||
|
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
||||||
|
*/
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
/* If we were to write
|
||||||
|
rettype (*const func) parameters = ::func;
|
||||||
|
like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls
|
||||||
|
better (remove an indirection through a 'static' pointer variable),
|
||||||
|
but then the _GL_CXXALIASWARN macro below would cause a warning not only
|
||||||
|
for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */
|
||||||
|
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static rettype (*func) parameters = ::func; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
|
||||||
|
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
except that the C function func may have a slightly different declaration.
|
||||||
|
A cast is used to silence the "invalid conversion" error that would
|
||||||
|
otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static rettype (*func) parameters = \
|
||||||
|
reinterpret_cast<rettype(*)parameters>(::func); \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
|
||||||
|
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
except that the C function is picked among a set of overloaded functions,
|
||||||
|
namely the one with rettype2 and parameters2. Two consecutive casts
|
||||||
|
are used to silence the "cannot find a match" and "invalid conversion"
|
||||||
|
errors that would otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
/* The outer cast must be a reinterpret_cast.
|
||||||
|
The inner cast: When the function is defined as a set of overloaded
|
||||||
|
functions, it works as a static_cast<>, choosing the designated variant.
|
||||||
|
When the function is defined as a single variant, it works as a
|
||||||
|
reinterpret_cast<>. The parenthesized cast syntax works both ways. */
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static rettype (*func) parameters = \
|
||||||
|
reinterpret_cast<rettype(*)parameters>( \
|
||||||
|
(rettype2(*)parameters2)(::func)); \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIASWARN (func);
|
||||||
|
causes a warning to be emitted when ::func is used but not when
|
||||||
|
GNULIB_NAMESPACE::func is used. func must be defined without overloaded
|
||||||
|
variants. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIASWARN(func) \
|
||||||
|
_GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
|
||||||
|
# define _GL_CXXALIASWARN_1(func,namespace) \
|
||||||
|
_GL_CXXALIASWARN_2 (func, namespace)
|
||||||
|
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||||
|
we enable the warning only when not optimizing. */
|
||||||
|
# if !__OPTIMIZE__
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
_GL_WARN_ON_USE (func, \
|
||||||
|
"The symbol ::" #func " refers to the system function. " \
|
||||||
|
"Use " #namespace "::" #func " instead.")
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
extern __typeof__ (func) func
|
||||||
|
# else
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIASWARN(func) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
|
||||||
|
causes a warning to be emitted when the given overloaded variant of ::func
|
||||||
|
is used but not when GNULIB_NAMESPACE::func is used. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
|
||||||
|
GNULIB_NAMESPACE)
|
||||||
|
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
||||||
|
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||||
|
we enable the warning only when not optimizing. */
|
||||||
|
# if !__OPTIMIZE__
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
||||||
|
"The symbol ::" #func " refers to the system function. " \
|
||||||
|
"Use " #namespace "::" #func " instead.")
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
extern __typeof__ (func) func
|
||||||
|
# else
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_CXXDEFS_H */
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
#! /usr/bin/env guile
|
||||||
|
!#
|
||||||
|
;; -*- indent-tabs-mode:nil; coding: utf-8 -*-
|
||||||
|
;; Copyright (C) 2015
|
||||||
|
;; "Mu Lei" known as "NalaGinrut" <mulei@gnu.org>
|
||||||
|
;; This file is free software: you can redistribute it and/or modify
|
||||||
|
;; it under the terms of the GNU General Public License and GNU
|
||||||
|
;; Lesser General Public License published by the Free Software
|
||||||
|
;; Foundation, either version 3 of the License, or (at your option)
|
||||||
|
;; any later version.
|
||||||
|
|
||||||
|
;; This file 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 and GNU Lesser General Public License
|
||||||
|
;; for more details.
|
||||||
|
|
||||||
|
;; You should have received a copy of the GNU General Public License
|
||||||
|
;; and GNU Lesser General Public License along with this program.
|
||||||
|
;; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;; NOTE: It's not fair to check GNU Texinfo in configure, since users
|
||||||
|
;; don't have to install it unless they want to generate manuals.
|
||||||
|
|
||||||
|
(use-modules (ice-9 popen) (ice-9 rdelim) (ice-9 regex))
|
||||||
|
|
||||||
|
(let ((m (string-match "texindex [(]GNU texinfo[)] ([0-9.]+)"
|
||||||
|
(read-line (open-pipe "texindex --version" OPEN_READ)))))
|
||||||
|
(if m
|
||||||
|
(if (string>=? (match:substring m 1) "5.2")
|
||||||
|
0
|
||||||
|
(error "Please upgrade GNU Texinfo for generating manuals!"))
|
||||||
|
(error "Please install the latest GNU Texinfo!")))
|
||||||
@ -0,0 +1,143 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Wrapper for compilers which do not understand `-c -o'.
|
||||||
|
|
||||||
|
scriptversion=2009-10-06.20; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software
|
||||||
|
# Foundation, Inc.
|
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
|
#
|
||||||
|
# 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 2, 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/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Wrapper for compilers which do not understand `-c -o'.
|
||||||
|
Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||||
|
arguments, and rename the output as expected.
|
||||||
|
|
||||||
|
If you are trying to build a whole package this is not the
|
||||||
|
right script to run: please start by reading the file `INSTALL'.
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "compile $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ofile=
|
||||||
|
cfile=
|
||||||
|
eat=
|
||||||
|
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$eat"; then
|
||||||
|
eat=
|
||||||
|
else
|
||||||
|
case $1 in
|
||||||
|
-o)
|
||||||
|
# configure might choose to run compile as `compile cc -o foo foo.c'.
|
||||||
|
# So we strip `-o arg' only if arg is an object.
|
||||||
|
eat=1
|
||||||
|
case $2 in
|
||||||
|
*.o | *.obj)
|
||||||
|
ofile=$2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" -o "$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*.c)
|
||||||
|
cfile=$1
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -z "$ofile" || test -z "$cfile"; then
|
||||||
|
# If no `-o' option was seen then we might have been invoked from a
|
||||||
|
# pattern rule where we don't need one. That is ok -- this is a
|
||||||
|
# normal compilation that the losing compiler can handle. If no
|
||||||
|
# `.c' file was seen then we are probably linking. That is also
|
||||||
|
# ok.
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Name of file we expect compiler to create.
|
||||||
|
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||||
|
|
||||||
|
# Create the lock directory.
|
||||||
|
# Note: use `[/\\:.-]' here to ensure that we don't use the same name
|
||||||
|
# that we are using for the .o file. Also, base the name on the expected
|
||||||
|
# object file name, since that is what matters with a parallel build.
|
||||||
|
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||||
|
while true; do
|
||||||
|
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
# FIXME: race condition here if user kills between mkdir and trap.
|
||||||
|
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||||
|
|
||||||
|
# Run the compile.
|
||||||
|
"$@"
|
||||||
|
ret=$?
|
||||||
|
|
||||||
|
if test -f "$cofile"; then
|
||||||
|
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||||
|
elif test -f "${cofile}bj"; then
|
||||||
|
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rmdir "$lockdir"
|
||||||
|
exit $ret
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
@ -1 +0,0 @@
|
|||||||
/usr/share/automake-1.12/config.guess
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1 +0,0 @@
|
|||||||
/usr/share/automake-1.12/config.sub
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,45 @@
|
|||||||
|
#! /usr/bin/env guile
|
||||||
|
!#
|
||||||
|
;; -*- indent-tabs-mode:nil; coding: utf-8 -*-
|
||||||
|
;; Copyright (C) 2015
|
||||||
|
;; "Mu Lei" known as "NalaGinrut" <mulei@gnu.org>
|
||||||
|
;; This file is free software: you can redistribute it and/or modify
|
||||||
|
;; it under the terms of the GNU General Public License and GNU
|
||||||
|
;; Lesser General Public License published by the Free Software
|
||||||
|
;; Foundation, either version 3 of the License, or (at your option)
|
||||||
|
;; any later version.
|
||||||
|
|
||||||
|
;; This file 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 and GNU Lesser General Public License
|
||||||
|
;; for more details.
|
||||||
|
|
||||||
|
;; You should have received a copy of the GNU General Public License
|
||||||
|
;; and GNU Lesser General Public License along with this program.
|
||||||
|
;; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;; NOTE: It's not fair to check GNU Texinfo in configure, since users
|
||||||
|
;; don't have to install it unless they want to generate manuals.
|
||||||
|
(use-modules (ice-9 match))
|
||||||
|
|
||||||
|
(define *tpl*
|
||||||
|
"version: ~a
|
||||||
|
directory: artanis
|
||||||
|
filename: artanis-~a.tar.~a
|
||||||
|
symlink: artanis-~a.tar.~a artanis-latest.tar.~a
|
||||||
|
comment: make a release")
|
||||||
|
|
||||||
|
(define (main args)
|
||||||
|
(define (->f e v) (format #f "artanis-~a.tar.~a.directive" v e))
|
||||||
|
(define (->t e v) (format #f *tpl* v v e v e e))
|
||||||
|
(match args
|
||||||
|
((cmd ext ver)
|
||||||
|
(let* ((f (->f ext ver))
|
||||||
|
(t (->t ext ver))
|
||||||
|
(fp (open-file f "w")))
|
||||||
|
(display t fp)
|
||||||
|
(close fp)))
|
||||||
|
(else (error "[usage] gen-directive.scm ext version"))))
|
||||||
|
|
||||||
|
(main (command-line))
|
||||||
@ -0,0 +1,466 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
# gendocs.sh -- generate a GNU manual in many formats. This script is
|
||||||
|
# mentioned in maintain.texi. See the help message below for usage details.
|
||||||
|
|
||||||
|
scriptversion=2013-02-03.15
|
||||||
|
|
||||||
|
# Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
# Original author: Mohit Agarwal.
|
||||||
|
# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
|
||||||
|
#
|
||||||
|
# The latest version of this script, and the companion template, is
|
||||||
|
# available from Texinfo CVS:
|
||||||
|
# http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh
|
||||||
|
# http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template
|
||||||
|
#
|
||||||
|
# An up-to-date copy is also maintained in Gnulib (gnu.org/software/gnulib).
|
||||||
|
|
||||||
|
# TODO:
|
||||||
|
# - image importation was only implemented for HTML generated by
|
||||||
|
# makeinfo. But it should be simple enough to adjust.
|
||||||
|
# - images are not imported in the source tarball. All the needed
|
||||||
|
# formats (PDF, PNG, etc.) should be included.
|
||||||
|
|
||||||
|
prog=`basename "$0"`
|
||||||
|
srcdir=`pwd`
|
||||||
|
|
||||||
|
scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh"
|
||||||
|
templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template"
|
||||||
|
|
||||||
|
: ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="}
|
||||||
|
: ${MAKEINFO="makeinfo"}
|
||||||
|
: ${TEXI2DVI="texi2dvi -t @finalout"}
|
||||||
|
: ${DOCBOOK2HTML="docbook2html"}
|
||||||
|
: ${DOCBOOK2PDF="docbook2pdf"}
|
||||||
|
: ${DOCBOOK2TXT="docbook2txt"}
|
||||||
|
: ${GENDOCS_TEMPLATE_DIR="."}
|
||||||
|
: ${PERL='perl'}
|
||||||
|
: ${TEXI2HTML="texi2html"}
|
||||||
|
unset CDPATH
|
||||||
|
unset use_texi2html
|
||||||
|
|
||||||
|
version="gendocs.sh $scriptversion
|
||||||
|
|
||||||
|
Copyright 2013 Free Software Foundation, Inc.
|
||||||
|
There is NO warranty. You may redistribute this software
|
||||||
|
under the terms of the GNU General Public License.
|
||||||
|
For more information about these matters, see the files named COPYING."
|
||||||
|
|
||||||
|
usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
|
||||||
|
|
||||||
|
Generate output in various formats from PACKAGE.texinfo (or .texi or
|
||||||
|
.txi) source. See the GNU Maintainers document for a more extensive
|
||||||
|
discussion:
|
||||||
|
http://www.gnu.org/prep/maintain_toc.html
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--email ADR use ADR as contact in generated web pages; always give this.
|
||||||
|
|
||||||
|
-s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi}
|
||||||
|
-o OUTDIR write files into OUTDIR, instead of manual/.
|
||||||
|
-I DIR append DIR to the Texinfo search path.
|
||||||
|
--common ARG pass ARG in all invocations.
|
||||||
|
--html ARG pass ARG to makeinfo or texi2html for HTML targets.
|
||||||
|
--info ARG pass ARG to makeinfo for Info, instead of --no-split.
|
||||||
|
--no-ascii skip generating the plain text output.
|
||||||
|
--source ARG include ARG in tar archive of sources.
|
||||||
|
--split HOW make split HTML by node, section, chapter; default node.
|
||||||
|
|
||||||
|
--texi2html use texi2html to make HTML target, with all split versions.
|
||||||
|
--docbook convert through DocBook too (xml, txt, html, pdf).
|
||||||
|
|
||||||
|
--help display this help and exit successfully.
|
||||||
|
--version display version information and exit successfully.
|
||||||
|
|
||||||
|
Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\"
|
||||||
|
|
||||||
|
Typical sequence:
|
||||||
|
cd PACKAGESOURCE/doc
|
||||||
|
wget \"$scripturl\"
|
||||||
|
wget \"$templateurl\"
|
||||||
|
$prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\"
|
||||||
|
|
||||||
|
Output will be in a new subdirectory \"manual\" (by default;
|
||||||
|
use -o OUTDIR to override). Move all the new files into your web CVS
|
||||||
|
tree, as explained in the Web Pages node of maintain.texi.
|
||||||
|
|
||||||
|
Please use the --email ADDRESS option so your own bug-reporting
|
||||||
|
address will be used in the generated HTML pages.
|
||||||
|
|
||||||
|
MANUAL-TITLE is included as part of the HTML <title> of the overall
|
||||||
|
manual/index.html file. It should include the name of the package being
|
||||||
|
documented. manual/index.html is created by substitution from the file
|
||||||
|
$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
|
||||||
|
generic template for your own purposes.)
|
||||||
|
|
||||||
|
If you have several manuals, you'll need to run this script several
|
||||||
|
times with different MANUAL values, specifying a different output
|
||||||
|
directory with -o each time. Then write (by hand) an overall index.html
|
||||||
|
with links to them all.
|
||||||
|
|
||||||
|
If a manual's Texinfo sources are spread across several directories,
|
||||||
|
first copy or symlink all Texinfo sources into a single directory.
|
||||||
|
(Part of the script's work is to make a tar.gz of the sources.)
|
||||||
|
|
||||||
|
As implied above, by default monolithic Info files are generated.
|
||||||
|
If you want split Info, or other Info options, use --info to override.
|
||||||
|
|
||||||
|
You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML,
|
||||||
|
and PERL to control the programs that get executed, and
|
||||||
|
GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is
|
||||||
|
looked for. With --docbook, the environment variables DOCBOOK2HTML,
|
||||||
|
DOCBOOK2PDF, and DOCBOOK2TXT are also consulted.
|
||||||
|
|
||||||
|
By default, makeinfo and texi2dvi are run in the default (English)
|
||||||
|
locale, since that's the language of most Texinfo manuals. If you
|
||||||
|
happen to have a non-English manual and non-English web site, see the
|
||||||
|
SETLANG setting in the source.
|
||||||
|
|
||||||
|
Email bug reports or enhancement requests to bug-texinfo@gnu.org.
|
||||||
|
"
|
||||||
|
|
||||||
|
MANUAL_TITLE=
|
||||||
|
PACKAGE=
|
||||||
|
EMAIL=webmasters@gnu.org # please override with --email
|
||||||
|
commonarg= # passed to all makeinfo/texi2html invcations.
|
||||||
|
dirargs= # passed to all tools (-I dir).
|
||||||
|
dirs= # -I's directories.
|
||||||
|
htmlarg=
|
||||||
|
infoarg=--no-split
|
||||||
|
generate_ascii=true
|
||||||
|
outdir=manual
|
||||||
|
source_extra=
|
||||||
|
split=node
|
||||||
|
srcfile=
|
||||||
|
|
||||||
|
while test $# -gt 0; do
|
||||||
|
case $1 in
|
||||||
|
-s) shift; srcfile=$1;;
|
||||||
|
-o) shift; outdir=$1;;
|
||||||
|
-I) shift; dirargs="$dirargs -I '$1'"; dirs="$dirs $1";;
|
||||||
|
--common) shift; commonarg=$1;;
|
||||||
|
--docbook) docbook=yes;;
|
||||||
|
--email) shift; EMAIL=$1;;
|
||||||
|
--html) shift; htmlarg=$1;;
|
||||||
|
--info) shift; infoarg=$1;;
|
||||||
|
--no-ascii) generate_ascii=false;;
|
||||||
|
--source) shift; source_extra=$1;;
|
||||||
|
--split) shift; split=$1;;
|
||||||
|
--texi2html) use_texi2html=1;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit 0;;
|
||||||
|
--version) echo "$version"; exit 0;;
|
||||||
|
-*)
|
||||||
|
echo "$0: Unknown option \`$1'." >&2
|
||||||
|
echo "$0: Try \`--help' for more information." >&2
|
||||||
|
exit 1;;
|
||||||
|
*)
|
||||||
|
if test -z "$PACKAGE"; then
|
||||||
|
PACKAGE=$1
|
||||||
|
elif test -z "$MANUAL_TITLE"; then
|
||||||
|
MANUAL_TITLE=$1
|
||||||
|
else
|
||||||
|
echo "$0: extra non-option argument \`$1'." >&2
|
||||||
|
exit 1
|
||||||
|
fi;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# makeinfo uses the dirargs, but texi2dvi doesn't.
|
||||||
|
commonarg=" $dirargs $commonarg"
|
||||||
|
|
||||||
|
# For most of the following, the base name is just $PACKAGE
|
||||||
|
base=$PACKAGE
|
||||||
|
|
||||||
|
if test -n "$srcfile"; then
|
||||||
|
# but here, we use the basename of $srcfile
|
||||||
|
base=`basename "$srcfile"`
|
||||||
|
case $base in
|
||||||
|
*.txi|*.texi|*.texinfo) base=`echo "$base"|sed 's/\.[texinfo]*$//'`;;
|
||||||
|
esac
|
||||||
|
PACKAGE=$base
|
||||||
|
elif test -s "$srcdir/$PACKAGE.texinfo"; then
|
||||||
|
srcfile=$srcdir/$PACKAGE.texinfo
|
||||||
|
elif test -s "$srcdir/$PACKAGE.texi"; then
|
||||||
|
srcfile=$srcdir/$PACKAGE.texi
|
||||||
|
elif test -s "$srcdir/$PACKAGE.txi"; then
|
||||||
|
srcfile=$srcdir/$PACKAGE.txi
|
||||||
|
else
|
||||||
|
echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
|
||||||
|
echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
|
||||||
|
echo "$0: it is available from $templateurl." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Function to return size of $1 in something resembling kilobytes.
|
||||||
|
calcsize()
|
||||||
|
{
|
||||||
|
size=`ls -ksl $1 | awk '{print $1}'`
|
||||||
|
echo $size
|
||||||
|
}
|
||||||
|
|
||||||
|
# copy_images OUTDIR HTML-FILE...
|
||||||
|
# -------------------------------
|
||||||
|
# Copy all the images needed by the HTML-FILEs into OUTDIR. Look
|
||||||
|
# for them in the -I directories.
|
||||||
|
copy_images()
|
||||||
|
{
|
||||||
|
local odir
|
||||||
|
odir=$1
|
||||||
|
shift
|
||||||
|
$PERL -n -e "
|
||||||
|
BEGIN {
|
||||||
|
\$me = '$prog';
|
||||||
|
\$odir = '$odir';
|
||||||
|
@dirs = qw($dirs);
|
||||||
|
}
|
||||||
|
" -e '
|
||||||
|
/<img src="(.*?)"/g && ++$need{$1};
|
||||||
|
|
||||||
|
END {
|
||||||
|
#print "$me: @{[keys %need]}\n"; # for debugging, show images found.
|
||||||
|
FILE: for my $f (keys %need) {
|
||||||
|
for my $d (@dirs) {
|
||||||
|
if (-f "$d/$f") {
|
||||||
|
use File::Basename;
|
||||||
|
my $dest = dirname ("$odir/$f");
|
||||||
|
#
|
||||||
|
use File::Path;
|
||||||
|
-d $dest || mkpath ($dest)
|
||||||
|
|| die "$me: cannot mkdir $dest: $!\n";
|
||||||
|
#
|
||||||
|
use File::Copy;
|
||||||
|
copy ("$d/$f", $dest)
|
||||||
|
|| die "$me: cannot copy $d/$f to $dest: $!\n";
|
||||||
|
next FILE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
die "$me: $ARGV: cannot find image $f\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
' -- "$@" || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
case $outdir in
|
||||||
|
/*) abs_outdir=$outdir;;
|
||||||
|
*) abs_outdir=$srcdir/$outdir;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "Making output for $srcfile"
|
||||||
|
echo " in `pwd`"
|
||||||
|
mkdir -p "$outdir/"
|
||||||
|
|
||||||
|
cmd="$SETLANG $MAKEINFO -o $PACKAGE.info $commonarg $infoarg \"$srcfile\""
|
||||||
|
echo "Generating info... ($cmd)"
|
||||||
|
eval "$cmd"
|
||||||
|
tar czf "$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info*
|
||||||
|
ls -l "$outdir/$PACKAGE.info.tar.gz"
|
||||||
|
info_tgz_size=`calcsize "$outdir/$PACKAGE.info.tar.gz"`
|
||||||
|
# do not mv the info files, there's no point in having them available
|
||||||
|
# separately on the web.
|
||||||
|
|
||||||
|
cmd="$SETLANG $TEXI2DVI $dirargs \"$srcfile\""
|
||||||
|
printf "\nGenerating dvi... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
# compress/finish dvi:
|
||||||
|
gzip -f -9 $PACKAGE.dvi
|
||||||
|
dvi_gz_size=`calcsize $PACKAGE.dvi.gz`
|
||||||
|
mv $PACKAGE.dvi.gz "$outdir/"
|
||||||
|
ls -l "$outdir/$PACKAGE.dvi.gz"
|
||||||
|
|
||||||
|
cmd="$SETLANG $TEXI2DVI --pdf $dirargs \"$srcfile\""
|
||||||
|
printf "\nGenerating pdf... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
pdf_size=`calcsize $PACKAGE.pdf`
|
||||||
|
mv $PACKAGE.pdf "$outdir/"
|
||||||
|
ls -l "$outdir/$PACKAGE.pdf"
|
||||||
|
|
||||||
|
if $generate_ascii; then
|
||||||
|
opt="-o $PACKAGE.txt --no-split --no-headers $commonarg"
|
||||||
|
cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
|
||||||
|
printf "\nGenerating ascii... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
ascii_size=`calcsize $PACKAGE.txt`
|
||||||
|
gzip -f -9 -c $PACKAGE.txt >"$outdir/$PACKAGE.txt.gz"
|
||||||
|
ascii_gz_size=`calcsize "$outdir/$PACKAGE.txt.gz"`
|
||||||
|
mv $PACKAGE.txt "$outdir/"
|
||||||
|
ls -l "$outdir/$PACKAGE.txt" "$outdir/$PACKAGE.txt.gz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
html_split()
|
||||||
|
{
|
||||||
|
opt="--split=$1 --node-files $commonarg $htmlarg"
|
||||||
|
cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\""
|
||||||
|
printf "\nGenerating html by $1... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
split_html_dir=$PACKAGE.html
|
||||||
|
(
|
||||||
|
cd ${split_html_dir} || exit 1
|
||||||
|
ln -sf ${PACKAGE}.html index.html
|
||||||
|
tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html
|
||||||
|
)
|
||||||
|
eval html_$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"`
|
||||||
|
rm -f "$outdir"/html_$1/*.html
|
||||||
|
mkdir -p "$outdir/html_$1/"
|
||||||
|
mv ${split_html_dir}/*.html "$outdir/html_$1/"
|
||||||
|
rmdir ${split_html_dir}
|
||||||
|
}
|
||||||
|
|
||||||
|
if test -z "$use_texi2html"; then
|
||||||
|
opt="--no-split --html -o $PACKAGE.html $commonarg $htmlarg"
|
||||||
|
cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
|
||||||
|
printf "\nGenerating monolithic html... ($cmd)\n"
|
||||||
|
rm -rf $PACKAGE.html # in case a directory is left over
|
||||||
|
eval "$cmd"
|
||||||
|
html_mono_size=`calcsize $PACKAGE.html`
|
||||||
|
gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
|
||||||
|
html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
|
||||||
|
copy_images "$outdir/" $PACKAGE.html
|
||||||
|
mv $PACKAGE.html "$outdir/"
|
||||||
|
ls -l "$outdir/$PACKAGE.html" "$outdir/$PACKAGE.html.gz"
|
||||||
|
|
||||||
|
opt="--html -o $PACKAGE.html --split=$split $commonarg $htmlarg"
|
||||||
|
cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
|
||||||
|
printf "\nGenerating html by $split... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
split_html_dir=$PACKAGE.html
|
||||||
|
copy_images $split_html_dir/ $split_html_dir/*.html
|
||||||
|
(
|
||||||
|
cd $split_html_dir || exit 1
|
||||||
|
tar -czf "$abs_outdir/$PACKAGE.html_$split.tar.gz" -- *
|
||||||
|
)
|
||||||
|
eval \
|
||||||
|
html_${split}_tgz_size=`calcsize "$outdir/$PACKAGE.html_$split.tar.gz"`
|
||||||
|
rm -rf "$outdir/html_$split/"
|
||||||
|
mv $split_html_dir "$outdir/html_$split/"
|
||||||
|
du -s "$outdir/html_$split/"
|
||||||
|
ls -l "$outdir/$PACKAGE.html_$split.tar.gz"
|
||||||
|
|
||||||
|
else # use texi2html:
|
||||||
|
opt="--output $PACKAGE.html $commonarg $htmlarg"
|
||||||
|
cmd="$SETLANG $TEXI2HTML $opt \"$srcfile\""
|
||||||
|
printf "\nGenerating monolithic html with texi2html... ($cmd)\n"
|
||||||
|
rm -rf $PACKAGE.html # in case a directory is left over
|
||||||
|
eval "$cmd"
|
||||||
|
html_mono_size=`calcsize $PACKAGE.html`
|
||||||
|
gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
|
||||||
|
html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
|
||||||
|
mv $PACKAGE.html "$outdir/"
|
||||||
|
|
||||||
|
html_split node
|
||||||
|
html_split chapter
|
||||||
|
html_split section
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "\nMaking .tar.gz for sources...\n"
|
||||||
|
d=`dirname $srcfile`
|
||||||
|
(
|
||||||
|
cd "$d"
|
||||||
|
srcfiles=`ls -d *.texinfo *.texi *.txi *.eps $source_extra 2>/dev/null` || true
|
||||||
|
tar czfh "$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles
|
||||||
|
ls -l "$abs_outdir/$PACKAGE.texi.tar.gz"
|
||||||
|
)
|
||||||
|
texi_tgz_size=`calcsize "$outdir/$PACKAGE.texi.tar.gz"`
|
||||||
|
|
||||||
|
if test -n "$docbook"; then
|
||||||
|
opt="-o - --docbook $commonarg"
|
||||||
|
cmd="$SETLANG $MAKEINFO $opt \"$srcfile\" >${srcdir}/$PACKAGE-db.xml"
|
||||||
|
printf "\nGenerating docbook XML... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
docbook_xml_size=`calcsize $PACKAGE-db.xml`
|
||||||
|
gzip -f -9 -c $PACKAGE-db.xml >"$outdir/$PACKAGE-db.xml.gz"
|
||||||
|
docbook_xml_gz_size=`calcsize "$outdir/$PACKAGE-db.xml.gz"`
|
||||||
|
mv $PACKAGE-db.xml "$outdir/"
|
||||||
|
|
||||||
|
split_html_db_dir=html_node_db
|
||||||
|
opt="$commonarg -o $split_html_db_dir"
|
||||||
|
cmd="$DOCBOOK2HTML $opt \"${outdir}/$PACKAGE-db.xml\""
|
||||||
|
printf "\nGenerating docbook HTML... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
(
|
||||||
|
cd ${split_html_db_dir} || exit 1
|
||||||
|
tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html
|
||||||
|
)
|
||||||
|
html_node_db_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"`
|
||||||
|
rm -f "$outdir"/html_node_db/*.html
|
||||||
|
mkdir -p "$outdir/html_node_db"
|
||||||
|
mv ${split_html_db_dir}/*.html "$outdir/html_node_db/"
|
||||||
|
rmdir ${split_html_db_dir}
|
||||||
|
|
||||||
|
cmd="$DOCBOOK2TXT \"${outdir}/$PACKAGE-db.xml\""
|
||||||
|
printf "\nGenerating docbook ASCII... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
docbook_ascii_size=`calcsize $PACKAGE-db.txt`
|
||||||
|
mv $PACKAGE-db.txt "$outdir/"
|
||||||
|
|
||||||
|
cmd="$DOCBOOK2PDF \"${outdir}/$PACKAGE-db.xml\""
|
||||||
|
printf "\nGenerating docbook PDF... ($cmd)\n"
|
||||||
|
eval "$cmd"
|
||||||
|
docbook_pdf_size=`calcsize $PACKAGE-db.pdf`
|
||||||
|
mv $PACKAGE-db.pdf "$outdir/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "\nMaking index file...\n"
|
||||||
|
if test -z "$use_texi2html"; then
|
||||||
|
CONDS="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\
|
||||||
|
/%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d"
|
||||||
|
else
|
||||||
|
# should take account of --split here.
|
||||||
|
CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d"
|
||||||
|
fi
|
||||||
|
|
||||||
|
curdate=`$SETLANG date '+%B %d, %Y'`
|
||||||
|
sed \
|
||||||
|
-e "s!%%TITLE%%!$MANUAL_TITLE!g" \
|
||||||
|
-e "s!%%EMAIL%%!$EMAIL!g" \
|
||||||
|
-e "s!%%PACKAGE%%!$PACKAGE!g" \
|
||||||
|
-e "s!%%DATE%%!$curdate!g" \
|
||||||
|
-e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
|
||||||
|
-e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
|
||||||
|
-e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
|
||||||
|
-e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \
|
||||||
|
-e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \
|
||||||
|
-e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
|
||||||
|
-e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
|
||||||
|
-e "s!%%PDF_SIZE%%!$pdf_size!g" \
|
||||||
|
-e "s!%%ASCII_SIZE%%!$ascii_size!g" \
|
||||||
|
-e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
|
||||||
|
-e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
|
||||||
|
-e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
|
||||||
|
-e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
|
||||||
|
-e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
|
||||||
|
-e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
|
||||||
|
-e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
|
||||||
|
-e "s,%%SCRIPTURL%%,$scripturl,g" \
|
||||||
|
-e "s!%%SCRIPTNAME%%!$prog!g" \
|
||||||
|
-e "$CONDS" \
|
||||||
|
$GENDOCS_TEMPLATE_DIR/gendocs_template >"$outdir/index.html"
|
||||||
|
|
||||||
|
echo "Done, see $outdir/ subdirectory for new files."
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-end: "$"
|
||||||
|
# End:
|
||||||
@ -0,0 +1,89 @@
|
|||||||
|
<!--#include virtual="/server/header.html" -->
|
||||||
|
<title>%%TITLE%% - GNU Project - Free Software Foundation (FSF)</title>
|
||||||
|
<!--#include virtual="/server/banner.html" -->
|
||||||
|
<h2>%%TITLE%%</h2>
|
||||||
|
|
||||||
|
<address>Free Software Foundation</address>
|
||||||
|
<address>last updated %%DATE%%</address>
|
||||||
|
|
||||||
|
<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="manual.html">Well formatted & color HTML5 version</a>
|
||||||
|
- entirely on one web page.</li>
|
||||||
|
<li><a href="%%PACKAGE%%.html">HTML
|
||||||
|
(%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
|
||||||
|
<li><a href="html_node/index.html">HTML</a> - with one web page per
|
||||||
|
node.</li>
|
||||||
|
%%IF HTML_SECTION%%
|
||||||
|
<li><a href="html_section/index.html">HTML</a> - with one web page per
|
||||||
|
section.</li>
|
||||||
|
%%ENDIF HTML_SECTION%%
|
||||||
|
%%IF HTML_CHAPTER%%
|
||||||
|
<li><a href="html_chapter/index.html">HTML</a> - with one web page per
|
||||||
|
chapter.</li>
|
||||||
|
%%ENDIF HTML_CHAPTER%%
|
||||||
|
<li><a href="%%PACKAGE%%.html.gz">HTML compressed
|
||||||
|
(%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
|
||||||
|
one web page.</li>
|
||||||
|
<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
|
||||||
|
(%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
|
||||||
|
with one web page per node.</li>
|
||||||
|
%%IF HTML_SECTION%%
|
||||||
|
<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
|
||||||
|
(%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
|
||||||
|
with one web page per section.</li>
|
||||||
|
%%ENDIF HTML_SECTION%%
|
||||||
|
%%IF HTML_CHAPTER%%
|
||||||
|
<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
|
||||||
|
(%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
|
||||||
|
with one web page per chapter.</li>
|
||||||
|
%%ENDIF HTML_CHAPTER%%
|
||||||
|
<li><a href="%%PACKAGE%%.info.tar.gz">Info document
|
||||||
|
(%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
|
||||||
|
<li><a href="%%PACKAGE%%.txt">ASCII text
|
||||||
|
(%%ASCII_SIZE%%K bytes)</a>.</li>
|
||||||
|
<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
|
||||||
|
(%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
|
||||||
|
<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
|
||||||
|
(%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
|
||||||
|
<li><a href="%%PACKAGE%%.pdf">PDF file
|
||||||
|
(%%PDF_SIZE%%K bytes)</a>.</li>
|
||||||
|
<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
|
||||||
|
(%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>You can <a href="http://shop.fsf.org/">buy printed copies of
|
||||||
|
some manuals</a> (among other items) from the Free Software Foundation;
|
||||||
|
this helps support FSF activities.</p>
|
||||||
|
|
||||||
|
<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
|
||||||
|
script</a>.)</p>
|
||||||
|
|
||||||
|
<!-- If needed, change the copyright block at the bottom. In general,
|
||||||
|
all pages on the GNU web server should have the section about
|
||||||
|
verbatim copying. Please do NOT remove this without talking
|
||||||
|
with the webmasters first.
|
||||||
|
Please make sure the copyright date is consistent with the document
|
||||||
|
and that it is like this: "2001, 2002", not this: "2001-2002". -->
|
||||||
|
</div><!-- for id="content", starts in the include above -->
|
||||||
|
<!--#include virtual="/server/footer.html" -->
|
||||||
|
<div id="footer">
|
||||||
|
|
||||||
|
<p>Please send general FSF & GNU inquiries to
|
||||||
|
<a href="mailto:gnu@gnu.org"><gnu@gnu.org></a>.
|
||||||
|
There are also <a href="/contact/">other ways to contact</a>
|
||||||
|
the FSF.<br />
|
||||||
|
Please send broken links and other corrections or suggestions to
|
||||||
|
<a href="mailto:%%EMAIL%%"><%%EMAIL%%></a>.</p>
|
||||||
|
|
||||||
|
<p>Copyright © 2013 Free Software Foundation, Inc.</p>
|
||||||
|
|
||||||
|
<p>Verbatim copying and distribution of this entire article are
|
||||||
|
permitted worldwide, without royalty, in any medium, provided this
|
||||||
|
notice, and the copyright notice, are preserved.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@ -0,0 +1,172 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Print a version string.
|
||||||
|
scriptversion=2011-02-19.19; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2007-2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
|
||||||
|
# It may be run two ways:
|
||||||
|
# - from a git repository in which the "git describe" command below
|
||||||
|
# produces useful output (thus requiring at least one signed tag)
|
||||||
|
# - from a non-git-repo directory containing a .tarball-version file, which
|
||||||
|
# presumes this script is invoked like "./git-version-gen .tarball-version".
|
||||||
|
|
||||||
|
# In order to use intra-version strings in your project, you will need two
|
||||||
|
# separate generated version string files:
|
||||||
|
#
|
||||||
|
# .tarball-version - present only in a distribution tarball, and not in
|
||||||
|
# a checked-out repository. Created with contents that were learned at
|
||||||
|
# the last time autoconf was run, and used by git-version-gen. Must not
|
||||||
|
# be present in either $(srcdir) or $(builddir) for git-version-gen to
|
||||||
|
# give accurate answers during normal development with a checked out tree,
|
||||||
|
# but must be present in a tarball when there is no version control system.
|
||||||
|
# Therefore, it cannot be used in any dependencies. GNUmakefile has
|
||||||
|
# hooks to force a reconfigure at distribution time to get the value
|
||||||
|
# correct, without penalizing normal development with extra reconfigures.
|
||||||
|
#
|
||||||
|
# .version - present in a checked-out repository and in a distribution
|
||||||
|
# tarball. Usable in dependencies, particularly for files that don't
|
||||||
|
# want to depend on config.h but do want to track version changes.
|
||||||
|
# Delete this file prior to any autoconf run where you want to rebuild
|
||||||
|
# files to pick up a version string change; and leave it stale to
|
||||||
|
# minimize rebuild time after unrelated changes to configure sources.
|
||||||
|
#
|
||||||
|
# It is probably wise to add these two files to .gitignore, so that you
|
||||||
|
# don't accidentally commit either generated file.
|
||||||
|
#
|
||||||
|
# Use the following line in your configure.ac, so that $(VERSION) will
|
||||||
|
# automatically be up-to-date each time configure is run (and note that
|
||||||
|
# since configure.ac no longer includes a version string, Makefile rules
|
||||||
|
# should not depend on configure.ac for version updates).
|
||||||
|
#
|
||||||
|
# AC_INIT([GNU project],
|
||||||
|
# m4_esyscmd([build-aux/git-version-gen .tarball-version]),
|
||||||
|
# [bug-project@example])
|
||||||
|
#
|
||||||
|
# Then use the following lines in your Makefile.am, so that .version
|
||||||
|
# will be present for dependencies, and so that .tarball-version will
|
||||||
|
# exist in distribution tarballs.
|
||||||
|
#
|
||||||
|
# BUILT_SOURCES = $(top_srcdir)/.version
|
||||||
|
# $(top_srcdir)/.version:
|
||||||
|
# echo $(VERSION) > $@-t && mv $@-t $@
|
||||||
|
# dist-hook:
|
||||||
|
# echo $(VERSION) > $(distdir)/.tarball-version
|
||||||
|
|
||||||
|
case $# in
|
||||||
|
1|2) ;;
|
||||||
|
*) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version" \
|
||||||
|
'[TAG-NORMALIZATION-SED-SCRIPT]'
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
tarball_version_file=$1
|
||||||
|
tag_sed_script="${2:-s/x/x/}"
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
# Avoid meddling by environment variable of the same name.
|
||||||
|
v=
|
||||||
|
v_from_git=
|
||||||
|
|
||||||
|
# First see if there is a tarball-only version file.
|
||||||
|
# then try "git describe", then default.
|
||||||
|
if test -f $tarball_version_file
|
||||||
|
then
|
||||||
|
v=`cat $tarball_version_file` || v=
|
||||||
|
case $v in
|
||||||
|
*$nl*) v= ;; # reject multi-line output
|
||||||
|
[0-9]*) ;;
|
||||||
|
*) v= ;;
|
||||||
|
esac
|
||||||
|
test -z "$v" \
|
||||||
|
&& echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$v"
|
||||||
|
then
|
||||||
|
: # use $v
|
||||||
|
# Otherwise, if there is at least one git commit involving the working
|
||||||
|
# directory, and "git describe" output looks sensible, use that to
|
||||||
|
# derive a version string.
|
||||||
|
elif test "`git log -1 --pretty=format:x . 2>&1`" = x \
|
||||||
|
&& v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \
|
||||||
|
|| git describe --abbrev=4 HEAD 2>/dev/null` \
|
||||||
|
&& v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
|
||||||
|
&& case $v in
|
||||||
|
v[0-9]*) ;;
|
||||||
|
*) (exit 1) ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
# Is this a new git that lists number of commits since the last
|
||||||
|
# tag or the previous older version that did not?
|
||||||
|
# Newer: v6.10-77-g0f8faeb
|
||||||
|
# Older: v6.10-g0f8faeb
|
||||||
|
case $v in
|
||||||
|
*-*-*) : git describe is okay three part flavor ;;
|
||||||
|
*-*)
|
||||||
|
: git describe is older two part flavor
|
||||||
|
# Recreate the number of commits and rewrite such that the
|
||||||
|
# result is the same as if we were using the newer version
|
||||||
|
# of git describe.
|
||||||
|
vtag=`echo "$v" | sed 's/-.*//'`
|
||||||
|
commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \
|
||||||
|
|| { commit_list=failed;
|
||||||
|
echo "$0: WARNING: git rev-list failed" 1>&2; }
|
||||||
|
numcommits=`echo "$commit_list" | wc -l`
|
||||||
|
v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
|
||||||
|
test "$commit_list" = failed && v=UNKNOWN
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Change the first '-' to a '.', so version-comparing tools work properly.
|
||||||
|
# Remove the "g" in git describe's output string, to save a byte.
|
||||||
|
v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
|
||||||
|
v_from_git=1
|
||||||
|
else
|
||||||
|
v=UNKNOWN
|
||||||
|
fi
|
||||||
|
|
||||||
|
v=`echo "$v" |sed 's/^v//'`
|
||||||
|
|
||||||
|
# Test whether to append the "-dirty" suffix only if the version
|
||||||
|
# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
|
||||||
|
# or if it came from .tarball-version.
|
||||||
|
if test -n "$v_from_git"; then
|
||||||
|
# Don't declare a version "dirty" merely because a time stamp has changed.
|
||||||
|
git update-index --refresh > /dev/null 2>&1
|
||||||
|
|
||||||
|
dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
|
||||||
|
case "$dirty" in
|
||||||
|
'') ;;
|
||||||
|
*) # Append the suffix only if there isn't one already.
|
||||||
|
case $v in
|
||||||
|
*-dirty) ;;
|
||||||
|
*) v="$v-dirty" ;;
|
||||||
|
esac ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
|
||||||
|
echo "$v" | tr -d "$nl"
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
@ -0,0 +1,191 @@
|
|||||||
|
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
|
||||||
|
& eval 'exec perl -wS "$0" $argv:q'
|
||||||
|
if 0;
|
||||||
|
# Convert git log output to ChangeLog format.
|
||||||
|
|
||||||
|
my $VERSION = '2009-10-30 13:46'; # UTC
|
||||||
|
# The definition above must lie within the first 8 lines in order
|
||||||
|
# for the Emacs time-stamp write hook (at end) to update it.
|
||||||
|
# If you change this file with Emacs, please let the write hook
|
||||||
|
# do its job. Otherwise, update this string manually.
|
||||||
|
|
||||||
|
# Copyright (C) 2008-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
# Written by Jim Meyering
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Getopt::Long;
|
||||||
|
use POSIX qw(strftime);
|
||||||
|
|
||||||
|
(my $ME = $0) =~ s|.*/||;
|
||||||
|
|
||||||
|
# use File::Coda; # http://meyering.net/code/Coda/
|
||||||
|
END {
|
||||||
|
defined fileno STDOUT or return;
|
||||||
|
close STDOUT and return;
|
||||||
|
warn "$ME: failed to close standard output: $!\n";
|
||||||
|
$? ||= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usage ($)
|
||||||
|
{
|
||||||
|
my ($exit_code) = @_;
|
||||||
|
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||||
|
if ($exit_code != 0)
|
||||||
|
{
|
||||||
|
print $STREAM "Try `$ME --help' for more information.\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print $STREAM <<EOF;
|
||||||
|
Usage: $ME [OPTIONS] [ARGS]
|
||||||
|
|
||||||
|
Convert git log output to ChangeLog format. If present, any ARGS
|
||||||
|
are passed to "git log". To avoid ARGS being parsed as options to
|
||||||
|
$ME, they may be preceded by '--'.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
|
||||||
|
--since=DATE convert only the logs since DATE;
|
||||||
|
the default is to convert all log entries.
|
||||||
|
--format=FMT set format string for commit subject and body;
|
||||||
|
see 'man git-log' for the list of format metacharacters;
|
||||||
|
the default is '%s%n%b%n'
|
||||||
|
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
EXAMPLE:
|
||||||
|
|
||||||
|
$ME --since=2008-01-01 > ChangeLog
|
||||||
|
$ME -- -n 5 foo > last-5-commits-to-branch-foo
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
exit $exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the string $S is a well-behaved file name, simply return it.
|
||||||
|
# If it contains white space, quotes, etc., quote it, and return the new string.
|
||||||
|
sub shell_quote($)
|
||||||
|
{
|
||||||
|
my ($s) = @_;
|
||||||
|
if ($s =~ m![^\w+/.,-]!)
|
||||||
|
{
|
||||||
|
# Convert each single quote to '\''
|
||||||
|
$s =~ s/\'/\'\\\'\'/g;
|
||||||
|
# Then single quote the string.
|
||||||
|
$s = "'$s'";
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub quoted_cmd(@)
|
||||||
|
{
|
||||||
|
return join (' ', map {shell_quote $_} @_);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
my $since_date = '1970-01-01 UTC';
|
||||||
|
my $format_string = '%s%n%b%n';
|
||||||
|
GetOptions
|
||||||
|
(
|
||||||
|
help => sub { usage 0 },
|
||||||
|
version => sub { print "$ME version $VERSION\n"; exit },
|
||||||
|
'since=s' => \$since_date,
|
||||||
|
'format=s' => \$format_string,
|
||||||
|
) or usage 1;
|
||||||
|
|
||||||
|
my @cmd = (qw (git log --log-size), "--since=$since_date",
|
||||||
|
'--pretty=format:%ct %an <%ae>%n%n'.$format_string, @ARGV);
|
||||||
|
open PIPE, '-|', @cmd
|
||||||
|
or die ("$ME: failed to run `". quoted_cmd (@cmd) ."': $!\n"
|
||||||
|
. "(Is your Git too old? Version 1.5.1 or later is required.)\n");
|
||||||
|
|
||||||
|
my $prev_date_line = '';
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
defined (my $in = <PIPE>)
|
||||||
|
or last;
|
||||||
|
$in =~ /^log size (\d+)$/
|
||||||
|
or die "$ME:$.: Invalid line (expected log size):\n$in";
|
||||||
|
my $log_nbytes = $1;
|
||||||
|
|
||||||
|
my $log;
|
||||||
|
my $n_read = read PIPE, $log, $log_nbytes;
|
||||||
|
$n_read == $log_nbytes
|
||||||
|
or die "$ME:$.: unexpected EOF\n";
|
||||||
|
|
||||||
|
my @line = split "\n", $log;
|
||||||
|
my $author_line = shift @line;
|
||||||
|
defined $author_line
|
||||||
|
or die "$ME:$.: unexpected EOF\n";
|
||||||
|
$author_line =~ /^(\d+) (.*>)$/
|
||||||
|
or die "$ME:$.: Invalid line "
|
||||||
|
. "(expected date/author/email):\n$author_line\n";
|
||||||
|
|
||||||
|
my $date_line = sprintf "%s $2\n", strftime ("%F", localtime ($1));
|
||||||
|
# If this line would be the same as the previous date/name/email
|
||||||
|
# line, then arrange not to print it.
|
||||||
|
if ($date_line ne $prev_date_line)
|
||||||
|
{
|
||||||
|
$prev_date_line eq ''
|
||||||
|
or print "\n";
|
||||||
|
print $date_line;
|
||||||
|
}
|
||||||
|
$prev_date_line = $date_line;
|
||||||
|
|
||||||
|
# Omit "Signed-off-by..." lines.
|
||||||
|
@line = grep !/^Signed-off-by: .*>$/, @line;
|
||||||
|
|
||||||
|
# If there were any lines
|
||||||
|
if (@line == 0)
|
||||||
|
{
|
||||||
|
warn "$ME: warning: empty commit message:\n $date_line\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Remove leading and trailing blank lines.
|
||||||
|
while ($line[0] =~ /^\s*$/) { shift @line; }
|
||||||
|
while ($line[$#line] =~ /^\s*$/) { pop @line; }
|
||||||
|
|
||||||
|
# Prefix each non-empty line with a TAB.
|
||||||
|
@line = map { length $_ ? "\t$_" : '' } @line;
|
||||||
|
|
||||||
|
print "\n", join ("\n", @line), "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
defined ($in = <PIPE>)
|
||||||
|
or last;
|
||||||
|
$in ne "\n"
|
||||||
|
and die "$ME:$.: unexpected line:\n$in";
|
||||||
|
}
|
||||||
|
|
||||||
|
close PIPE
|
||||||
|
or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
|
||||||
|
# FIXME-someday: include $PROCESS_STATUS in the diagnostic
|
||||||
|
}
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: perl
|
||||||
|
# indent-tabs-mode: nil
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "my $VERSION = '"
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "'; # UTC"
|
||||||
|
# End:
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Run this after each non-alpha release, to update the web documentation at
|
||||||
|
# http://www.gnu.org/software/$pkg/manual/
|
||||||
|
# This script must be run from the top-level directory,
|
||||||
|
# assumes you're using git for revision control,
|
||||||
|
# and requires a .prev-version file as well as a Makefile,
|
||||||
|
# from which it extracts the version number and package name, respectively.
|
||||||
|
# Also, it assumes all documentation is in the doc/ sub-directory.
|
||||||
|
|
||||||
|
VERSION=2009-07-21.16; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2009-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
# Requirements: everything required to bootstrap your package,
|
||||||
|
# plus these: git, cvs, cvsu, rsync, mktemp
|
||||||
|
|
||||||
|
ME=`basename "$0"`
|
||||||
|
warn() { printf '%s: %s\n' "$ME" "$*" >&2; }
|
||||||
|
die() { warn "$*"; exit 1; }
|
||||||
|
|
||||||
|
help_version()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
--help) cat <<EOF
|
||||||
|
Usage: $ME
|
||||||
|
|
||||||
|
Run this script (no options or arguments) after each non-alpha release,
|
||||||
|
to update the web documentation at http://www.gnu.org/software/\$pkg/manual/
|
||||||
|
Run it from your project's the top-level directory.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help print this help, then exit
|
||||||
|
--version print version number, then exit
|
||||||
|
|
||||||
|
Report bugs and patches to <bug-gnulib@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit ;;
|
||||||
|
|
||||||
|
--version)
|
||||||
|
year=`echo "$VERSION" | sed 's/[^0-9].*//'`
|
||||||
|
cat <<EOF
|
||||||
|
$ME $VERSION
|
||||||
|
Copyright (C) $year Free Software Foundation, Inc,
|
||||||
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
||||||
|
EOF
|
||||||
|
exit ;;
|
||||||
|
|
||||||
|
*) die "unrecognized option: $1";;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
case $# in
|
||||||
|
0) ;;
|
||||||
|
1) help_version $1 ;;
|
||||||
|
*) die "$ME: too many options" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
prev=.prev-version
|
||||||
|
version=$(cat $prev) || die "$ME: no $prev file?"
|
||||||
|
pkg=$(sed -n 's/^PACKAGE = \(.*\)/\1/p' Makefile) || die "$ME: no Makefile?"
|
||||||
|
tmp_branch=web-doc-$version-$$
|
||||||
|
|
||||||
|
cleanup()
|
||||||
|
{
|
||||||
|
__st=$?;
|
||||||
|
rm -rf "$tmp"
|
||||||
|
git checkout master
|
||||||
|
git branch -d $tmp_branch
|
||||||
|
exit $__st
|
||||||
|
}
|
||||||
|
trap cleanup 0
|
||||||
|
trap 'exit $?' 1 2 13 15
|
||||||
|
|
||||||
|
# We must build using sources for which --version reports the
|
||||||
|
# just-released version number, not some string like 7.6.18-20761.
|
||||||
|
# That version string propagates into all documentation.
|
||||||
|
git checkout -b $tmp_branch v$version
|
||||||
|
ok=0
|
||||||
|
./bootstrap && ./configure && make && make web-manual && ok=1
|
||||||
|
test $ok = 1 || exit 1
|
||||||
|
|
||||||
|
tmp=$(mktemp -d --tmpdir=. web-doc-update.XXXXXX) || exit 1
|
||||||
|
( cd $tmp \
|
||||||
|
&& cvs -d $USER@cvs.sv.gnu.org:/webcvs/$pkg co $pkg )
|
||||||
|
rsync -avP doc/manual/ $tmp/$pkg/manual
|
||||||
|
|
||||||
|
(
|
||||||
|
cd $tmp/$pkg/manual
|
||||||
|
|
||||||
|
# Add any new files:
|
||||||
|
cvsu --types='?'|sed s/..// | xargs --no-run-if-empty -- cvs add -ko
|
||||||
|
|
||||||
|
cvs ci -m $version
|
||||||
|
)
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "VERSION="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
@ -0,0 +1,440 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Sign files and upload them.
|
||||||
|
|
||||||
|
scriptversion=2013-03-19.17; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2004-2015 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# 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 2, 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/>.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Duret-Lutz <adl@gnu.org>.
|
||||||
|
# The master copy of this file is maintained in the gnulib Git repository.
|
||||||
|
# Please send bug reports and feature requests to bug-gnulib@gnu.org.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
GPG='gpg --batch --no-tty'
|
||||||
|
conffile=.gnuploadrc
|
||||||
|
to=
|
||||||
|
dry_run=false
|
||||||
|
replace=
|
||||||
|
symlink_files=
|
||||||
|
delete_files=
|
||||||
|
delete_symlinks=
|
||||||
|
collect_var=
|
||||||
|
dbg=
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
usage="Usage: $0 [OPTION]... [CMD] FILE... [[CMD] FILE...]
|
||||||
|
|
||||||
|
Sign all FILES, and process them at the destinations specified with --to.
|
||||||
|
If CMD is not given, it defaults to uploading. See examples below.
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
--delete delete FILES from destination
|
||||||
|
--symlink create symbolic links
|
||||||
|
--rmsymlink remove symbolic links
|
||||||
|
-- treat the remaining arguments as files to upload
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--to DEST specify a destination DEST for FILES
|
||||||
|
(multiple --to options are allowed)
|
||||||
|
--user NAME sign with key NAME
|
||||||
|
--replace allow replacements of existing files
|
||||||
|
--symlink-regex[=EXPR] use sed script EXPR to compute symbolic link names
|
||||||
|
--dry-run do nothing, show what would have been done
|
||||||
|
(including the constructed directive file)
|
||||||
|
--version output version information and exit
|
||||||
|
--help print this help text and exit
|
||||||
|
|
||||||
|
If --symlink-regex is given without EXPR, then the link target name
|
||||||
|
is created by replacing the version information with '-latest', e.g.:
|
||||||
|
foo-1.3.4.tar.gz -> foo-latest.tar.gz
|
||||||
|
|
||||||
|
Recognized destinations are:
|
||||||
|
alpha.gnu.org:DIRECTORY
|
||||||
|
savannah.gnu.org:DIRECTORY
|
||||||
|
savannah.nongnu.org:DIRECTORY
|
||||||
|
ftp.gnu.org:DIRECTORY
|
||||||
|
build directive files and upload files by FTP
|
||||||
|
download.gnu.org.ua:{alpha|ftp}/DIRECTORY
|
||||||
|
build directive files and upload files by SFTP
|
||||||
|
[user@]host:DIRECTORY upload files with scp
|
||||||
|
|
||||||
|
Options and commands are applied in order. If the file $conffile exists
|
||||||
|
in the current working directory, its contents are prepended to the
|
||||||
|
actual command line options. Use this to keep your defaults. Comments
|
||||||
|
(#) and empty lines in $conffile are allowed.
|
||||||
|
|
||||||
|
<http://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html>
|
||||||
|
gives some further background.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
1. Upload foobar-1.0.tar.gz to ftp.gnu.org:
|
||||||
|
gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz
|
||||||
|
|
||||||
|
2. Upload foobar-1.0.tar.gz and foobar-1.0.tar.xz to ftp.gnu.org:
|
||||||
|
gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz foobar-1.0.tar.xz
|
||||||
|
|
||||||
|
3. Same as above, and also create symbolic links to foobar-latest.tar.*:
|
||||||
|
gnupload --to ftp.gnu.org:foobar \\
|
||||||
|
--symlink-regex \\
|
||||||
|
foobar-1.0.tar.gz foobar-1.0.tar.xz
|
||||||
|
|
||||||
|
4. Upload foobar-0.9.90.tar.gz to two sites:
|
||||||
|
gnupload --to alpha.gnu.org:foobar \\
|
||||||
|
--to sources.redhat.com:~ftp/pub/foobar \\
|
||||||
|
foobar-0.9.90.tar.gz
|
||||||
|
|
||||||
|
5. Delete oopsbar-0.9.91.tar.gz and upload foobar-0.9.91.tar.gz
|
||||||
|
(the -- terminates the list of files to delete):
|
||||||
|
gnupload --to alpha.gnu.org:foobar \\
|
||||||
|
--to sources.redhat.com:~ftp/pub/foobar \\
|
||||||
|
--delete oopsbar-0.9.91.tar.gz \\
|
||||||
|
-- foobar-0.9.91.tar.gz
|
||||||
|
|
||||||
|
gnupload executes a program ncftpput to do the transfers; if you don't
|
||||||
|
happen to have an ncftp package installed, the ncftpput-ftp script in
|
||||||
|
the build-aux/ directory of the gnulib package
|
||||||
|
(http://savannah.gnu.org/projects/gnulib) may serve as a replacement.
|
||||||
|
|
||||||
|
Send patches and bug reports to <bug-gnulib@gnu.org>."
|
||||||
|
|
||||||
|
# Read local configuration file
|
||||||
|
if test -r "$conffile"; then
|
||||||
|
echo "$0: Reading configuration file $conffile"
|
||||||
|
conf=`sed 's/#.*$//;/^$/d' "$conffile" | tr "\015$nl" ' '`
|
||||||
|
eval set x "$conf \"\$@\""
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
while test -n "$1"; do
|
||||||
|
case $1 in
|
||||||
|
-*)
|
||||||
|
collect_var=
|
||||||
|
case $1 in
|
||||||
|
--help)
|
||||||
|
echo "$usage"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
--to)
|
||||||
|
if test -z "$2"; then
|
||||||
|
echo "$0: Missing argument for --to" 1>&2
|
||||||
|
exit 1
|
||||||
|
elif echo "$2" | grep 'ftp-upload\.gnu\.org' >/dev/null; then
|
||||||
|
echo "$0: Use ftp.gnu.org:PKGNAME or alpha.gnu.org:PKGNAME" >&2
|
||||||
|
echo "$0: for the destination, not ftp-upload.gnu.org (which" >&2
|
||||||
|
echo "$0: is used for direct ftp uploads, not with gnupload)." >&2
|
||||||
|
echo "$0: See --help and its examples if need be." >&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
to="$to $2"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
--user)
|
||||||
|
if test -z "$2"; then
|
||||||
|
echo "$0: Missing argument for --user" 1>&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
GPG="$GPG --local-user $2"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
--delete)
|
||||||
|
collect_var=delete_files
|
||||||
|
;;
|
||||||
|
--replace)
|
||||||
|
replace="replace: true"
|
||||||
|
;;
|
||||||
|
--rmsymlink)
|
||||||
|
collect_var=delete_symlinks
|
||||||
|
;;
|
||||||
|
--symlink-regex=*)
|
||||||
|
symlink_expr=`expr "$1" : '[^=]*=\(.*\)'`
|
||||||
|
;;
|
||||||
|
--symlink-regex)
|
||||||
|
symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|'
|
||||||
|
;;
|
||||||
|
--symlink)
|
||||||
|
collect_var=symlink_files
|
||||||
|
;;
|
||||||
|
--dry-run|-n)
|
||||||
|
dry_run=:
|
||||||
|
;;
|
||||||
|
--version)
|
||||||
|
echo "gnupload $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
echo "$0: Unknown option '$1', try '$0 --help'" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test -z "$collect_var"; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
eval "$collect_var=\"\$$collect_var $1\""
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
dprint()
|
||||||
|
{
|
||||||
|
echo "Running $* ..."
|
||||||
|
}
|
||||||
|
|
||||||
|
if $dry_run; then
|
||||||
|
dbg=dprint
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$to"; then
|
||||||
|
echo "$0: Missing destination sites" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$symlink_files"; then
|
||||||
|
x=`echo "$symlink_files" | sed 's/[^ ]//g;s/ //g'`
|
||||||
|
if test -n "$x"; then
|
||||||
|
echo "$0: Odd number of symlink arguments" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# = 0; then
|
||||||
|
if test -z "${symlink_files}${delete_files}${delete_symlinks}"; then
|
||||||
|
echo "$0: No file to upload" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Make sure all files exist. We don't want to ask
|
||||||
|
# for the passphrase if the script will fail.
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
if test ! -f $file; then
|
||||||
|
echo "$0: Cannot find '$file'" 1>&2
|
||||||
|
exit 1
|
||||||
|
elif test -n "$symlink_expr"; then
|
||||||
|
linkname=`echo $file | sed "$symlink_expr"`
|
||||||
|
if test -z "$linkname"; then
|
||||||
|
echo "$0: symlink expression produces empty results" >&2
|
||||||
|
exit 1
|
||||||
|
elif test "$linkname" = $file; then
|
||||||
|
echo "$0: symlink expression does not alter file name" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure passphrase is not exported in the environment.
|
||||||
|
unset passphrase
|
||||||
|
unset passphrase_fd_0
|
||||||
|
GNUPGHOME=${GNUPGHOME:-$HOME/.gnupg}
|
||||||
|
|
||||||
|
# Reset PATH to be sure that echo is a built-in. We will later use
|
||||||
|
# 'echo $passphrase' to output the passphrase, so it is important that
|
||||||
|
# it is a built-in (third-party programs tend to appear in 'ps'
|
||||||
|
# listings with their arguments...).
|
||||||
|
# Remember this script runs with 'set -e', so if echo is not built-in
|
||||||
|
# it will exit now.
|
||||||
|
if $dry_run || grep -q "^use-agent" $GNUPGHOME/gpg.conf; then :; else
|
||||||
|
PATH=/empty echo -n "Enter GPG passphrase: "
|
||||||
|
stty -echo
|
||||||
|
read -r passphrase
|
||||||
|
stty echo
|
||||||
|
echo
|
||||||
|
passphrase_fd_0="--passphrase-fd 0"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -ne 0; then
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
echo "Signing $file ..."
|
||||||
|
rm -f $file.sig
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 -ba -o $file.sig $file
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# mkdirective DESTDIR BASE FILE STMT
|
||||||
|
# Arguments: See upload, below
|
||||||
|
mkdirective ()
|
||||||
|
{
|
||||||
|
stmt="$4"
|
||||||
|
if test -n "$3"; then
|
||||||
|
stmt="
|
||||||
|
filename: $3$stmt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat >${2}.directive<<EOF
|
||||||
|
version: 1.2
|
||||||
|
directory: $1
|
||||||
|
comment: gnupload v. $scriptversion$stmt
|
||||||
|
EOF
|
||||||
|
if $dry_run; then
|
||||||
|
echo "File ${2}.directive:"
|
||||||
|
cat ${2}.directive
|
||||||
|
echo "File ${2}.directive:" | sed 's/./-/g'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
mksymlink ()
|
||||||
|
{
|
||||||
|
while test $# -ne 0
|
||||||
|
do
|
||||||
|
echo "symlink: $1 $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# upload DEST DESTDIR BASE FILE STMT FILES
|
||||||
|
# Arguments:
|
||||||
|
# DEST Destination site;
|
||||||
|
# DESTDIR Destination directory;
|
||||||
|
# BASE Base name for the directive file;
|
||||||
|
# FILE Name of the file to distribute (may be empty);
|
||||||
|
# STMT Additional statements for the directive file;
|
||||||
|
# FILES List of files to upload.
|
||||||
|
upload ()
|
||||||
|
{
|
||||||
|
dest=$1
|
||||||
|
destdir=$2
|
||||||
|
base=$3
|
||||||
|
file=$4
|
||||||
|
stmt=$5
|
||||||
|
files=$6
|
||||||
|
|
||||||
|
rm -f $base.directive $base.directive.asc
|
||||||
|
case $dest in
|
||||||
|
alpha.gnu.org:*)
|
||||||
|
mkdirective "$destdir" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
$dbg ncftpput ftp-upload.gnu.org /incoming/alpha $files $base.directive.asc
|
||||||
|
;;
|
||||||
|
ftp.gnu.org:*)
|
||||||
|
mkdirective "$destdir" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
$dbg ncftpput ftp-upload.gnu.org /incoming/ftp $files $base.directive.asc
|
||||||
|
;;
|
||||||
|
savannah.gnu.org:*)
|
||||||
|
if test -z "$files"; then
|
||||||
|
echo "$0: warning: standalone directives not applicable for $dest" >&2
|
||||||
|
fi
|
||||||
|
$dbg ncftpput savannah.gnu.org /incoming/savannah/$destdir $files
|
||||||
|
;;
|
||||||
|
savannah.nongnu.org:*)
|
||||||
|
if test -z "$files"; then
|
||||||
|
echo "$0: warning: standalone directives not applicable for $dest" >&2
|
||||||
|
fi
|
||||||
|
$dbg ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files
|
||||||
|
;;
|
||||||
|
download.gnu.org.ua:alpha/*|download.gnu.org.ua:ftp/*)
|
||||||
|
destdir_p1=`echo "$destdir" | sed 's,^[^/]*/,,'`
|
||||||
|
destdir_topdir=`echo "$destdir" | sed 's,/.*,,'`
|
||||||
|
mkdirective "$destdir_p1" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
for f in $files $base.directive.asc
|
||||||
|
do
|
||||||
|
echo put $f
|
||||||
|
done | $dbg sftp -b - puszcza.gnu.org.ua:/incoming/$destdir_topdir
|
||||||
|
;;
|
||||||
|
/*)
|
||||||
|
dest_host=`echo "$dest" | sed 's,:.*,,'`
|
||||||
|
mkdirective "$destdir" "$base" "$file" "$stmt"
|
||||||
|
echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
|
||||||
|
$dbg cp $files $base.directive.asc $dest_host
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test -z "$files"; then
|
||||||
|
echo "$0: warning: standalone directives not applicable for $dest" >&2
|
||||||
|
fi
|
||||||
|
$dbg scp $files $dest
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
rm -f $base.directive $base.directive.asc
|
||||||
|
}
|
||||||
|
|
||||||
|
#####
|
||||||
|
# Process any standalone directives
|
||||||
|
stmt=
|
||||||
|
if test -n "$symlink_files"; then
|
||||||
|
stmt="$stmt
|
||||||
|
`mksymlink $symlink_files`"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for file in $delete_files
|
||||||
|
do
|
||||||
|
stmt="$stmt
|
||||||
|
archive: $file"
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $delete_symlinks
|
||||||
|
do
|
||||||
|
stmt="$stmt
|
||||||
|
rmsymlink: $file"
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$stmt"; then
|
||||||
|
for dest in $to
|
||||||
|
do
|
||||||
|
destdir=`echo $dest | sed 's/[^:]*://'`
|
||||||
|
upload "$dest" "$destdir" "`hostname`-$$" "" "$stmt"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Process actual uploads
|
||||||
|
for dest in $to
|
||||||
|
do
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
echo "Uploading $file to $dest ..."
|
||||||
|
stmt=
|
||||||
|
#
|
||||||
|
# allowing file replacement is all or nothing.
|
||||||
|
if test -n "$replace"; then stmt="$stmt
|
||||||
|
$replace"
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
files="$file $file.sig"
|
||||||
|
destdir=`echo $dest | sed 's/[^:]*://'`
|
||||||
|
if test -n "$symlink_expr"; then
|
||||||
|
linkname=`echo $file | sed "$symlink_expr"`
|
||||||
|
stmt="$stmt
|
||||||
|
symlink: $file $linkname
|
||||||
|
symlink: $file.sig $linkname.sig"
|
||||||
|
fi
|
||||||
|
upload "$dest" "$destdir" "$file" "$file" "$stmt" "$files"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
@ -1 +0,0 @@
|
|||||||
/usr/share/automake-1.12/install-sh
|
|
||||||
@ -0,0 +1,520 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2009-04-28.21; # UTC
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# `make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
if test -z "$doit"; then
|
||||||
|
doit_exec=exec
|
||||||
|
else
|
||||||
|
doit_exec=$doit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_glob='?'
|
||||||
|
initialize_posix_glob='
|
||||||
|
test "$posix_glob" != "?" || {
|
||||||
|
if (set -f) 2>/dev/null; then
|
||||||
|
posix_glob=
|
||||||
|
else
|
||||||
|
posix_glob=:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
no_target_directory=
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *' '* | *'
|
||||||
|
'* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t) dst_arg=$2
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) no_target_directory=true;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call `install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
trap '(exit $?); exit' 1 2 13 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names starting with `-'.
|
||||||
|
case $src in
|
||||||
|
-*) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
dst=$dst_arg
|
||||||
|
# Protect names starting with `-'.
|
||||||
|
case $dst in
|
||||||
|
-*) dst=./$dst;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test -n "$no_target_directory"; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dst=$dstdir/`basename "$src"`
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||||
|
dstdir=`
|
||||||
|
(dirname "$dst") 2>/dev/null ||
|
||||||
|
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
|
X"$dst" : 'X\(//\)[^/]' \| \
|
||||||
|
X"$dst" : 'X\(//\)$' \| \
|
||||||
|
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
echo X"$dst" |
|
||||||
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)[^/].*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\).*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
s/.*/./; q'
|
||||||
|
`
|
||||||
|
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writeable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/d" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
-*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob"
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
$posix_glob set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
$posix_glob set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test -z "$d" && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=$dstdir/_inst.$$_
|
||||||
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob" &&
|
||||||
|
$posix_glob set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
$posix_glob set +f &&
|
||||||
|
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
## -*- indent-tabs-mode:nil; coding: utf-8 -*-
|
||||||
|
## Copyright (C) 2015
|
||||||
|
## "Mu Lei" known as "NalaGinrut" <NalaGinrut@gmail.com>
|
||||||
|
## Artanis is free software: you can redistribute it and/or modify
|
||||||
|
## it under the terms of the GNU General Public License and GNU
|
||||||
|
## Lesser General Public License published by the Free Software
|
||||||
|
## Foundation, either version 3 of the License, or (at your option)
|
||||||
|
## any later version.
|
||||||
|
|
||||||
|
## Artanis 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 and GNU Lesser General Public License
|
||||||
|
## for more details.
|
||||||
|
|
||||||
|
## You should have received a copy of the GNU General Public License
|
||||||
|
## and GNU Lesser General Public License along with this program.
|
||||||
|
## If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# install in /etc/bash_completion.d/ or your personal directory
|
||||||
|
|
||||||
|
_art()
|
||||||
|
{
|
||||||
|
local cur=`_get_cword`
|
||||||
|
local cmds=`art list-all-cmds`
|
||||||
|
# TODO: support cmd subcmd & options complete
|
||||||
|
#local cmd="${COMP_WORDS[1]}"
|
||||||
|
|
||||||
|
if [ "$COMP_CWORD" == 1 ]; then
|
||||||
|
for opt in $cmds; do
|
||||||
|
if [[ "$opt" == "$cmd" ]]; then
|
||||||
|
COMPREPLY=("$opt")
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
elif [ "$COMP_CWORD" == 2 ]; then
|
||||||
|
# TODO: support cmd options complete
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
COMPREPLY=($(compgen -W "$cmds" -- "$cur"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
complete $filenames -F _art art
|
||||||
|
|
||||||
|
# vim:ts=2 sw=2 et syn=sh
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
/* A C macro for declaring that specific function parameters are not used.
|
||||||
|
Copyright (C) 2008-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
/* _GL_UNUSED_PARAMETER is a marker that can be appended to function parameter
|
||||||
|
declarations for parameters that are not used. This helps to reduce
|
||||||
|
warnings, such as from GCC -Wunused-parameter. The syntax is as follows:
|
||||||
|
type param _GL_UNUSED_PARAMETER
|
||||||
|
or more generally
|
||||||
|
param_decl _GL_UNUSED_PARAMETER
|
||||||
|
For example:
|
||||||
|
int param _GL_UNUSED_PARAMETER
|
||||||
|
int *(*param)(void) _GL_UNUSED_PARAMETER
|
||||||
|
Other possible, but obscure and discouraged syntaxes:
|
||||||
|
int _GL_UNUSED_PARAMETER *(*param)(void)
|
||||||
|
_GL_UNUSED_PARAMETER int *(*param)(void)
|
||||||
|
*/
|
||||||
|
#ifndef _GL_UNUSED_PARAMETER
|
||||||
|
# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_UNUSED_PARAMETER __attribute__ ((__unused__))
|
||||||
|
# else
|
||||||
|
# define _GL_UNUSED_PARAMETER
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
@ -0,0 +1,207 @@
|
|||||||
|
eval '(exit $?0)' && eval 'exec perl -wST "$0" ${1+"$@"}'
|
||||||
|
& eval 'exec perl -wST "$0" $argv:q'
|
||||||
|
if 0;
|
||||||
|
# Detect instances of "if (p) free (p);".
|
||||||
|
# Likewise "if (p != 0)", "if (0 != p)", or with NULL; and with braces.
|
||||||
|
|
||||||
|
my $VERSION = '2011-04-20 13:43'; # UTC
|
||||||
|
# The definition above must lie within the first 8 lines in order
|
||||||
|
# for the Emacs time-stamp write hook (at end) to update it.
|
||||||
|
# If you change this file with Emacs, please let the write hook
|
||||||
|
# do its job. Otherwise, update this string manually.
|
||||||
|
|
||||||
|
# Copyright (C) 2008-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
# Written by Jim Meyering
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
(my $ME = $0) =~ s|.*/||;
|
||||||
|
|
||||||
|
# use File::Coda; # http://meyering.net/code/Coda/
|
||||||
|
END {
|
||||||
|
defined fileno STDOUT or return;
|
||||||
|
close STDOUT and return;
|
||||||
|
warn "$ME: failed to close standard output: $!\n";
|
||||||
|
$? ||= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usage ($)
|
||||||
|
{
|
||||||
|
my ($exit_code) = @_;
|
||||||
|
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||||
|
if ($exit_code != 0)
|
||||||
|
{
|
||||||
|
print $STREAM "Try `$ME --help' for more information.\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print $STREAM <<EOF;
|
||||||
|
Usage: $ME [OPTIONS] FILE...
|
||||||
|
|
||||||
|
Detect any instance in FILE of a useless "if" test before a free call, e.g.,
|
||||||
|
"if (p) free (p);". Any such test may be safely removed without affecting
|
||||||
|
the semantics of the C code in FILE. Use --name=FOO --name=BAR to also
|
||||||
|
detect free-like functions named FOO and BAR.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
|
||||||
|
--list print only the name of each matching FILE (\\0-terminated)
|
||||||
|
--name=N add name N to the list of \`free\'-like functions to detect;
|
||||||
|
may be repeated
|
||||||
|
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
|
||||||
|
0 one or more matches
|
||||||
|
1 no match
|
||||||
|
2 an error
|
||||||
|
|
||||||
|
EXAMPLE:
|
||||||
|
|
||||||
|
For example, this command prints all removable "if" tests before "free"
|
||||||
|
and "kfree" calls in the linux kernel sources:
|
||||||
|
|
||||||
|
git ls-files -z |xargs -0 $ME --name=kfree
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
exit $exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub is_NULL ($)
|
||||||
|
{
|
||||||
|
my ($expr) = @_;
|
||||||
|
return ($expr eq 'NULL' || $expr eq '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
sub EXIT_MATCH {0}
|
||||||
|
sub EXIT_NO_MATCH {1}
|
||||||
|
sub EXIT_ERROR {2}
|
||||||
|
my $err = EXIT_NO_MATCH;
|
||||||
|
|
||||||
|
my $list;
|
||||||
|
my @name = qw(free);
|
||||||
|
GetOptions
|
||||||
|
(
|
||||||
|
help => sub { usage 0 },
|
||||||
|
version => sub { print "$ME version $VERSION\n"; exit },
|
||||||
|
list => \$list,
|
||||||
|
'name=s@' => \@name,
|
||||||
|
) or usage 1;
|
||||||
|
|
||||||
|
# Make sure we have the right number of non-option arguments.
|
||||||
|
# Always tell the user why we fail.
|
||||||
|
@ARGV < 1
|
||||||
|
and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR;
|
||||||
|
|
||||||
|
my $or = join '|', @name;
|
||||||
|
my $regexp = qr/(?:$or)/;
|
||||||
|
|
||||||
|
# Set the input record separator.
|
||||||
|
# Note: this makes it impractical to print line numbers.
|
||||||
|
$/ = '"';
|
||||||
|
|
||||||
|
my $found_match = 0;
|
||||||
|
FILE:
|
||||||
|
foreach my $file (@ARGV)
|
||||||
|
{
|
||||||
|
open FH, '<', $file
|
||||||
|
or (warn "$ME: can't open `$file' for reading: $!\n"),
|
||||||
|
$err = EXIT_ERROR, next;
|
||||||
|
while (defined (my $line = <FH>))
|
||||||
|
{
|
||||||
|
while ($line =~
|
||||||
|
/\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*([^)]+?))?\s*\)
|
||||||
|
# 1 2 3
|
||||||
|
(?: \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;|
|
||||||
|
\s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg)
|
||||||
|
{
|
||||||
|
my $all = $1;
|
||||||
|
my ($lhs, $rhs) = ($2, $3);
|
||||||
|
my ($free_opnd, $braced_free_opnd) = ($4, $5);
|
||||||
|
my $non_NULL;
|
||||||
|
if (!defined $rhs) { $non_NULL = $lhs }
|
||||||
|
elsif (is_NULL $rhs) { $non_NULL = $lhs }
|
||||||
|
elsif (is_NULL $lhs) { $non_NULL = $rhs }
|
||||||
|
else { next }
|
||||||
|
|
||||||
|
# Compare the non-NULL part of the "if" expression and the
|
||||||
|
# free'd expression, without regard to white space.
|
||||||
|
$non_NULL =~ tr/ \t//d;
|
||||||
|
my $e2 = defined $free_opnd ? $free_opnd : $braced_free_opnd;
|
||||||
|
$e2 =~ tr/ \t//d;
|
||||||
|
if ($non_NULL eq $e2)
|
||||||
|
{
|
||||||
|
$found_match = 1;
|
||||||
|
$list
|
||||||
|
and (print "$file\0"), next FILE;
|
||||||
|
print "$file: $all\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
{
|
||||||
|
close FH;
|
||||||
|
}
|
||||||
|
|
||||||
|
$found_match && $err == EXIT_NO_MATCH
|
||||||
|
and $err = EXIT_MATCH;
|
||||||
|
|
||||||
|
exit $err;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $foo = <<'EOF';
|
||||||
|
# The above is to *find* them.
|
||||||
|
# This adjusts them, removing the unnecessary "if (p)" part.
|
||||||
|
|
||||||
|
# FIXME: do something like this as an option (doesn't do braces):
|
||||||
|
free=xfree
|
||||||
|
git grep -l -z "$free *(" \
|
||||||
|
| xargs -0 useless-if-before-free -l --name="$free" \
|
||||||
|
| xargs -0 perl -0x3b -pi -e \
|
||||||
|
's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s+('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\)\s*;)/$2/s'
|
||||||
|
|
||||||
|
# Use the following to remove redundant uses of kfree inside braces.
|
||||||
|
# Note that -0777 puts perl in slurp-whole-file mode;
|
||||||
|
# but we have plenty of memory, these days...
|
||||||
|
free=kfree
|
||||||
|
git grep -l -z "$free *(" \
|
||||||
|
| xargs -0 useless-if-before-free -l --name="$free" \
|
||||||
|
| xargs -0 perl -0777 -pi -e \
|
||||||
|
's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s*\{\s*('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\);)\s*\}[^\n]*$/$2/gms'
|
||||||
|
|
||||||
|
Be careful that the result of the above transformation is valid.
|
||||||
|
If the matched string is followed by "else", then obviously, it won't be.
|
||||||
|
|
||||||
|
When modifying files, refuse to process anything other than a regular file.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
## Local Variables:
|
||||||
|
## mode: perl
|
||||||
|
## indent-tabs-mode: nil
|
||||||
|
## eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
## time-stamp-start: "my $VERSION = '"
|
||||||
|
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||||
|
## time-stamp-time-zone: "UTC"
|
||||||
|
## time-stamp-end: "'; # UTC"
|
||||||
|
## End:
|
||||||
@ -0,0 +1,113 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# List version-controlled file names.
|
||||||
|
|
||||||
|
# Print a version string.
|
||||||
|
scriptversion=2011-05-16.22; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2006-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
|
||||||
|
# List the specified version-controlled files.
|
||||||
|
# With no argument, list them all. With a single DIRECTORY argument,
|
||||||
|
# list the version-controlled files in that directory.
|
||||||
|
|
||||||
|
# If there's an argument, it must be a single, "."-relative directory name.
|
||||||
|
# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
|
||||||
|
|
||||||
|
postprocess=
|
||||||
|
case $1 in
|
||||||
|
--help) cat <<EOF
|
||||||
|
Usage: $0 [-C SRCDIR] [DIR...]
|
||||||
|
|
||||||
|
Output a list of version-controlled files in DIR (default .), relative to
|
||||||
|
SRCDIR (default .). SRCDIR must be the top directory of a checkout.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help print this help, then exit
|
||||||
|
--version print version number, then exit
|
||||||
|
-C SRCDIR change directory to SRCDIR before generating list
|
||||||
|
|
||||||
|
Report bugs and patches to <bug-gnulib@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit ;;
|
||||||
|
|
||||||
|
--version)
|
||||||
|
year=`echo "$scriptversion" | sed 's/[^0-9].*//'`
|
||||||
|
cat <<EOF
|
||||||
|
vc-list-files $scriptversion
|
||||||
|
Copyright (C) $year Free Software Foundation, Inc,
|
||||||
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
||||||
|
EOF
|
||||||
|
exit ;;
|
||||||
|
|
||||||
|
-C)
|
||||||
|
test "$2" = . || postprocess="| sed 's|^|$2/|'"
|
||||||
|
cd "$2" || exit 1
|
||||||
|
shift; shift ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
test $# = 0 && set .
|
||||||
|
|
||||||
|
for dir
|
||||||
|
do
|
||||||
|
if test -d .git; then
|
||||||
|
test "x$dir" = x. \
|
||||||
|
&& dir= sed_esc= \
|
||||||
|
|| { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; }
|
||||||
|
# Ignore git symlinks - either they point into the tree, in which case
|
||||||
|
# we don't need to visit the target twice, or they point somewhere
|
||||||
|
# else (often into a submodule), in which case the content does not
|
||||||
|
# belong to this package.
|
||||||
|
eval exec git ls-tree -r 'HEAD:"$dir"' \
|
||||||
|
\| sed -n '"s/^100[^ ]*./$sed_esc/p"' $postprocess
|
||||||
|
elif test -d .hg; then
|
||||||
|
eval exec hg locate '"$dir/*"' $postprocess
|
||||||
|
elif test -d .bzr; then
|
||||||
|
test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
|
||||||
|
eval exec bzr ls -R --versioned '"$dir"' $postprocess
|
||||||
|
elif test -d CVS; then
|
||||||
|
test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
|
||||||
|
if test -x build-aux/cvsu; then
|
||||||
|
eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess
|
||||||
|
elif (cvsu --help) >/dev/null 2>&1; then
|
||||||
|
eval cvsu --find --types=AFGM '"$dir"' $postprocess
|
||||||
|
else
|
||||||
|
eval awk -F/ \''{ \
|
||||||
|
if (!$1 && $3 !~ /^-/) { \
|
||||||
|
f=FILENAME; \
|
||||||
|
if (f ~ /CVS\/Entries$/) \
|
||||||
|
f = substr(f, 1, length(f)-11); \
|
||||||
|
print f $2; \
|
||||||
|
}}'\'' \
|
||||||
|
`find "$dir" -name Entries -print` /dev/null' $postprocess
|
||||||
|
fi
|
||||||
|
elif test -d .svn; then
|
||||||
|
eval exec svn list -R '"$dir"' $postprocess
|
||||||
|
else
|
||||||
|
echo "$0: Failed to determine type of version control used in `pwd`" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
@ -0,0 +1,109 @@
|
|||||||
|
/* A C macro for emitting warnings if a function is used.
|
||||||
|
Copyright (C) 2010-2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
|
||||||
|
for FUNCTION which will then trigger a compiler warning containing
|
||||||
|
the text of "literal string" anywhere that function is called, if
|
||||||
|
supported by the compiler. If the compiler does not support this
|
||||||
|
feature, the macro expands to an unused extern declaration.
|
||||||
|
|
||||||
|
This macro is useful for marking a function as a potential
|
||||||
|
portability trap, with the intent that "literal string" include
|
||||||
|
instructions on the replacement function that should be used
|
||||||
|
instead. However, one of the reasons that a function is a
|
||||||
|
portability trap is if it has the wrong signature. Declaring
|
||||||
|
FUNCTION with a different signature in C is a compilation error, so
|
||||||
|
this macro must use the same type as any existing declaration so
|
||||||
|
that programs that avoid the problematic FUNCTION do not fail to
|
||||||
|
compile merely because they included a header that poisoned the
|
||||||
|
function. But this implies that _GL_WARN_ON_USE is only safe to
|
||||||
|
use if FUNCTION is known to already have a declaration. Use of
|
||||||
|
this macro implies that there must not be any other macro hiding
|
||||||
|
the declaration of FUNCTION; but undefining FUNCTION first is part
|
||||||
|
of the poisoning process anyway (although for symbols that are
|
||||||
|
provided only via a macro, the result is a compilation error rather
|
||||||
|
than a warning containing "literal string"). Also note that in
|
||||||
|
C++, it is only safe to use if FUNCTION has no overloads.
|
||||||
|
|
||||||
|
For an example, it is possible to poison 'getline' by:
|
||||||
|
- adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
|
||||||
|
[getline]) in configure.ac, which potentially defines
|
||||||
|
HAVE_RAW_DECL_GETLINE
|
||||||
|
- adding this code to a header that wraps the system <stdio.h>:
|
||||||
|
#undef getline
|
||||||
|
#if HAVE_RAW_DECL_GETLINE
|
||||||
|
_GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
|
||||||
|
"not universally present; use the gnulib module getline");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
It is not possible to directly poison global variables. But it is
|
||||||
|
possible to write a wrapper accessor function, and poison that
|
||||||
|
(less common usage, like &environ, will cause a compilation error
|
||||||
|
rather than issue the nice warning, but the end result of informing
|
||||||
|
the developer about their portability problem is still achieved):
|
||||||
|
#if HAVE_RAW_DECL_ENVIRON
|
||||||
|
static inline char ***rpl_environ (void) { return &environ; }
|
||||||
|
_GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
|
||||||
|
# undef environ
|
||||||
|
# define environ (*rpl_environ ())
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
#ifndef _GL_WARN_ON_USE
|
||||||
|
|
||||||
|
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||||
|
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
||||||
|
# define _GL_WARN_ON_USE(function, message) \
|
||||||
|
extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
/* Verify the existence of the function. */
|
||||||
|
# define _GL_WARN_ON_USE(function, message) \
|
||||||
|
extern __typeof__ (function) function
|
||||||
|
# else /* Unsupported. */
|
||||||
|
# define _GL_WARN_ON_USE(function, message) \
|
||||||
|
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
|
||||||
|
is like _GL_WARN_ON_USE (function, "string"), except that the function is
|
||||||
|
declared with the given prototype, consisting of return type, parameters,
|
||||||
|
and attributes.
|
||||||
|
This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
|
||||||
|
not work in this case. */
|
||||||
|
#ifndef _GL_WARN_ON_USE_CXX
|
||||||
|
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||||
|
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||||
|
extern rettype function parameters_and_attributes \
|
||||||
|
__attribute__ ((__warning__ (msg)))
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
/* Verify the existence of the function. */
|
||||||
|
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||||
|
extern rettype function parameters_and_attributes
|
||||||
|
# else /* Unsupported. */
|
||||||
|
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||||
|
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_WARN_EXTERN_C declaration;
|
||||||
|
performs the declaration with C linkage. */
|
||||||
|
#ifndef _GL_WARN_EXTERN_C
|
||||||
|
# if defined __cplusplus
|
||||||
|
# define _GL_WARN_EXTERN_C extern "C"
|
||||||
|
# else
|
||||||
|
# define _GL_WARN_EXTERN_C extern
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
Loading…
Reference in new issue