Greetings cygwinistas.

I've written a program in Perl that satisfies a desire I've had for a
while. I wanted to have a way  to check out what Perl module distributions
have been made into cygwin packages installable with Setup, but outside of
Setup. The main feature of how the program works is the specification of
"namespace globs" like "IO-*" or "Module-*" used as the argument to my
script. This allows for surveying a manageable grouping of packages from
the Cygwin server, in the TMI (terminal, text mode interface, commandline).
I think it's best if I just show some representative output rather than
struggling to explain what I mean:

$ perl ~/Scripts-working/cygchk-perl-mods.pl 'perl-Module-*'
Matching distributions packaged for Cygwin:
Fetching setup.ini from cygwin.com...

perl-Module-Build           Module::Build is installed as
/usr/local/share/perl5/site_perl/5.40/Module/Build.pm
perl-Module-Build-Tiny      Module::Build::Tiny is installed as
/usr/local/share/perl5/site_perl/5.40/Module/Build/Tiny.pm
perl-Module-Build-XSUtil    Module::Build::XSUtil is installed as
/usr/local/share/perl5/site_perl/5.40/Module/Build/XSUtil.pm
perl-Module-Implementation  Module::Implementation is installed as
/usr/local/share/perl5/site_perl/5.40/Module/Implementation.pm
perl-Module-Install         Module::Install is installed as
/usr/local/share/perl5/site_perl/5.40/Module/Install.pm
perl-Module-Metadata        Module::Metadata is installed as
/usr/share/perl5/5.40/Module/Metadata.pm
perl-Module-Pluggable       Module::Pluggable is installed as
/usr/local/share/perl5/site_perl/5.40/Module/Pluggable.pm
perl-Module-Runtime         Module::Runtime is installed as
/usr/local/share/perl5/site_perl/5.40/Module/Runtime.pm
perl-Module-ScanDeps        Module::ScanDeps is installed as
/usr/local/share/perl5/site_perl/5.40/Module/ScanDeps.pm
perl-Module-Signature       Module::Signature is not installed

That's how it produces output. The point of this is twofold. One is that
there are hundreds of packaged modules in Setup and I find myself squinting
and getting a headache if I just try to scroll through the huge list that
matches "perl-". The other point is that the output allows me to check
whether I've built a module from CPAN and perl has installed it under
"site_perl/" (which has the consequence that it has precedence over modules
installed to "vendor_perl/" [which is called "shadowing"]).

I could possibly add features to this program: displaying the version of
the module installed would be one nice thing. But I believe in the unix
virtue of "small tools that do one thing well" (and I am a bit busy, yeah)
and so for now I'll avoid feeping creaturism and just show y'all the script:

(If you prefer to download rather than c&p I've made a gist for it at
https://gist.github.com/somian/22f6d1baae1b44c6c1e0cb0ea867e0a5)

#!/usr/bin/perl
# Last modified: Tue Mar 24 11:57:45 2026

use strict;
use v5.18;
use utf8;
use warnings;
use Carp qw/ carp croak /;
=head1 NAME
cygchk-perlmods.pl

=head1 SYNOPSIS
cygchk-perlmods.pl "IO-*"      # "glob expression"

=head1 VERSION
0.10

=head1 AUTHOR
Soren Andersen C<[email protected]>

=cut

if ( @ARGV * 1 == 0 ) {
    croak 'You must type an argument. Exiting.';
}
my ($globexpr) = @ARGV;
my $as_perl_says;

if ($globexpr !~/^perl-/) {  # you may omit the "perl-" prefix in the
argument
    $globexpr = 'perl-' . $globexpr;
}

$globexpr = lc $globexpr;
open( my $ok_fh, '-|', "cygcheck", "-e", $globexpr);
croak "Dying from no open on cygcheck" unless $ok_fh;

printf( "Matching distributions packaged for Cygwin:\n" );
my ( @dists, $mlen );
$mlen = 0;
while (<$ok_fh>) {
     my $setup_name = $_;
     my $nonly = (split( ' : ' ))[0];
     $mlen = length($nonly) > $mlen ? length($nonly) : $mlen;
     push @dists, $nonly;
}
for (@dists) {
     my $e = substr($_,5);
     $e =~s/-/::/g;
     $as_perl_says = $e;
     my $report_str = sprintf( "%-${mlen}s  %s" =>
                              $_, $as_perl_says );
     $report_str .=  q[ ].chk_inst( $as_perl_says );
     say $report_str;
}

sub chk_inst {
    local $::pkgname = $_[0];
    eval qq{require $::pkgname;};
    unless ( $@ ) {
        my $pm = $_[0];
        $pm =~ s{::}{/}g;
        $pm .= '.pm';
        return 'is installed as '. $INC{ $pm };
    } else {
        return 'is not installed';
    }
}
__END__

=head1 LICENSE
This program is Free software, made available under the same terms as Perl.
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

=cut

# vim: ft=perl et sw=4 ts=4 :


-- 
Soren

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to