Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

Re: module needs another module for build

by bingos (Vicar)
on Aug 09, 2011 at 22:45 UTC ( [id://919571] : note . print w/replies, xml ) Need Help??

in reply to module needs another module for build

build_requires will be resolved too late to be of any help. build_requires are resolved by *after* Makefile.PL has already been executed by cpan/cpanp/cpanm etc.

CONFIGURE_REQUIRES on the other hand are a list of prereqs that must be resolved *before* Makefile.PL is executed.

  • CONFIGURE_REQUIRES - modules required by Makefile.PL/Build.PL
  • BUILD_REQUIRES - modules required only during the build process
  • PREREQ_PM - modules required to run your module
WriteMakefile( CONFIGURE_REQUIRES => { 'B' => 0, }, PREREQ_PM => { 'B' => 0, }, )

We require the 'B' module during configuration and at runtime in the above example.

Replies are listed 'Best First'.
Re^2: module needs another module for build
by dk (Chaplain) on Aug 10, 2011 at 08:19 UTC
    Thank you! CONFIGURE_REQUIRES is definitely a step forward, will try. I wonder if CPAN shell can detect that this field has changed after Makefile.PL was run and re-run it, because I have another module that does just that, if none of the libraries it needs are found, it falls back on a third-party module.

      The CPAN clients (cpan/cpanp/cpanm) take the following steps:

      • Download distribution
      • Extract distribution
      • Does a META.yml or META.json file exist? Okay, parse and look for configure_requires, resolve all the requirements listed there
      • Execute Makefile.PL or Build.PL
      • If there is a MYMETA.yml or MYMETA.json, parse and look for build and runtime requirements, resolve these
      • No, MYMETA files, okay, if there is a Makefile parse that to resolve requirements
      • Oh, its a Module::Build based dist, try running 'Build prereq_data' action, if that fails, poke around in _build/ directory to find the requirements
      • Resolve requirements
      • Execute 'make' for EUMM or './Build' for M::B
      • Execute 'make test' for EUMM or './Build test' for M::B
      • Execute 'make install' for EUMM or './Build install' for M::B
        ++ very useful , thanks. This should be in FAQ somewhere.