Am 02.12.2014 um 08:17 schrieb Jens Rehsack <[email protected]>:
>
> Am 01.12.2014 um 17:59 schrieb Leon Timmermans <[email protected]>:
>
>> On Mon, Dec 1, 2014 at 11:48 AM, Jens Rehsack <[email protected]> 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
[email protected]