painless perl ports with cpan2port

Post on 05-Dec-2014

3.972 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Painless Perl Portswith cpan2portBenny Siegert ‹bsiegert@gmail.com›

The MirOS Project (http://www.mirbsd.org)

FOSDEM 2009

Contents

1. Introduction

Perl, MirPorts

2. Presenting cpan2port

with live demo

3. Implementation notes

4. Conclusion

Perl and CPAN

‣ Comprehensive Perl Archive Network

‣ 15 000 modules by >7000 authors

➡ lots of ports to create

‣ CPAN module and shell(perl -MCPAN -eshell)does not know about ports and packages

Ports

‣ mechanism to install 3rd-party software in BSD operating systems

‣ ports are used to create binary packages

‣ installation “recipe” in a Makefile + metadata

↪What is required to create a port?

# $MirOS: ports/devel/svk/Makefile,v 1.4 2008/10/04 19:46:50 bsiegert Exp $

COMMENT= distributed version control system

VERSION= 2.2.0DASH_VER= 0DISTNAME= SVK-v${VERSION}PKGNAME= svk-${VERSION}-${DASH_VER}CATEGORIES= devel net

HOMEPAGE= http://svk.bestpractical.com/MASTER_SITES= ${MASTER_SITE_PERL_CPAN:=../by-authors/id/C/CL/CLKAO/}

RESPONSIBLE= Benny Siegert <bsiegert@gmx.de>

# LGPLPERMIT_PACKAGE_CDROM= YesPERMIT_PACKAGE_FTP= YesPERMIT_DISTFILES_CDROM= YesPERMIT_DISTFILES_FTP= Yes

B_R_DEPENDS+= ::archivers/p5-PerlIO-via-Bzip2[...]

CONFIGURE_STYLE= perlCONFIGURE_ARGS+= --defaultdeps

.include <bsd.port.mk>

distribution name, version

category

where to download

dependencies!

one-line description

Other metadata

‣ DESCR: long description (about 100 words)

‣ PLIST: packing list (automatically created)

‣ distinfo: checksums for distfile(automatically created)

Introducing cpan2port

‣ Perl script allowing the rapid creationof Perl module ports

‣ using the CPAN module

‣ creates a stub port which may be refinedand drops you to a shell

‣ only a few more commands neededin the ideal case

… live demo …Log::Dispatch module

Implementation notes

How does it work?

‣ CPAN.pm discovers most of the information needed

‣ finds the distribution name for a module(e.g. D/DR/DROLSKY/Log-Dispatch-2.22.tar.gz)

‣ for more info, “make“ the module inside cpan

How does it work?

‣ CPAN.pm discovers most of the information needed

‣ finds the distribution name for a module(e.g. D/DR/DROLSKY/Log-Dispatch-2.22.tar.gz)

‣ for more info, “make“ the module inside cpan

download dir

How does it work?

‣ CPAN.pm discovers most of the information needed

‣ finds the distribution name for a module(e.g. D/DR/DROLSKY/Log-Dispatch-2.22.tar.gz)

‣ for more info, “make“ the module inside cpan

DISTNAME

How does it work?

‣ CPAN.pm discovers most of the information needed

‣ finds the distribution name for a module(e.g. D/DR/DROLSKY/Log-Dispatch-2.22.tar.gz)

‣ for more info, “make“ the module inside cpan

EXTRACT_SUFX

Before “make“

Module id = Log::Dispatch DESCRIPTION Log messages to multiple outputs CPAN_USERID DROLSKY (Dave Rolsky <autarch@urth.org>) CPAN_VERSION 2.22 CPAN_FILE D/DR/DROLSKY/Log-Dispatch-2.22.tar.gz DSLI_STATUS RdpO (released,developer,perl,object-oriented) INST_FILE (not installed)

Distribution id = D/DR/DROLSKY/Log-Dispatch-2.22.tar.gz CPAN_USERID DROLSKY (Dave Rolsky <autarch@urth.org>) CONTAINSMODS Log::Dispatch::File::Locked [...]

After “make“

Distribution id = D/DR/DROLSKY/Log-Dispatch-2.22.tar.gz CPAN_USERID DROLSKY (Dave Rolsky <autarch@urth.org>) CALLED_FOR Log::Dispatch CONTAINSMODS Log::Dispatch::File::Locked [...] MD5_STATUS OK archived tar build_dir /Users/bsiegert/.cpan/build/Log-Dispatch-2.22 localfile /Users/bsiegert/.cpan/sources/authors/id/D/DR/ DROLSKY/Log-Dispatch-2.22.tar.gz make YES prereq_pm Test::More Params::Validate File::Temp Module::Build prereq_pm_detected 1 unwrapped YES writemakefile YES

Dependencies

‣ prereq_pm is a hash with module => minversion

‣ expand module to distname

‣ static table of modules in the base system, with “unsystematic“ names or non-CPAN

‣ rest: glob for /usr/ports/*/p5-NAME

‣ output dependency string in our format

Descriptions

‣ For some modules, cpan knows a one-line description (COMMENT), not for others

‣ readmes are useless for getting a longer one

‣ parse the manpage, i.e. the POD

POD parsing

‣ “NAME“ section contains one-line comment

‣ Log::Dispatch - Dispatches messages to one or more outputs

‣ longer description: first few paragraphs from “DESCRIPTION“ section

‣ up to first control command

‣ plain-text conversion is easy

my $parser = Pod::Text->new(indent => 0, width => 72);

finally …

‣ ask user for category, create directory

‣ variable substitution in Makefile template

‣ write DESCR

‣ copy distfile to Distfiles directory

‣ run “make checksum“

‣ drop user to a shell, needs to run regress, update-plist, install targets

Porting to other systems

‣ right now, cpan2port is available for MirPorts

‣ easily portable

‣ adapt perlmod.Makefile template

‣ change base module list accordingly

‣ adapt dependency output to your syntax

Conclusion

‣ cpan2port does the routine workin porting Perl modules

‣ available in MirPorts, easy to port

‣ pkgsrc, FreeBSD, OpenBSD people: try it!

‣ Sources available athttp://cvs.mirbsd.de/ports/infrastructure/scripts/cpan2porthttp://cvs.mirbsd.de/ports/infrastructure/templates/perlmod.Makefile

Thank you for your attention!

Questions?

top related