bulk88 has asked for the wisdom of the Perl Monks concerning the following question:

I am trying to run WriteMakefile twice. On the 2nd run of WriteMakefile the MY overloads are ignored. The makefile doesn't have the custom postamble section. How do I fix this? Is my MY package code wrong or is this a MakeMaker bug?
use 5.010000; use ExtUtils::MakeMaker; use Config qw(%Config); # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. %param = ( NAME => 'MM123', VERSION_FROM => 'lib/MM123.pm', # finds $VERSION PREREQ_PM => {}, # e.g., Module::Name => 1.1 ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/MM123.pm', # retrieve abstract from modu +le AUTHOR => 'A. U. Thor <a.u.thor@a.galaxy.far.far.away>' +) : ()), # e.g., '-lm' DEFINE => '', # e.g., '-DHAVE_SOMETHING' INC => '-I.', # e.g., '-I. -I/usr/include/other' ); WriteMakefile(%param); WriteMakefile(%param); package MY; sub postamble { print "postamble hook worked\n"; return ' # POSTAMBLE WORKED '; }
below is file "./lib/MM123.pm"
package MM123; use strict; use warnings; require Exporter; our @ISA = qw( Exporter ); # Items to export into callers namespace by default. Note: do not expo +rt # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. # This allows declaration use MM123 ':all'; # If you do not need this, moving things directly into @EXPORT or @EXP +ORT_OK # will save memory. our %EXPORT_TAGS = ( 'all' => [ qw( ) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( ); our $VERSION = '0.01'; # Preloaded methods go here. 1;
command line output
C:\pl\mmbug>perl makefile.pl postamble hook worked Writing Makefile for MM123 Writing Makefile for MM123 C:\pl\mmbug>
Why am I runing WriteMakefile twice? I need to see the final version of certain macros (CCFLAGS, LINKTYPE, OPTIMIZE, etc). MM parameters can be set on the commandline to makefile.pl, in the hash given to WriteMakefile, or in $Config. The macros can also be overridden on the command line directly to the make tool, but I think that that is unsupportable (if you have an idea how to change dependency targets and other macros based on parsing existing macros set as env vars, cl options to nmake tell me). Certain MM macros are generated usually, and are almost never parameters (LINKTYPE). WriteMakefile returns a MM object, this can be looked inside for the final macro values. Then I can set up the MY package overloads to generate the correct makefile. The problem is the MY package overloads don't run on the 2nd run of WriteMakefile. I also tried running MM directly as "my $mm = MM->new({@_});", same problem. On the 2nd run, MY overloads are ignored.

Replies are listed 'Best First'.
Re: 2nd run of WriteMakefile ignores MY overloads
by syphilis (Archbishop) on Apr 05, 2012 at 02:46 UTC
    I need to see the final version of certain macros (CCFLAGS, LINKTYPE, OPTIMIZE, etc)

    Is there some other way of seeing what you need to see ? I would've thought there would be a simpler way (like having the Makefile.PL print them out and/or assign them to variables for later use) ... though I can't really get my head around your precise requirements.

    If you really do need to run WriteMakefile() a second time, would you be better off running it in a second Makefile.PL ? (No idea whether that's a feasible option :-)

    Cheers,
    Rob

        I was right, you don't need to run it twice :)

        http://search.cpan.org/dist/PAR-Packer/MANIFEST http://cpansearch.perl.org/src/RSCHUPP/PAR-Packer-1.013/myldr/Makefile.PL redefines CFLAGS (and friends) in postamble, after MakeMaker has expanded all the stuff ( LINKTYPE and everything )

        $ h2xs -AX -n Bunk ... sub MY::postamble { use Data::Dump(); warn join "\n", Data::Dump::pp(@_), "postamble @_ ", Data::Dump::pp( $_[0]->{ARGS}, $_[0]->{LINKTYPE} ); "" } ... $ perl Bunk/Makefile.PL ... postamble PACK001=HASH(0xa556a4) ( { ABSTRACT_FROM => "lib/Bunk.pm", AUTHOR => ["A. U. Thor <a.u.thor\@a.galaxy.far.far.away>"], NAME => "Bunk", PREREQ_PM => {}, VERSION_FROM => "lib/Bunk.pm", }, "dynamic", ) at Bunk\Makefile.PL line 15. Writing Makefile for Bunk Writing MYMETA.yml and MYMETA.json $ perl Bunk/Makefile.PL LINKTYPE=static ... postamble PACK001=HASH(0xa556c4) ( { ABSTRACT_FROM => "lib/Bunk.pm", AUTHOR => ["A. U. Thor <a.u.thor\@a.galaxy.far.far.away>"], LINKTYPE => "static", NAME => "Bunk", PREREQ_PM => {}, VERSION_FROM => "lib/Bunk.pm", }, "static", ) at Bunk\Makefile.PL line 15. Writing Makefile for Bunk Writing MYMETA.yml and MYMETA.json

        The PACK001=HASH(0xa556c4) gives a hint as to why calling WriteMakefile twice doesn't work -- MakeMaker is eeeew

        :) MakeMaker Is DOOMED! but Module::Build doesn't support static linking

Re: 2nd run of WriteMakefile ignores MY overloads
by Anonymous Monk on Apr 04, 2012 at 23:55 UTC

    Why am I runing WriteMakefile twice? I need to see the final version of certain macros (CCFLAGS, LINKTYPE, OPTIMIZE, etc).

    You probably don't