All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules
@ 2014-02-23 14:17 Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 1/6] perl: remove PERL_INSTALL_TARGET_GOALS Francois Perrad
                   ` (6 more replies)
  0 siblings, 7 replies; 9+ messages in thread
From: Francois Perrad @ 2014-02-23 14:17 UTC (permalink / raw)
  To: buildroot

delta V11 vs V10
 - manual
   + some improvements
 - scancpan
   + add comments

delta V9 vs V10
 - reorder patches (Note that patch 1/6 can go in immediately, perhaps even for 2014.02)
 - scancpan
   + remove spurious final empty line in Config.in
   + POD description
   + generates target/host variants only when needed
 - manual

delta V8 vs V9 :
 - scancpan 
   + back to fatpack
   + use 5.018;

delta V7 vs V8 :
 - typo and minor improvements

delta V6 vs V7 :
 - global
   + substitute 'perl_5' by 'Artistic or GPLv1+'
 - scancpan
   + remove 'NO ABSTRACT'
   + check Module::CoreList::is_core with the target Perl version
   + add packages Module-CoreList and MetaCPAN-API-Tiny instead of use Fatpack
   + add GPL

delta V5 vs V6 :
 - export PERL5LIB
 - rename PKG_PERL_ARCHNAME to PERL_ARCHNAME
 - remove $(2)_*_OPT (with empty default value)
 - remove PERL_INSTALL_TARGET_GOALS


Francois Perrad (6):
  perl: remove PERL_INSTALL_TARGET_GOALS
  pkg-perl: new infrastructure
  host-perl-xml-parser: rename and refactor with perl infrastructure
  host-perl-module-build: new package
  manual: adding packages perl
  scancpan: a new script

 Config.in                                        |   11 +
 docs/manual/adding-packages-perl.txt             |  120 ++++
 docs/manual/adding-packages.txt                  |    2 +
 package/Config.in                                |    1 -
 package/Makefile.in                              |    4 +-
 package/intltool/intltool.mk                     |    2 +-
 package/libxml-parser-perl/Config.in             |   10 -
 package/libxml-parser-perl/libxml-parser-perl.mk |   35 -
 package/metacity/metacity.mk                     |    2 +-
 package/perl-module-build/perl-module-build.mk   |   12 +
 package/perl-xml-parser/perl-xml-parser.mk       |   17 +
 package/perl/perl.mk                             |    4 +-
 package/pkg-perl.mk                              |  181 ++++++
 support/scripts/scancpan                         |  741 ++++++++++++++++++++++
 14 files changed, 1090 insertions(+), 52 deletions(-)
 create mode 100644 docs/manual/adding-packages-perl.txt
 delete mode 100644 package/libxml-parser-perl/Config.in
 delete mode 100644 package/libxml-parser-perl/libxml-parser-perl.mk
 create mode 100644 package/perl-module-build/perl-module-build.mk
 create mode 100644 package/perl-xml-parser/perl-xml-parser.mk
 create mode 100644 package/pkg-perl.mk
 create mode 100755 support/scripts/scancpan

-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 1/6] perl: remove PERL_INSTALL_TARGET_GOALS
  2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
@ 2014-02-23 14:17 ` Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 2/6] pkg-perl: new infrastructure Francois Perrad
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Francois Perrad @ 2014-02-23 14:17 UTC (permalink / raw)
  To: buildroot

useless since previous commit (removal of BR2_HAVE_DOCUMENTATION)
see http://git.buildroot.net/buildroot/diff/package/perl/perl.mk?id=7164a32632d14cb83698ddec45e84ad2f3252e9e

Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Acked-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
---
 package/perl/perl.mk |    4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/package/perl/perl.mk b/package/perl/perl.mk
index 5ede81b..51aeb14 100644
--- a/package/perl/perl.mk
+++ b/package/perl/perl.mk
@@ -90,10 +90,8 @@ define PERL_INSTALL_STAGING_CMDS
 	$(MAKE1) -C $(@D) DESTDIR="$(STAGING_DIR)" install.perl
 endef
 
-PERL_INSTALL_TARGET_GOALS = install.perl
-
 define PERL_INSTALL_TARGET_CMDS
-	$(MAKE1) -C $(@D) DESTDIR="$(TARGET_DIR)" $(PERL_INSTALL_TARGET_GOALS)
+	$(MAKE1) -C $(@D) DESTDIR="$(TARGET_DIR)" install.perl
 endef
 
 $(eval $(generic-package))
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 2/6] pkg-perl: new infrastructure
  2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 1/6] perl: remove PERL_INSTALL_TARGET_GOALS Francois Perrad
