diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2013-01-28 12:11:32 +0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2013-01-28 12:11:32 +0100 |
commit | 427b8cacf3280ac2651839a0aa031792fd85aa03 (patch) | |
tree | 1c86b8f390b5a1f05522e3f751c0411dd46b594b /maintainers | |
parent | 201f64b20a8c786ea280817b4a3ef4c0e235eaa7 (diff) |
Add very hacky script to generate Perl packages
Given the name of Perl module, this script will download the package containing the module from CPAN, determine its dependencies, and print a Nix expression suitable for inclusion in perl-packages.nix on stdout. Example: $ ./maintainers/scripts/generate-cpan-package DBIx::Class DBIxClass = buildPerlPackage { name = "DBIx-Class-0.08205"; src = fetchurl { url = mirror://cpan/authors/id/F/FR/FREW/DBIx-Class-0.08205.tar.gz; sha256 = "16iyrfvwf4y94wxpwlla131grdf10z4xx9q9s6jsi39ycaxdaj6l"; }; buildInputs = [ DBDSQLite PackageStash TestException TestWarn ]; propagatedBuildInputs = [ ClassAccessorGrouped ClassC3Componentised ClassInspector ConfigAny ContextPreserve DataCompare DataDumperConcise DataPage DBI DevelGlobalDestruction HashMerge ModuleFind Moo MROCompat namespaceclean PathClass ScopeGuard SQLAbstract SubName TryTiny ]; meta = { homepage = http://www.dbix-class.org/; description = "Extensible and flexible object <-> relational mapper."; license = "perl"; }; };
Diffstat (limited to 'maintainers')
-rwxr-xr-x | maintainers/scripts/generate-cpan-package | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/maintainers/scripts/generate-cpan-package b/maintainers/scripts/generate-cpan-package new file mode 100755 index 0000000000000..f091625b6ce79 --- /dev/null +++ b/maintainers/scripts/generate-cpan-package @@ -0,0 +1,122 @@ +#! /bin/sh -e + +export PERL5LIB=/nix/var/nix/profiles/per-user/eelco/cpan-generator/lib/perl5/site_perl + +name="$1" +[ -n "$name" ] || { echo "no name"; exit 1; } + +cpan -D "$name" > cpan-info + +url="$(echo $(cat cpan-info | sed '6!d'))" +[ -n "$url" ] || { echo "no URL"; exit 1; } +url="mirror://cpan/authors/id/$url" +echo "URL = $url" >&2 + +version=$(cat cpan-info | grep 'CPAN: ' | awk '{ print $2 }') +echo "VERSION = $version" + +declare -a xs=($(PRINT_PATH=1 nix-prefetch-url "$url")) +hash=${xs[0]} +path=${xs[1]} +echo "HASH = $hash" >&2 + +namedash="$(echo $name | sed s/::/-/g)-$version" + +attr=$(echo $name | sed s/:://g) + +rm -rf cpan_tmp +mkdir cpan_tmp +tar xf "$path" -C cpan_tmp + +shopt -s nullglob +meta=$(echo cpan_tmp/*/META.json) +if [ -z "$meta" ]; then + yaml=$(echo cpan_tmp/*/META.yml) + [ -n "$yaml" ] || { echo "no meta file"; exit 1; } + meta=$(echo $yaml | sed s/\.yml$/.json/) + perl -e ' + use YAML; + use JSON; + local $/; + $x = YAML::Load(<>); + print encode_json $x; + ' < $yaml > $meta +fi + +description="$(json abstract < $meta | perl -e '$x = <>; print uc(substr($x, 0, 1)), substr($x, 1);')" +homepage="$(json resources.homepage < $meta)" +if [ -z "$homepage" ]; then + #homepage="$(json meta-spec.url < $meta)" + true +fi + +license="$(json license < $meta | json -a 2> /dev/null || true)" +if [ -z "$license" ]; then + license="$(json -a license < $meta)" +fi +license="$(echo $license | sed s/perl_5/perl5/)" + +f() { + local type="$1" + perl -e ' + use JSON; + local $/; + $x = decode_json <>; + if (defined $x->{prereqs}) { + $x2 = $x->{prereqs}->{'$type'}->{requires}; + } elsif ("'$type'" eq "runtime") { + $x2 = $x->{requires}; + } elsif ("'$type'" eq "configure") { + $x2 = $x->{configure_requires}; + } elsif ("'$type'" eq "build") { + $x2 = $x->{build_requires}; + } + foreach my $y (keys %{$x2}) { + next if $y eq "perl"; + eval "use $y;"; + if (!$@) { + print STDERR "skipping Perl-builtin module $y\n"; + next; + } + print $y, "\n"; + }; + ' < $meta | sed s/:://g +} + +confdeps=$(f configure) +builddeps=$(f build) +testdeps=$(f test) +runtimedeps=$(f runtime) + +buildInputs=$(echo $(for i in $confdeps $builddeps $testdeps; do echo $i; done | sort | uniq)) +propagatedBuildInputs=$(echo $(for i in $runtimedeps; do echo $i; done | sort | uniq)) + +echo "===" >&2 + +cat <<EOF + $attr = buildPerlPackage { + name = "$namedash"; + src = fetchurl { + url = $url; + sha256 = "$hash"; + }; +EOF +if [ -n "$buildInputs" ]; then + cat <<EOF + buildInputs = [ $buildInputs ]; +EOF +fi +if [ -n "$propagatedBuildInputs" ]; then + cat <<EOF + propagatedBuildInputs = [ $propagatedBuildInputs ]; +EOF +fi +cat <<EOF + meta = { + homepage = $homepage; + description = "$description"; + license = "$license"; + }; + }; +EOF + |