[Buildroot] [UNSURE]Re: [pkg-perl infra V4 2/9] pkg-perl: new infrastructure
François Perrad
francois.perrad at gadz.org
Thu Feb 6 13:41:34 UTC 2014
2014-02-06 8:11 GMT+01:00 Arnout Vandecappelle <arnout at mind.be>:
> Hi Francois,
>
> Someone (Yann?) suggested to call this infrastructure "cpan" rather than
> "perl", similar like how it's done for luarocks. What do you think about
> that?
>
> Actually, now I have looked at the patch again, I can see the answer:
> there is nothing CPAN-specific about this patch (except for the
> definition of the mirror variable), it can just as well be used for
> packages downloaded from somewhere else or local packages.
>
I agree with you, Arnout.
It is a "perl" infrastructure.
> On 05/02/14 14:52, Francois Perrad wrote:
>>
>> Signed-off-by: Francois Perrad <francois.perrad at gadz.org>
>> ---
>> Config.in | 10 +++
>> package/Makefile.in | 4 +-
>> package/pkg-perl.mk | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 211 insertions(+), 1 deletion(-)
>> create mode 100644 package/pkg-perl.mk
>>
>> diff --git a/Config.in b/Config.in
>> index 7ec7c2a..678fe8d 100644
>> --- a/Config.in
>> +++ b/Config.in
>> @@ -225,6 +225,16 @@ config BR2_LUAROCKS_MIRROR
>>
>> See http://luarocks.org
>>
>> +config BR2_CPAN_MIRROR
>> + string "CPAN mirror"
>> + default "http://search.cpan.org/CPAN"
>> + help
>> + CPAN 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
>> +
>
> Side-track: like BR2_DL_DIR, these mirror variables should really be
> overridden by the environment, because they are a kind of local
> configuration. I mean, if I prefer to use a particular mirror, I want
> that one for all my configurations. Conversely, if I pass my defconfig to
> someone in Australia, they'll want to use a different mirror.
>
>> endmenu
>>
>> config BR2_JLEVEL
>> diff --git a/package/Makefile.in b/package/Makefile.in
>> index d0b1cfd..41f73cb 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')
>>
>> -HOST_PERL5LIB = $(HOST_DIR)/usr/lib/perl
>> +HOST_PERL_ARCHNAME := $(shell perl -MConfig -e "print Config->{archname}")
>> +HOST_PERL5LIB = $(HOST_DIR)/usr/lib/perl5/$(HOST_PERL_ARCHNAME):$(HOST_DIR)/usr/lib/perl5
>
> This change has no direct bearing on the cpan infrastructure.
Package using host-perl-package infrastructure, installs module in
$(HOST_DIR)/usr/lib/perl5.
The host perl finds these modules with a PERL5LIB which refers this new path.
>
> Also, I see the following in my $(HOST_DIR)/usr/lib:
>
> $ ls host/usr/lib/perl*
> host/usr/lib/perl:
> XML/ auto/ perllocal.pod
>
> host/usr/lib/perl5:
> ExtUtils/ x86_64-linux-gnu-thread-multi/
>
> So I guess $(HOST_DIR)/usr/lib/perl should also be in there?
>
>
>> TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
>> AR="$(TARGET_AR)" \
>> @@ -376,4 +377,5 @@ include package/pkg-autotools.mk
>> include package/pkg-cmake.mk
>> include package/pkg-luarocks.mk
>> include package/pkg-python.mk
>> +include package/pkg-perl.mk
>> include package/pkg-generic.mk
>> diff --git a/package/pkg-perl.mk b/package/pkg-perl.mk
>> new file mode 100644
>> index 0000000..a049bce
>> --- /dev/null
>> +++ b/package/pkg-perl.mk
>> @@ -0,0 +1,198 @@
>> +################################################################################
>> +# 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 informations about the
>
> s/informations/information/
>
>> +# 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.
>
> Side-track: I wonder about the usefulness of these comments. They
> duplicate the documentation in the manual, which risks inconsistency.
> Would anybody ever look at the comments in pkg-*.mk to learn about using
> the package infrastructure?
>
>> +#
>> +################################################################################
>> +
>> +PKG_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
>> +
>> +$(2)_CONF_OPT ?=
>> +$(2)_BUILD_OPT ?=
>> +$(2)_INSTALL_OPT ?=
>> +$(2)_INSTALL_TARGET_OPT ?=
>
> Something funky with the alignment of these. Perhaps better to just
> remove them, they're useless anyway.
>
>> +
>> +#
>> +# 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 \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + 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)/$(PKG_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)/$(PKG_PERL_ARCHNAME) \
>
> Why install in site_perl and not directly in the perl directories?
> That's a bit like /usr/local, isn't it?
The Perl policy segregates the core modules and the additionnal ones.
- core modules in /usr/lib/perl5
- CPAN modules in /usr/lib/perl5/site_perl
By default, the target perl knows and uses these 2 paths.
François
>
> Actually, wouldn't setting installdirs to core make most of these redundant?
>
>
>> + --install_path bin=/usr/bin \
>> + --install_path script=/usr/bin \
>> + --install_path bindoc=/usr/share/man/man1 \
>> + --install_path libdoc=/usr/share/man/man3 \
>
> Since we don't want documentation on target, is there a way to define
> this so that documentation is thrown away immediately? And is there an
> option to avoid building documentation?
>
>> + $$($(2)_CONF_OPT); \
>> + else \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + 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)/$(PKG_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 \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + perl Build.PL \
>> + --install_base $$(HOST_DIR)/usr \
>> + --installdirs vendor \
>> + $$($(2)_CONF_OPT); \
>> + else \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + 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 \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + perl Build $$($(2)_BUILD_OPT) build; \
>> + else \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + $(MAKE1) \
>> + PERL_INC=$$(STAGING_DIR)/usr/lib/perl5/$$(PERL_VERSION)/$(PKG_PERL_ARCHNAME)/CORE \
>
> How come you don't need this in the configure step?
>
>
> Regards,
> Arnout
>
>> + $$($(2)_BUILD_OPT) pure_all; \
>> + fi
>> +endef
>> +else
>> +
>> +# Build package for host
>> +define $(2)_BUILD_CMDS
>> + cd $$($$(PKG)_SRCDIR) && if [ -f Build.PL ] ; then \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + perl Build $$($(2)_BUILD_OPT) build; \
>> + else \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + $(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 \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + perl Build $$($(2)_INSTALL_TARGET_OPT) install; \
>> + else \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + $(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 \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + perl Build $$($(2)_INSTALL_TARGET_OPT) install; \
>> + else \
>> + PERL5LIB=$(HOST_PERL5LIB) \
>> + $(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)
>>
>
>
> --
> Arnout Vandecappelle arnout at mind be
> Senior Embedded Software Architect +32-16-286500
> Essensium/Mind http://www.mind.be
> G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven
> LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
> GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
More information about the buildroot
mailing list