Am 02.12.2014 um 08:17 schrieb Jens Rehsack <rehs...@gmail.com>:

> 
> Am 01.12.2014 um 17:59 schrieb Leon Timmermans <faw...@gmail.com>:
> 
>> On Mon, Dec 1, 2014 at 11:48 AM, Jens Rehsack <rehs...@gmail.com> wrote:
>> Hi,
>> 
>> I run into some trouble integrating some right linker flags to a Makefile.PL 
>> - insane warnings from EU::MM is an offenseless artifact, deleted flags is 
>> next escalation.
>> 
>> I don't want discuss about utility and futility of the misplaced parameter 
>> approvals (EU::MM is a Makefile generator, not a configuration tester), I 
>> want to discuss a reasonable approach to pass check results into Makefile 
>> without doing the mistakes of Module::Install again.
>> 
>> My naive approach was passing EXTRALIBS and LDLOADLIBS instead of LIBS 
>> (https://github.com/i-scream/Unix-Statgrab/blob/master/Makefile.PL#L102-105) 
>> - I grabbed the idea from Net-SSLeay ...
>> But Dave objects (https://github.com/autarch/File-LibMagic/pull/3) and 
>> beside being always right I have to concede a point to Dave regarding 
>> "warnings confuse end-users".
>> 
>> I think you can work around the warning using a CONFIGURE callback:
>> 
>> WriteMakefile(
>>    ....
>>   CONFIGURE => sub {
>>        return {
>>            EXTRALIBS => ...,
>>            LDLOADLIBS => ...,
>>        }
>>    },
>> );
> 
> Seems reasonable - but as you know in not to distant future, they shall
> also override CC, CCLD, ... (using ExtUtils::Builder or alike, instead
> of plain cc).
> 
> Does the return hash of this callback overrides all EU::MM constants?

I think I can answer this question on my own:

File-ConfigDir-Install sno$ git diff
diff --git a/t/01-makefile.t b/t/01-makefile.t
index 5e9bd38..2b0759c 100644
--- a/t/01-makefile.t
+++ b/t/01-makefile.t
@@ -35,8 +35,12 @@ delete $ENV{PERL_MM_OPT};   # local::lib + PREFIX below will 
FAIL
 WriteMakefile(
     NAME              => 'File::ConfigDir::Install',
     VERSION_FROM      => 'lib/File/ConfigDir/Install.pm',
+    CONFIGURE => sub {
+       {
     INST_ETC          => "tlib-$$/etc",
     INST_LIB          => "tlib-$$/lib",
+       },
+    },
     MAKEFILE          => $FILE,
     PREREQ_PM         => {},
     ($] >= 5.005 ?

$ make && perl -Mblib t/01-makefile.t
cp lib/File/ConfigDir/Install.pm blib/lib/File/ConfigDir/Install.pm
Manifying 1 pod document
'INST_ETC' is not a known MakeMaker parameter name.
Generating a Unix-style test-21206-Makefile
Writing test-21206-Makefile for File::ConfigDir::Install
Writing MYMETA.yml and MYMETA.json
ok 1 - Created test-21206-Makefile
ok 2 - Recognized: t/etc/fsd-install.json
# make -f test-21206-Makefile
# cp t/etc/fsd-install.json tlib-21206/etc/fsd-install.json
# Manifying 1 pod document
ok 3 - Copied to blib for dist: t/etc/fsd-install.json
ok 4 - Same content: t/etc/fsd-install.json
# make -f test-21206-Makefile 
DESTDIR=/var/folders/5s/sk58jrwj7jj73phc9lcx9nh80000gn/T/cgOOrG5f45 install
# Skip tlib-21206/etc/fsd-install.json (unchanged)
# Manifying 1 pod document
# Installing 
/var/folders/5s/sk58jrwj7jj73phc9lcx9nh80000gn/T/cgOOrG5f45/Users/sno/perl5/perlbrew/perls/perl-5.20.0/man/man3/File::ConfigDir::Install.3
# Installing 
/var/folders/5s/sk58jrwj7jj73phc9lcx9nh80000gn/T/cgOOrG5f45/Users/sno/perl5/perlbrew/perls/perl-5.20.0/etc/fsd-install.json
# Appending installation info to 
/var/folders/5s/sk58jrwj7jj73phc9lcx9nh80000gn/T/cgOOrG5f45/Users/sno/perl5/perlbrew/perls/perl-5.20.0/lib/5.20.0/darwin-2level/perllocal.pod
# Checking for 
/var/folders/5s/sk58jrwj7jj73phc9lcx9nh80000gn/T/cgOOrG5f45/Users/sno/perl5/perlbrew/perls/perl-5.20.0/etc/fsd-install.json
ok 5 - Installed: t/etc/fsd-install.json
1..5

So neither the warning goes away nor existing constants are overwritten.

> Is there a minimum version of EU::MM for this CONFIGURE callback?
> 
>> I played a bit with MakeMaker extensions hacking 
>> https://metacpan.org/pod/File::ConfigDir::Install and mohawk pointed me to 
>> https://metacpan.org/pod/ExtUtils::MakeMaker::BigHelper ...
>> I know, all those MM extensions (ShareDir::Install ...) will not play well 
>> together.
>> 
>> What should be a reasonable way out - having a pluggable API for all those 
>> extensions?
>> 
>> They can be made to cooperate by not exporting the postambles to MY::, but 
>> instead glue them together something like this:
>> 
>> my @extensions = (...);
>> load($_) for @extensions
>> my @methods = map { my $method = $extension . "::postamble" } @extensions;
>> sub MY::postamble {
>>    my ($makemaker, %args) = @_;
>>    return join "\n\n", map { $makemaker->$_(%args) } @methods;
>> }
> 
> For some reason File::ConfigDir::Install doesn't just override postamble,
> it modifies the "install_*_*" instructions ...
> ...BigHelper (mohawk pointed to that) does something similar.

I think there is more a hook like 
https://metacpan.org/pod/Class::Method::Modifiers#around-method-s-sub needed 
for each of overloaded function ...

Cheers
-- 
Jens Rehsack
rehs...@gmail.com

Reply via email to