@ 2014-02-23 14:17 ` Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 3/6] host-perl-xml-parser: rename and refactor with perl infrastructure Francois Perrad
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Francois Perrad @ 2014-02-23 14:17 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
 Config.in           |   11 ++++
 package/Makefile.in |    4 +-
 package/pkg-perl.mk |  181 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 195 insertions(+), 1 deletion(-)
 create mode 100644 package/pkg-perl.mk

diff --git a/Config.in b/Config.in
index 55f5fd8..5a2a098 100644
--- a/Config.in
+++ b/Config.in
@@ -230,6 +230,17 @@ config BR2_LUAROCKS_MIRROR
 
 	  See http://luarocks.org
 
+config BR2_CPAN_MIRROR
+	string "CPAN mirror (Perl packages)"
+	default "http://search.cpan.org/CPAN"
+	help
+	  CPAN (Comprehensive Perl Archive Network) is a repository
+	  of Perl packages. It has multiple software mirrors scattered
+	  around the world. This option allows you to select a mirror.
+
+	  The list of mirrors is available at:
+	  http://search.cpan.org/mirror
+
 endmenu
 
 config BR2_JLEVEL
diff --git a/package/Makefile.in b/package/Makefile.in
index eea7043..454f614 100644
--- a/package/Makefile.in
+++ b/package/Makefile.in
@@ -206,7 +206,8 @@ HOST_PATH=$(HOST_DIR)/bin:$(HOST_DIR)/usr/bin:$(PATH)
 HOSTCC_VERSION:=$(shell $(HOSTCC_NOCCACHE) --version | \
 	sed -n 's/^.* \([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)[ ]*.*$$/\1\2\3/p')
 
-export PERL5LIB := $(HOST_DIR)/usr/lib/perl
+HOST_PERL_ARCHNAME := $(shell perl -MConfig -e "print Config->{archname}")
+export PERL5LIB := $(HOST_DIR)/usr/lib/perl5/$(HOST_PERL_ARCHNAME):$(HOST_DIR)/usr/lib/perl5
 
 TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
 		AR="$(TARGET_AR)" \
@@ -359,5 +360,6 @@ include package/pkg-download.mk
 include package/pkg-autotools.mk
 include package/pkg-cmake.mk
 include package/pkg-luarocks.mk
+include package/pkg-perl.mk
 include package/pkg-python.mk
 include package/pkg-generic.mk
diff --git a/package/pkg-perl.mk b/package/pkg-perl.mk
new file mode 100644
index 0000000..fdf1580
--- /dev/null
+++ b/package/pkg-perl.mk
@@ -0,0 +1,181 @@
+################################################################################
+# Perl package infrastructure
+#
+# This file implements an infrastructure that eases development of
+# package .mk files for Perl packages.
+#
+# See the Buildroot documentation for details on the usage of this
+# infrastructure
+#
+# In terms of implementation, this perl infrastructure requires
+# the .mk file to only specify metadata information about the
+# package: name, version, download URL, etc.
+#
+# We still allow the package .mk file to override what the different
+# steps are doing, if needed. For example, if <PKG>_BUILD_CMDS is
+# already defined, it is used as the list of commands to perform to
+# build the package, instead of the default perl behaviour. The
+# package can also define some post operation hooks.
+#
+################################################################################
+
+PERL_ARCHNAME	= $(ARCH)-linux
+
+################################################################################
+# inner-perl-package -- defines how the configuration, compilation and
+# installation of a perl package should be done, implements a
+# few hooks to tune the build process for perl specifities and
+# calls the generic package infrastructure to generate the necessary
+# make targets
+#
+#  argument 1 is the lowercase package name
+#  argument 2 is the uppercase package name, including an HOST_ prefix
+#             for host packages
+#  argument 3 is the uppercase package name, without the HOST_ prefix
+#             for host packages
+#  argument 4 is the type (target or host)
+################################################################################
+
+define inner-perl-package
+
+#
+# Configure step. Only define it if not already defined by the package
+# .mk file. And take care of the differences between host and target
+# packages.
+#
+ifndef $(2)_CONFIGURE_CMDS
+ifeq ($(4),target)
+
+# Configure package for target
+define $(2)_CONFIGURE_CMDS
+	cd $$($$(PKG)_SRCDIR) && if [ -f Build.PL ] ; then \
+		perl Build.PL \
+			--config ar="$(TARGET_AR)" \
+			--config full_ar="$(TARGET_AR)" \
+			--config cc="$(TARGET_CC)" \
+			--config ccflags="$(TARGET_CFLAGS)" \
+			--config ld="$(TARGET_CC)" \
+			--config lddlflags="-shared $(TARGET_LDFLAGS)" \
+			--config ldflags="$(TARGET_LDFLAGS)" \
+			--include_dirs $$(STAGING_DIR)/usr/lib/perl5/$$(PERL_VERSION)/$(PERL_ARCHNAME)/CORE \
+			--destdir $$(TARGET_DIR) \
+			--installdirs vendor \
+			--install_path lib=/usr/lib/perl5/site_perl/$$(PERL_VERSION) \
+			--install_path arch=/usr/lib/perl5/site_perl/$$(PERL_VERSION)/$(PERL_ARCHNAME) \
+			--install_path bin=/usr/bin \
+			--install_path script=/usr/bin \
+			--install_path bindoc=/usr/share/man/man1 \
+			--install_path libdoc=/usr/share/man/man3 \
+			$$($(2)_CONF_OPT); \
+	else \
+		PERL_AUTOINSTALL=--skipdeps \
+		perl Makefile.PL \
+			AR="$(TARGET_AR)" \
+			FULL_AR="$(TARGET_AR)" \
+			CC="$(TARGET_CC)" \
+			CCFLAGS="$(TARGET_CFLAGS)" \
+			LD="$(TARGET_CC)" \
+			LDDLFLAGS="-shared $(TARGET_LDFLAGS)" \
+			LDFLAGS="$(TARGET_LDFLAGS)" \
+			DESTDIR=$$(TARGET_DIR) \
+			INSTALLDIRS=vendor \
+			INSTALLVENDORLIB=/usr/lib/perl5/site_perl/$$(PERL_VERSION) \
+			INSTALLVENDORARCH=/usr/lib/perl5/site_perl/$$(PERL_VERSION)/$(PERL_ARCHNAME) \
+			INSTALLVENDORBIN=/usr/bin \
+			INSTALLVENDORSCRIPT=/usr/bin \
+			INSTALLVENDORMAN1DIR=/usr/share/man/man1 \
+			INSTALLVENDORMAN3DIR=/usr/share/man/man3 \
+			$$($(2)_CONF_OPT); \
+	fi
+endef
+else
+
+# Configure package for host
+define $(2)_CONFIGURE_CMDS
+	cd $$($$(PKG)_SRCDIR) && if [ -f Build.PL ] ; then \
+		perl Build.PL \
+			--install_base $$(HOST_DIR)/usr \
+			--installdirs vendor \
+			$$($(2)_CONF_OPT); \
+	else \
+		PERL_AUTOINSTALL=--skipdeps \
+		perl Makefile.PL \
+			INSTALL_BASE=$$(HOST_DIR)/usr \
+			INSTALLDIRS=vendor \
+			$$($(2)_CONF_OPT); \
+	fi
+endef
+endif
+endif
+
+#
+# Build step. Only define it if not already defined by the package .mk
+# file. And take care of the differences between host and target
+# packages.
+#
+ifndef $(2)_BUILD_CMDS
+ifeq ($(4),target)
+
+# Build package for target
+define $(2)_BUILD_CMDS
+	cd $$($$(PKG)_SRCDIR) && if [ -f Build.PL ] ; then \
+		perl Build $$($(2)_BUILD_OPT) build; \
+	else \
+		$(MAKE1) \
+			PERL_INC=$$(STAGING_DIR)/usr/lib/perl5/$$(PERL_VERSION)/$(PERL_ARCHNAME)/CORE \
+			$$($(2)_BUILD_OPT) pure_all; \
+	fi
+endef
+else
+
+# Build package for host
+define $(2)_BUILD_CMDS
+	cd $$($$(PKG)_SRCDIR) && if [ -f Build.PL ] ; then \
+		perl Build $$($(2)_BUILD_OPT) build; \
+	else \
+		$(MAKE1) $$($(2)_BUILD_OPT) pure_all; \
+	fi
+endef
+endif
+endif
+
+#
+# Host installation step. Only define it if not already defined by the
+# package .mk file.
+#
+ifndef $(2)_INSTALL_CMDS
+define $(2)_INSTALL_CMDS
+	cd $$($$(PKG)_SRCDIR) && if [ -f Build.PL ] ; then \
+		perl Build $$($(2)_INSTALL_TARGET_OPT) install; \
+	else \
+		$(MAKE1) $$($(2)_INSTALL_TARGET_OPT) pure_install; \
+	fi
+endef
+endif
+
+#
+# Target installation step. Only define it if not already defined by
+# the package .mk file.
+#
+ifndef $(2)_INSTALL_TARGET_CMDS
+define $(2)_INSTALL_TARGET_CMDS
+	cd $$($$(PKG)_SRCDIR) && if [ -f Build.PL ] ; then \
+		perl Build $$($(2)_INSTALL_TARGET_OPT) install; \
+	else \
+		$(MAKE1) $$($(2)_INSTALL_TARGET_OPT) pure_install; \
+	fi
+endef
+endif
+
+# Call the generic package infrastructure to generate the necessary
+# make targets
+$(call inner-generic-package,$(1),$(2),$(3),$(4))
+
+endef
+
+################################################################################
+# perl-package -- the target generator macro for Perl packages
+################################################################################
+
+perl-package = $(call inner-perl-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
+host-perl-package = $(call inner-perl-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host)
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 3/6] host-perl-xml-parser: rename and refactor with perl infrastructure
  2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 1/6] perl: remove PERL_INSTALL_TARGET_GOALS Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 2/6] pkg-perl: new infrastructure Francois Perrad
@ 2014-02-23 14:17 ` Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 4/6] host-perl-module-build: new package Francois Perrad
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Francois Perrad @ 2014-02-23 14:17 UTC (permalink / raw)
  To: buildroot

Even though libxml-parser-perl had a Config.in file with an option to
enable it on the target, this option was hidden by a dependency on
BR2_HOST_ONLY. So in practice, it was not possible to enable
libxml-parser-perl on the target. This allows us to rename
libxml-parser-perl to perl-xml-parser to follow the new naming
convention of Perl packages, without having to introduce
Config.in.legacy material.

In addition to this rename, the package is converted to use the newly
introduced Perl package infrastructure.

Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Tested-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Reviewed-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
---
 package/Config.in                                |    1 -
 package/intltool/intltool.mk                     |    2 +-
 package/libxml-parser-perl/Config.in             |   10 -------
 package/libxml-parser-perl/libxml-parser-perl.mk |   35 ----------------------
 package/metacity/metacity.mk                     |    2 +-
 package/perl-xml-parser/perl-xml-parser.mk       |   17 +++++++++++
 6 files changed, 19 insertions(+), 48 deletions(-)
 delete mode 100644 package/libxml-parser-perl/Config.in
 delete mode 100644 package/libxml-parser-perl/libxml-parser-perl.mk
 create mode 100644 package/perl-xml-parser/perl-xml-parser.mk

diff --git a/package/Config.in b/package/Config.in
index 087e5f4..543c7a6 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -634,7 +634,6 @@ source "package/json-c/Config.in"
 source "package/json-glib/Config.in"
 source "package/libjson/Config.in"
 source "package/libroxml/Config.in"
-source "package/libxml-parser-perl/Config.in"
 source "package/libxml2/Config.in"
 source "package/libxmlpp/Config.in"
 source "package/libxslt/Config.in"
diff --git a/package/intltool/intltool.mk b/package/intltool/intltool.mk
index 58b46e6..6b2a704 100644
--- a/package/intltool/intltool.mk
+++ b/package/intltool/intltool.mk
@@ -9,7 +9,7 @@ INTLTOOL_SITE = https://launchpad.net/intltool/trunk/$(INTLTOOL_VERSION)/+downlo
 INTLTOOL_LICENSE = GPLv2+
 INTLTOOL_LICENSE_FILES = COPYING
 
-HOST_INTLTOOL_DEPENDENCIES = host-gettext host-libxml-parser-perl
+HOST_INTLTOOL_DEPENDENCIES = host-gettext host-perl-xml-parser
 
 $(eval $(autotools-package))
 $(eval $(host-autotools-package))
diff --git a/package/libxml-parser-perl/Config.in b/package/libxml-parser-perl/Config.in
deleted file mode 100644
index bdda236..0000000
--- a/package/libxml-parser-perl/Config.in
+++ /dev/null
@@ -1,10 +0,0 @@
-config BR2_PACKAGE_LIBXML_PARSER_PERL
-	bool "libxml-parser-perl"
-	select BR2_PACKAGE_EXPAT
-	# Hide from configuration as we only support the host package
-	# for the moment
-	depends on BR2_HOST_ONLY
-	help
-	  The Perl XML::Parser module.
-
-	  http://www.cpan.org/modules/by-module/XML/
diff --git a/package/libxml-parser-perl/libxml-parser-perl.mk b/package/libxml-parser-perl/libxml-parser-perl.mk
deleted file mode 100644
index 53f3bcf..0000000
--- a/package/libxml-parser-perl/libxml-parser-perl.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-################################################################################
-#
-# libxml-parser-perl
-#
-################################################################################
-
-LIBXML_PARSER_PERL_VERSION = 2.36
-LIBXML_PARSER_PERL_SOURCE = XML-Parser-$(LIBXML_PARSER_PERL_VERSION).tar.gz
-LIBXML_PARSER_PERL_SITE = http://www.cpan.org/modules/by-module/XML/
-
-LIBXML_PARSER_PERL_DEPENDENCIES = expat
-
-define HOST_LIBXML_PARSER_PERL_CONFIGURE_CMDS
- (cd $(@D) ; \
-   $(HOST_CONFIGURE_OPTS) perl Makefile.PL \
-        PREFIX=$(HOST_DIR)/usr \
-        EXPATLIBPATH=$(HOST_DIR)/usr/lib \
-        EXPATINCPATH=$(HOST_DIR)/usr/include \
-        INSTALLDIRS=site \
-        INSTALLSITELIB=$(HOST_DIR)/usr/lib/perl \
-        INSTALLSITEARCH=$(HOST_DIR)/usr/lib/perl \
-        USE_MM_LD_RUN_PATH=1 \
- )
-endef
-
-define HOST_LIBXML_PARSER_PERL_BUILD_CMDS
- $(HOST_MAKE_ENV) $(MAKE) -C $(@D)
-endef
-
-define HOST_LIBXML_PARSER_PERL_INSTALL_CMDS
- $(HOST_MAKE_ENV) $(MAKE) -C $(@D) install
-endef
-
-$(eval $(generic-package))
-$(eval $(host-generic-package))
diff --git a/package/metacity/metacity.mk b/package/metacity/metacity.mk
index 9306b00..18f5c76 100644
--- a/package/metacity/metacity.mk
+++ b/package/metacity/metacity.mk
@@ -19,7 +19,7 @@ METACITY_CONF_OPT = --x-includes=$(STAGING_DIR)/usr/include/X11 \
 
 METACITY_DEPENDENCIES = libgtk2 \
 	xlib_libX11 \
-	host-libxml-parser-perl \
+	host-perl-xml-parser \
 	xlib_libXcomposite \
 	xlib_libXfixes \
 	xlib_libXrender \
diff --git a/package/perl-xml-parser/perl-xml-parser.mk b/package/perl-xml-parser/perl-xml-parser.mk
new file mode 100644
index 0000000..fb9bf0f
--- /dev/null
+++ b/package/perl-xml-parser/perl-xml-parser.mk
@@ -0,0 +1,17 @@
+################################################################################
+#
+# perl-xml-parser
+#
+################################################################################
+
+PERL_XML_PARSER_VERSION = 2.41
+PERL_XML_PARSER_SOURCE = XML-Parser-$(PERL_XML_PARSER_VERSION).tar.gz
+PERL_XML_PARSER_SITE = $(BR2_CPAN_MIRROR)/authors/id/T/TO/TODDR/
+PERL_XML_PARSER_DEPENDENCIES = expat
+PERL_XML_PARSER_LICENSE = Artistic or GPLv1+
+
+HOST_LIBXML_PARSER_PERL_CONF_OPT = \
+	EXPATLIBPATH=$(HOST_DIR)/usr/lib \
+	EXPATINCPATH=$(HOST_DIR)/usr/include
+
+$(eval $(host-perl-package))
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 4/6] host-perl-module-build: new package
  2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
                   ` (2 preceding siblings ...)
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 3/6] host-perl-xml-parser: rename and refactor with perl infrastructure Francois Perrad
@ 2014-02-23 14:17 ` Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 5/6] manual: adding packages perl Francois Perrad
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Francois Perrad @ 2014-02-23 14:17 UTC (permalink / raw)
  To: buildroot

Some Perl packages depend on very recent versions of Module-Build
which are not yet shipped with a stable perl version.
But the cpan client is able to update Module-Build as pre-requirement.
On Buildroot, we must install the latest Module-Build.

Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Reviewed-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
 package/perl-module-build/perl-module-build.mk |   12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 package/perl-module-build/perl-module-build.mk

diff --git a/package/perl-module-build/perl-module-build.mk b/package/perl-module-build/perl-module-build.mk
new file mode 100644
index 0000000..a95278d
--- /dev/null
+++ b/package/perl-module-build/perl-module-build.mk
@@ -0,0 +1,12 @@
+################################################################################
+#
+# perl-module-build
+#
+################################################################################
+
+PERL_MODULE_BUILD_VERSION = 0.4204
+PERL_MODULE_BUILD_SOURCE = Module-Build-$(PERL_MODULE_BUILD_VERSION).tar.gz
+PERL_MODULE_BUILD_SITE = $(BR2_CPAN_MIRROR)/authors/id/L/LE/LEONT/
+PERL_MODULE_BUILD_LICENSE = Artistic or GPLv1+
+
+$(eval $(host-perl-package))
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 5/6] manual: adding packages perl
  2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
                   ` (3 preceding siblings ...)
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 4/6] host-perl-module-build: new package Francois Perrad
@ 2014-02-23 14:17 ` Francois Perrad
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 6/6] scancpan: a new script Francois Perrad
  2014-02-23 21:41 ` [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Peter Korsgaard
  6 siblings, 0 replies; 9+ messages in thread
From: Francois Perrad @ 2014-02-23 14:17 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
---
 docs/manual/adding-packages-perl.txt |  120 ++++++++++++++++++++++++++++++++++
 docs/manual/adding-packages.txt      |    2 +
 2 files changed, 122 insertions(+)
 create mode 100644 docs/manual/adding-packages-perl.txt

diff --git a/docs/manual/adding-packages-perl.txt b/docs/manual/adding-packages-perl.txt
new file mode 100644
index 0000000..53aacbd
--- /dev/null
+++ b/docs/manual/adding-packages-perl.txt
@@ -0,0 +1,120 @@
+// -*- mode:doc; -*-
+// vim: set syntax=asciidoc:
+
+Infrastructure for Perl/CPAN packages
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+[[perl-package-tutorial]]
+
++perl-package+ tutorial
+^^^^^^^^^^^^^^^^^^^^^^^
+
+First, let's see how to write a +.mk+ file for a Perl/CPAN package,
+with an example :
+
+------------------------
+01: ################################################################################
+02: #
+03: # perl-foo-bar
+04: #
+05: ################################################################################
+06:
+07: PERL_FOO_BAR_VERSION = 0.02
+08: PERL_FOO_BAR_SOURCE = Foo-Bar-$(PERL_FOO_BAR_VERSION).tar.gz
+09: PERL_FOO_BAR_SITE = $(BR2_CPAN_MIRROR)/authors/id/M/MO/MONGER/
+10: PERL_FOO_BAR_DEPENDENCIES = perl-strictures
+11: PERL_FOO_BAR_LICENSE = Artistic or GPLv1+
+12: PERL_FOO_BAR_LICENSE_FILES = LICENSE
+13:
+14: $(eval $(perl-package))
+------------------------
+
+On line 7, we declare the version of the package.
+
+On line 8 and 9, we declare the name of the tarball and the location
+of the tarball on a CPAN server. Buildroot will automatically download
+the tarball from this location.
+
+On line 10, we declare our dependencies, so that they are built
+before the build process of our package starts.
+
+On line 11 and 12, we give licensing details about the package (its
+license on line 11, and the file containing the license text on line
+12).
+
+Finally, on line 14, we invoke the +perl-package+ macro that
+generates all the Makefile rules that actually allow the package to be
+built.
+
+Most of these data can be retrieved from https://metacpan.org/.
+So, this file and the Config.in can be generated by running
+the script +supports/scripts/scancpan Foo-Bar+ in the Buildroot directory
+(or in the +BR2_EXTERNAL+ directory).
+This script creates a Config.in file and foo-bar.mk file for the
+requested package, and also recursively for all dependencies specified by
+CPAN. You should still manually edit the result. In particular, the
+following things should be checked.
+
+* The +PERL_FOO_BAR_LICENSE_FILES+ variable is not set, because metacpan
+  doesn't have this information. Also, the name of the license file(s)
+  varies between packages, and some don't even have a license file.
+* If the perl module links with a shared library that is provided by
+  another (non-perl) package, this dependency is not added automatically.
+  It has to be added manually to +PERL_FOO_BAR_DEPENDENCIES+.
+* The +package/Config.in+ file has to be updated manually to include the
+  generated Config.in files. As a hint, the +scancpan+ script prints out
+  the required +source "..."+ statements, sorted alphabetically.
+
+[[perl-package-reference]]
+
++perl-package+ reference
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+As a policy, packages that provide Perl/CPAN modules should all be
+named +perl-<something>+ in Buildroot.
+
+This infrastructure handles various Perl build systems :
++ExtUtils-MakeMaker+, +Module-Build+ and +Module-Build-Tiny+.
++Build.PL+ is always preferred when a package provides a +Makefile.PL+
+and a +Build.PL+.
+
+The main macro of the Perl/CPAN package infrastructure is
++perl-package+. It is similar to the +generic-package+ macro. The ability to
+have target and host packages is also available, with the
++host-perl-package+ macro.
+
+Just like the generic infrastructure, the Perl/CPAN infrastructure
+works by defining a number of variables before calling the
++perl-package+ macro.
+
+First, all the package metadata information variables that exist in the
+generic infrastructure also exist in the Perl/CPAN infrastructure:
++PERL_FOO_VERSION+, +PERL_FOO_SOURCE+,
++PERL_FOO_PATCH+, +PERL_FOO_SITE+,
++PERL_FOO_SUBDIR+, +PERL_FOO_DEPENDENCIES+,
++PERL_FOO_INSTALL_TARGET+.
+
+Note that setting +PERL_FOO_INSTALL_STAGING+ to +YES+ has no effect
+unless a +PERL_FOO_INSTALL_STAGING_CMDS+ variable is defined. The perl
+infrastructure doesn't define these commands since Perl modules generally
+don't need to be installed to the +staging+ directory.
+
+A few additional variables, specific to the Perl/CPAN infrastructure,
+can also be defined. Many of them are only useful in very specific
+cases, typical packages will therefore only use a few of them.
+
+* +PERL_FOO_CONF_OPT+/+HOST_PERL_FOO_CONF_OPT+, to specify additional
+  configure options to pass to the +perl Makefile.PL+ or +perl Build.PL+.
+  By default, empty.
+
+* +PERL_FOO_BUILD_OPT+/+HOST_PERL_FOO_BUILD_OPT+, to specify additional
+  options to pass to +make pure_all+ or +perl Build build+ in the build step.
+  By default, empty.
+
+* +PERL_FOO_INSTALL_TARGET_OPT+, to specify additional options to
+  pass to +make pure_install+ or +perl Build install+ in the install step.
+  By default, empty.
+
+* +HOST_PERL_FOO_INSTALL_OPT+, to specify additional options to
+  pass to +make pure_install+ or +perl Build install+ in the install step.
+  By default, empty.
diff --git a/docs/manual/adding-packages.txt b/docs/manual/adding-packages.txt
index cc86529..745e33a 100644
--- a/docs/manual/adding-packages.txt
+++ b/docs/manual/adding-packages.txt
@@ -22,6 +22,8 @@ include::adding-packages-python.txt[]
 
 include::adding-packages-luarocks.txt[]
 
+include::adding-packages-perl.txt[]
+
 include::adding-packages-hooks.txt[]
 
 include::adding-packages-gettext.txt[]
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 6/6] scancpan: a new script
  2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
                   ` (4 preceding siblings ...)
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 5/6] manual: adding packages perl Francois Perrad
@ 2014-02-23 14:17 ` Francois Perrad
  2014-02-23 21:41   ` Peter Korsgaard
  2014-02-23 21:41 ` [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Peter Korsgaard
  6 siblings, 1 reply; 9+ messages in thread
From: Francois Perrad @ 2014-02-23 14:17 UTC (permalink / raw)
  To: buildroot

which creates Perl/CPAN package files

Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
 support/scripts/scancpan |  741 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 741 insertions(+)
 create mode 100755 support/scripts/scancpan

diff --git a/support/scripts/scancpan b/support/scripts/scancpan
new file mode 100755
index 0000000..24474ff
--- /dev/null
+++ b/support/scripts/scancpan
@@ -0,0 +1,741 @@
+#!/usr/bin/env perl
+
+# This chunk of stuff was generated by App::FatPacker. To find the original
+# file's code, look for the end of this BEGIN block or the string 'FATPACK'
+BEGIN {
+my %fatpacked;
+
+$fatpacked{"MetaCPAN/API/Tiny.pm"} = <<'METACPAN_API_TINY';
+  package MetaCPAN::API::Tiny;
+  {
+    $MetaCPAN::API::Tiny::VERSION = '1.131730';
+  }
+  use strict;
+  use warnings;
+  # ABSTRACT: A Tiny API client for MetaCPAN
+  
+  use Carp;
+  use JSON::PP 'encode_json', 'decode_json';
+  use HTTP::Tiny;
+  
+  
+  sub new {
+      my ($class, @args) = @_;
+  
+      $#_ % 2 == 0
+          or croak 'Arguments must be provided as name/value pairs';
+      
+      my %params = @args;
+  
+      die 'ua_args must be an array reference'
+          if $params{ua_args} && ref($params{ua_args}) ne 'ARRAY';
+  
+      my $self = +{
+          base_url => $params{base_url} || 'http://api.metacpan.org/v0',
+          ua => $params{ua} || HTTP::Tiny->new(
+              $params{ua_args}
+                  ? @{$params{ua_args}}
+                  : (agent => 'MetaCPAN::API::Tiny/'
+                      . ($MetaCPAN::API::VERSION || 'xx'))),
+      };
+      
+      return bless($self, $class);
+  }
+  
+  sub _build_extra_params {
+      my $self = shift;
+  
+      @_ % 2 == 0
+          or croak 'Incorrect number of params, must be key/value';
+  
+      my %extra = @_;
+      my $ua = $self->{ua};
+  
+      foreach my $key (keys %extra)
+      {
+          # The implementation in HTTP::Tiny uses + instead of %20, fix that
+          $extra{$key} = $ua->_uri_escape($extra{$key});
+          $extra{$key} =~ s/\+/%20/g;
+      }
+  
+      my $params = join '&', map { "$_=" . $extra{$_} } sort keys %extra;
+  
+      return $params;
+  }
+  
+  
+  # /source/{author}/{release}/{path}
+  sub source {
+      my $self  = shift;
+      my %opts  = @_ ? @_ : ();
+      my $url   = '';
+      my $error = "Provide 'author' and 'release' and 'path'";
+  
+      %opts or croak $error;
+  
+      if (
+          defined ( my $author  = $opts{'author'}  ) &&
+          defined ( my $release = $opts{'release'} ) &&
+          defined ( my $path    = $opts{'path'}    )
+        ) {
+          $url = "source/$author/$release/$path";
+      } else {
+          croak $error;
+      }
+  
+      $url = $self->{base_url} . "/$url";
+      
+      my $result = $self->{ua}->get($url);
+      $result->{'success'}
+          or croak "Failed to fetch '$url': " . $result->{'reason'};
+  
+      return $result->{'content'};
+  }
+  
+  
+  # /release/{distribution}
+  # /release/{author}/{release}
+  sub release {
+      my $self  = shift;
+      my %opts  = @_ ? @_ : ();
+      my $url   = '';
+      my $error = "Either provide 'distribution', or 'author' and 'release', " .
+                  "or 'search'";
+  
+      %opts or croak $error;
+  
+      my %extra_opts = ();
+  
+      if ( defined ( my $dist = $opts{'distribution'} ) ) {
+          $url = "release/$dist";
+      } elsif (
+          defined ( my $author  = $opts{'author'}  ) &&
+          defined ( my $release = $opts{'release'} )
+        ) {
+          $url = "release/$author/$release";
+      } elsif ( defined ( my $search_opts = $opts{'search'} ) ) {
+          ref $search_opts && ref $search_opts eq 'HASH'
+              or croak $error;
+  
+          %extra_opts = %{$search_opts};
+          $url        = 'release/_search';
+      } else {
+          croak $error;
+      }
+  
+      return $self->fetch( $url, %extra_opts );
+  }
+  
+  
+  # /pod/{module}
+  # /pod/{author}/{release}/{path}
+  sub pod {
+      my $self  = shift;
+      my %opts  = @_ ? @_ : ();
+      my $url   = '';
+      my $error = "Either provide 'module' or 'author and 'release' and 'path'";
+  
+      %opts or croak $error;
+  
+      if ( defined ( my $module = $opts{'module'} ) ) {
+          $url = "pod/$module";
+      } elsif (
+          defined ( my $author  = $opts{'author'}  ) &&
+          defined ( my $release = $opts{'release'} ) &&
+          defined ( my $path    = $opts{'path'}    )
+        ) {
+          $url = "pod/$author/$release/$path";
+      } else {
+          croak $error;
+      }
+  
+      # check content-type
+      my %extra = ();
+      if ( defined ( my $type = $opts{'content-type'} ) ) {
+          $type =~ m{^ text/ (?: html|plain|x-pod|x-markdown ) $}x
+              or croak 'Incorrect content-type provided';
+  
+          $extra{headers}{'content-type'} = $type;
+      }
+  
+      $url = $self->{base_url}. "/$url";
+      
+      my $result = $self->{ua}->get( $url, \%extra );
+      $result->{'success'}
+          or croak "Failed to fetch '$url': " . $result->{'reason'};
+  
+      return $result->{'content'};
+  }
+  
+  
+  # /module/{module}
+  sub module {
+      my $self = shift;
+      my $name = shift;
+  
+      $name or croak 'Please provide a module name';
+  
+      return $self->fetch("module/$name");
+  }
+  
+  
+  # file() is a synonym of module
+  sub file { goto &module }
+  
+  
+  # /author/{author}
+  sub author {
+      my $self = shift;
+      my ( $pause_id, $url, %extra_opts );
+  
+      if ( @_ == 1 ) {
+          $url = 'author/' . shift;
+      } elsif ( @_ == 2 ) {
+          my %opts = @_;
+  
+          if ( defined $opts{'pauseid'} ) {
+              $url = "author/" . $opts{'pauseid'};
+          } elsif ( defined $opts{'search'} ) {
+              my $search_opts = $opts{'search'};
+  
+              ref $search_opts && ref $search_opts eq 'HASH'
+                  or croak "'search' key must be hashref";
+  
+              %extra_opts = %{$search_opts};
+              $url        = 'author/_search';
+          } else {
+              croak 'Unknown option given';
+          }
+      } else {
+          croak 'Please provide an author PAUSEID or a "search"';
+      }
+  
+      return $self->fetch( $url, %extra_opts );
+  }
+  
+  
+  
+  sub fetch {
+      my $self    = shift;
+      my $url     = shift;
+      my $extra   = $self->_build_extra_params(@_);
+      my $base    = $self->{base_url};
+      my $req_url = $extra ? "$base/$url?$extra" : "$base/$url";
+      
+      my $result  = $self->{ua}->get($req_url);
+      return $self->_decode_result( $result, $req_url );
+  }
+  
+  
+  sub post {
+      my $self  = shift;
+      my $url   = shift;
+      my $query = shift;
+      my $base  = $self->{base_url};
+  
+      defined $url
+          or croak 'First argument of URL must be provided';
+  
+      ref $query and ref $query eq 'HASH'
+          or croak 'Second argument of query hashref must be provided';
+  
+      my $query_json = encode_json( $query );
+      my $result     = $self->{ua}->request(
+          'POST',
+          "$base/$url",
+          {
+              headers => { 'Content-Type' => 'application/json' },
+              content => $query_json,
+          }
+      );
+  
+      return $self->_decode_result( $result, $url, $query_json );
+  }
+  
+  sub _decode_result {
+      my $self = shift;
+      my ( $result, $url, $original ) = @_;
+      my $decoded_result;
+  
+      ref $result and ref $result eq 'HASH'
+          or croak 'First argument must be hashref';
+  
+      defined $url
+          or croak 'Second argument of a URL must be provided';
+  
+      if ( defined ( my $success = $result->{'success'} ) ) {
+          my $reason = $result->{'reason'} || '';
+          $reason .= ( defined $original ? " (request: $original)" : '' );
+  
+          $success or croak "Failed to fetch '$url': $reason";
+      } else {
+          croak 'Missing success in return value';
+      }
+  
+      defined ( my $content = $result->{'content'} )
+          or croak 'Missing content in return value';
+  
+      eval { $decoded_result = decode_json $content; 1 }
+      or do { croak "Couldn't decode '$content': $@" };
+  
+      return $decoded_result;
+  }
+  
+  1;
+  
+  __END__
+  
+  =pod
+  
+  =head1 NAME
+  
+  MetaCPAN::API::Tiny - A Tiny API client for MetaCPAN
+  
+  =head1 VERSION
+  
+  version 1.131730
+  
+  =head1 DESCRIPTION
+  
+  This is the Tiny version of L<MetaCPAN::API>. It implements a compatible API
+  with a few notable exceptions:
+  
+  =over 4
+  
+  =item Attributes are direct hash access
+  
+  The attributes defined using Mo(o|u)se are now accessed via the blessed hash
+  directly. There are no accessors defined to access this elements.
+  
+  =item Exception handling
+  
+  Instead of using Try::Tiny, raw evals are used. This could potentially cause
+  issues, so just be aware.
+  
+  =item Testing
+  
+  Test::Fatal was replaced with an eval implementation of exception().
+  Test::TinyMocker usage is retained, but may be absorbed since it is pure perl
+  
+  =back
+  
+  =head1 CLASS_METHODS
+  
+  =head2 new
+  
+  new is the constructor for MetaCPAN::API::Tiny. In the non-tiny version of this
+  module, this is provided via Any::Moose built from the attributes defined. In
+  the tiny version, we define our own constructor. It takes the same arguments
+  and provides similar checks to MetaCPAN::API with regards to arguments passed.
+  
+  =head1 PUBLIC_METHODS
+  
+  =head2 source
+  
+      my $source = $mcpan->source(
+          author  => 'DOY',
+          release => 'Moose-2.0201',
+          path    => 'lib/Moose.pm',
+      );
+  
+  Searches MetaCPAN for a module or a specific release and returns the plain source.
+  
+  =head2 release
+  
+      my $result = $mcpan->release( distribution => 'Moose' );
+  
+      # or
+      my $result = $mcpan->release( author => 'DOY', release => 'Moose-2.0001' );
+  
+  Searches MetaCPAN for a dist.
+  
+  You can do complex searches using 'search' parameter:
+  
+      # example lifted from MetaCPAN docs
+      my $result = $mcpan->release(
+          search => {
+              author => "OALDERS AND ",
+              filter => "status:latest",
+              fields => "name",
+              size   => 1,
+          },
+      );
+  
+  =head2 pod
+  
+      my $result = $mcpan->pod( module => 'Moose' );
+  
+      # or
+      my $result = $mcpan->pod(
+          author  => 'DOY',
+          release => 'Moose-2.0201',
+          path    => 'lib/Moose.pm',
+      );
+  
+  Searches MetaCPAN for a module or a specific release and returns the POD.
+  
+  =head2 module
+  
+      my $result = $mcpan->module('MetaCPAN::API');
+  
+  Searches MetaCPAN and returns a module's ".pm" file.
+  
+  =head2 file
+  
+  A synonym of L</module>
+  
+  =head2 author
+  
+      my $result1 = $mcpan->author('XSAWYERX');
+      my $result2 = $mcpan->author( pauseid => 'XSAWYERX' );
+  
+  Searches MetaCPAN for a specific author.
+  
+  You can do complex searches using 'search' parameter:
+  
+      # example lifted from MetaCPAN docs
+      my $result = $mcpan->author(
+          search => {
+              q    => 'profile.name:twitter',
+              size => 1,
+          },
+      );
+  
+  =head2 fetch
+  
+      my $result = $mcpan->fetch('/release/distribution/Moose');
+  
+      # with parameters
+      my $more = $mcpan->fetch(
+          '/release/distribution/Moose',
+          param => 'value',
+      );
+  
+  This is a helper method for API implementations. It fetches a path from MetaCPAN, decodes the JSON from the content variable and returns it.
+  
+  You don't really need to use it, but you can in case you want to write your own extension implementation to MetaCPAN::API.
+  
+  It accepts an additional hash as "GET" parameters.
+  
+  =head2 post
+  
+      # /release&content={"query":{"match_all":{}},"filter":{"prefix":{"archive":"Cache-Cache-1.06"}}}
+      my $result = $mcpan->post(
+          'release',
+          {   
+              query  => { match_all => {} },
+              filter => { prefix => { archive => 'Cache-Cache-1.06' } },
+          },
+      );
+  
+  The POST equivalent of the "fetch()" method. It gets the path and JSON request.
+  
+  =head1 THANKS
+  
+  Overall the tests and code were ripped directly from MetaCPAN::API and
+  tiny-fied. A big thanks to Sawyer X for writing the original module.
+  
+  =head1 AUTHOR
+  
+  Nicholas R. Perez <nperez@cpan.org>
+  
+  =head1 COPYRIGHT AND LICENSE
+  
+  This software is copyright (c) 2013 by Nicholas R. Perez <nperez@cpan.org>.
+  
+  This is free software; you can redistribute it and/or modify it under
+  the same terms as the Perl 5 programming language system itself.
+  
+  =cut
+METACPAN_API_TINY
+
+s/^  //mg for values %fatpacked;
+
+unshift @INC, sub {
+  if (my $fat = $fatpacked{$_[1]}) {
+    if ($] < 5.008) {
+      return sub {
+        return 0 unless length $fat;
+        $fat =~ s/^([^\n]*\n?)//;
+        $_ = $1;
+        return 1;
+      };
+    }
+    open my $fh, '<', \$fat
+      or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
+    return $fh;
+  }
+  return
+};
+
+} # END OF FATPACK CODE
+
+
+use 5.018;      # same major version as target perl
+use strict;
+use warnings;
+use Fatal qw(open close);
+
+use Getopt::Long;
+use Pod::Usage;
+use File::Basename;
+use Module::CoreList;
+use MetaCPAN::API::Tiny;
+
+my ($help, $man, $quiet, $force, $recommend);
+GetOptions( 'help|?' => \$help,
+            'man' => \$man,
+            'quiet|q' => \$quiet,
+            'force|f' => \$force,
+            'recommend' => \$recommend
+) or pod2usage(-exitval => 1);
+pod2usage(-exitval => 0) if $help;
+pod2usage(-exitval => 0, -verbose => 2) if $man;
+pod2usage(-exitval => 1) if scalar @ARGV == 0;
+
+my %dist;               # name -> metacpan data
+my %need_target;        # name -> 1 if target package is needed
+my %need_host;          # name -> 1 if host package is needed
+my %deps_build;         # name -> list of host dependencies
+my %deps_runtime;       # name -> list of target dependencies
+my $mcpan = MetaCPAN::API::Tiny->new();
+
+sub fetch {
+    my ($name, $need_target, $need_host) = @_;
+    $need_target{$name} = $need_target if $need_target;
+    $need_host{$name} = $need_host if $need_host;
+    unless ($dist{$name}) {
+        say qq{fetch ${name}} unless $quiet;
+        my $result = $mcpan->release( distribution => $name );
+        $dist{$name} = $result;
+        my @deps_build = ();
+        my @deps_runtime = ();
+        my $mb;
+        foreach my $dep (@{$result->{dependency}}) {
+            my $modname = ${$dep}{module};
+            $mb = 1 if $modname eq q{Module::Build};
+            # Module::Build has a special treatment, because it is a core module,
+            # but some module require a very recent version of it
+            next if $modname eq q{perl};
+            next if $modname =~ m|^Alien|;
+            next if $modname =~ m|^Win32|;
+            next if Module::CoreList::first_release( $modname );
+            # we could use the host Module::CoreList data, because host perl and
+            # target perl have the same major version
+            next if ${$dep}{phase} eq q{develop};
+            next if ${$dep}{phase} eq q{test};
+            next if !$recommend && ${$dep}{relationship} ne q{requires};
+            my $distname = $mcpan->module( $modname )->{distribution};
+            if (${$dep}{phase} eq q{runtime}) {
+                push @deps_runtime, $distname;
+            }
+            else { # configure, build
+                push @deps_build, $distname;
+            }
+        }
+        unshift @deps_build, q{Module-Build} if $mb;
+        $deps_build{$name} = \@deps_build;
+        $deps_runtime{$name} = \@deps_runtime;
+    }
+    foreach my $distname (@{$deps_build{$name}}) {
+        fetch( $distname, 0, 1 );
+    }
+    foreach my $distname (@{$deps_runtime{$name}}) {
+        fetch( $distname, $need_target, $need_host );
+    }
+    return;
+}
+
+foreach my $distname (@ARGV) {
+    # Command-line's distributions are needed for target, not host
+    fetch( $distname, 1, 0 );
+}
+say scalar keys %dist, q{ packages fetched.} unless $quiet;
+
+# Buildroot package name: lowercase
+sub fsname {
+    my $name = shift;
+    return q{perl-} . lc $name;
+}
+
+# Buildroot variable name: uppercase
+sub brname {
+    my $name = shift;
+    $name =~ s|-|_|g;
+    return uc $name;
+}
+
+while (my ($distname, $dist) = each %dist) {
+    my $fsname = fsname( $distname );
+    my $dirname = q{package/} . $fsname;
+    my $cfgname = $dirname . q{/Config.in};
+    my $mkname = $dirname . q{/} . $fsname . q{.mk};
+    my $brname = brname( $fsname );
+    mkdir $dirname unless -d $dirname;
+    if ($need_target{$distname} && ($force || !-f $cfgname)) {
+        my $abstract = $dist->{abstract};
+        say qq{write ${cfgname}} unless $quiet;
+        open my $fh, q{>}, $cfgname;
+        say {$fh} qq{config BR2_PACKAGE_${brname}};
+        say {$fh} qq{\tbool "${fsname}"};
+        foreach my $dep (@{$deps_runtime{$distname}}) {
+            my $brdep = brname( fsname( $dep ) );
+            say {$fh} qq{\tselect BR2_PACKAGE_${brdep}};
+        }
+        say {$fh} qq{\thelp} if $abstract;
+        say {$fh} qq{\t  ${abstract}} if $abstract;
+        close $fh;
+    }
+    if ($force || !-f $mkname) {
+        my $version = $dist->{version};
+        my($path) = $dist->{download_url} =~ m|^[^:/?#]+://[^/?#]*([^?#]*)|;
+        # this URL contains only the scheme, auth and path parts (but no query and fragment parts)
+        # the scheme is not used, because the job is done by the BR download infrastructure
+        # the auth part is not used, because we use $(BR2_CPAN_MIRROR)
+        my($filename, $directories, $suffix) = fileparse( $path, q{tar.gz}, q{tgz} );
+        my $dependencies = join q{ }, map( { q{host-} . fsname( $_ ); } @{$deps_build{$distname}} ),
+                                      map( { fsname( $_ ); } @{$deps_runtime{$distname}} );
+        my $host_dependencies = join q{ }, map { q{host-} . fsname( $_ ); } @{$deps_build{$distname}},
+                                                                            @{$deps_runtime{$distname}};
+        my $license = ref $dist->{license} eq 'ARRAY'
+                    ? join q{ or }, @{$dist->{license}}
+                    : $dist->{license};
+        $license = q{Artistic or GPLv1+} if $license eq q{perl_5};
+        say qq{write ${mkname}} unless $quiet;
+        open my $fh, q{>}, $mkname;
+        say {$fh} qq{################################################################################};
+        say {$fh} qq{#};
+        say {$fh} qq{# ${fsname}};
+        say {$fh} qq{#};
+        say {$fh} qq{################################################################################};
+        say {$fh} qq{};
+        say {$fh} qq{${brname}_VERSION = ${version}};
+        say {$fh} qq{${brname}_SOURCE = ${distname}-\$(${brname}_VERSION).${suffix}};
+        say {$fh} qq{${brname}_SITE = \$(BR2_CPAN_MIRROR)${directories}};
+        say {$fh} qq{${brname}_DEPENDENCIES = perl ${dependencies}} if $need_target{$distname};
+        say {$fh} qq{HOST_${brname}_DEPENDENCIES = ${host_dependencies}} if $need_host{$distname};
+        say {$fh} qq{${brname}_LICENSE = ${license}} if $license && $license ne q{unknown};
+        say {$fh} qq{};
+        say {$fh} qq{\$(eval \$(perl-package))} if $need_target{$distname};
+        say {$fh} qq{\$(eval \$(host-perl-package))} if $need_host{$distname};
+        close $fh;
+    }
+}
+
+my %pkg;
+my $cfgname = q{package/Config.in};
+if (-f $cfgname) {
+    open my $fh, q{<}, $cfgname;
+    while (<$fh>) {
+        chomp;
+        $pkg{$_} = 1 if m|package/perl-|;
+    }
+    close $fh;
+}
+
+foreach my $distname (keys %need_target) {
+    my $fsname = fsname( $distname );
+    $pkg{qq{source "package/${fsname}/Config.in"}} = 1;
+}
+
+say qq{${cfgname} must contain the following lines:};
+say join qq{\n}, sort keys %pkg;
+
+__END__
+
+=head1 NAME
+
+support/scripts/scancpan Try-Tiny Moo
+
+=head1 SYNOPSIS
+
+curl -kL http://install.perlbrew.pl | bash
+
+perlbrew install perl-5.18.2
+
+supports/scripts/scancpan [options] [distname ...]
+
+ Options:
+   -help
+   -man
+   -quiet
+   -force
+   -recommend
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-help>
+
+Prints a brief help message and exits.
+
+=item B<-man>
+
+Prints the manual page and exits.
+
+=item B<-quiet>
+
+Executes without output
+
+=item B<-force>
+
+Forces the overwriting of existing files.
+
+=item B<-recommend>
+
+Adds I<recommended> dependencies.
+
+=back
+
+=head1 DESCRIPTION
+
+This script creates templates of the Buildroot package files for all the
+Perl/CPAN distributions required by the specified distnames. The
+dependencies and metadata are fetched from https://metacpan.org/.
+
+After running this script, it is necessary to check the generated files.
+You have to manually enable the host- version if you need it. You have to
+manually add the license files (PERL_FOO_LICENSE_FILES variable). For
+distributions that link against a target library, you have to add the
+buildroot package name for that library to the DEPENDENCIES variable.
+
+See the Buildroot documentation for details on the usage of the Perl
+infrastructure.
+
+The major version of the host perl must be aligned on the target one,
+in order to work with the right CoreList data.
+
+=head1 LICENSE
+
+Copyright (C) 2013-2014 by Francois Perrad <francois.perrad@gadz.org>
+
+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 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+This script is a part of Buildroot.
+
+This script requires the module C<MetaCPAN::API::Tiny> (version 1.131730)
+which was included at the beginning of this file by the tool C<fatpack>.
+
+See L<http://search.cpan.org/~nperez/MetaCPAN-API-Tiny-1.131730/>.
+
+See L<http://search.cpan.org/search?query=App-FatPacker&mode=dist>.
+
+These both libraries are free software and may be distributed under the same
+terms as perl itself.
+
+And perl may be distributed under the terms of Artistic v1 or GPL v1 license.
+
+=cut
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 6/6] scancpan: a new script
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 6/6] scancpan: a new script Francois Perrad
@ 2014-02-23 21:41   ` Peter Korsgaard
  0 siblings, 0 replies; 9+ messages in thread
From: Peter Korsgaard @ 2014-02-23 21:41 UTC (permalink / raw)
  To: buildroot

>>>>> "Francois" == Francois Perrad <fperrad@gmail.com> writes:

 > which creates Perl/CPAN package files
 > Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
 > Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
 > ---
 >  support/scripts/scancpan |  741 ++++++++++++++++++++++++++++++++++++++++++++++
 >  1 file changed, 741 insertions(+)
 >  create mode 100755 support/scripts/scancpan

 > diff --git a/support/scripts/scancpan b/support/scripts/scancpan
 > new file mode 100755
 > index 0000000..24474ff
 > --- /dev/null
 > +++ b/support/scripts/scancpan
 > @@ -0,0 +1,741 @@
 > +#!/usr/bin/env perl
 > +
 > +# This chunk of stuff was generated by App::FatPacker. To find the original
 > +# file's code, look for the end of this BEGIN block or the string 'FATPACK'
 > +BEGIN {
 > +my %fatpacked;
 > +
 > +$fatpacked{"MetaCPAN/API/Tiny.pm"} = <<'METACPAN_API_TINY';
 > +  package MetaCPAN::API::Tiny;
 > +  {
 > +    $MetaCPAN::API::Tiny::VERSION = '1.131730';
 > +  }
 > +  use strict;
 > +  use warnings;
 > +  # ABSTRACT: A Tiny API client for MetaCPAN
 > +  
 > +  use Carp;
 > +  use JSON::PP 'encode_json', 'decode_json';
 > +  use HTTP::Tiny;
 > +  
 > +  
 > +  sub new {
 > +      my ($class, @args) = @_;
 > +  
 > +      $#_ % 2 == 0
 > +          or croak 'Arguments must be provided as name/value pairs';
 > +      

There's a bunch of trailing spaces here which I have stripped.

-- 
Bye, Peter Korsgaard

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules
  2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
                   ` (5 preceding siblings ...)
  2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 6/6] scancpan: a new script Francois Perrad
@ 2014-02-23 21:41 ` Peter Korsgaard
  6 siblings, 0 replies; 9+ messages in thread
From: Peter Korsgaard @ 2014-02-23 21:41 UTC (permalink / raw)
  To: buildroot

>>>>> "Francois" == Francois Perrad <fperrad@gmail.com> writes:

 > delta V11 vs V10
 >  - manual
 >    + some improvements
 >  - scancpan
 >    + add comments

Committed series to next, thanks!

-- 
Bye, Peter Korsgaard

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-02-23 21:41 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-23 14:17 [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Francois Perrad
2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 1/6] perl: remove PERL_INSTALL_TARGET_GOALS Francois Perrad
2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 2/6] pkg-perl: new infrastructure Francois Perrad
2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 3/6] host-perl-xml-parser: rename and refactor with perl infrastructure Francois Perrad
2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 4/6] host-perl-module-build: new package Francois Perrad
2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 5/6] manual: adding packages perl Francois Perrad
2014-02-23 14:17 ` [Buildroot] [pkg-perl infra v11 6/6] scancpan: a new script Francois Perrad
2014-02-23 21:41   ` Peter Korsgaard
2014-02-23 21:41 ` [Buildroot] [pkg-perl infra v11 0/6] a package infrastructure for Perl/CPAN modules Peter Korsgaard

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.