tuning Makefile.PL
Karel Miko
6 years ago
2 | 2 | use ExtUtils::MakeMaker; |
3 | 3 | use Config; |
4 | 4 | |
5 | my @myobjs = map { s|.c$|$Config{obj_ext}|; $_ } grep { $_ !~ m|^src/ltc/\.*tab\.c$| } ( | |
6 | glob('src/ltm/*.c'), | |
7 | glob('src/ltc/*/*.c'), | |
8 | glob('src/ltc/*/*/*.c'), | |
9 | glob('src/ltc/*/*/*/*.c'), | |
10 | glob('src/ltc/*/*/*/*/*.c'), | |
11 | ); | |
12 | my $myextlib = "src/liballinone$Config{lib_ext}"; | |
13 | my $mycflags = "$Config{ccflags} $Config{cccdlflags} $Config{optimize}"; | |
5 | my (@EUMM_INC_LIB, $myarflags, $mycflags); | |
14 | 6 | |
15 | #FIX: this is particularly useful for Debian https://github.com/DCIT/perl-CryptX/pull/39 | |
16 | $mycflags .= " $ENV{CFLAGS}" if $ENV{CFLAGS}; | |
17 | $mycflags .= " $ENV{CPPFLAGS}" if $ENV{CPPFLAGS}; | |
7 | if ($ENV{CRYPTX_CFLAGS} || $ENV{CRYPTX_LDFLAGS}) { | |
8 | # EXPERIMENTAL: use system libraries libtomcrypt + libtommath | |
9 | # e.g. | |
10 | # CRYPTX_LDFLAGS='-L/usr/local/lib -ltommath -ltomcrypt' CRYPTX_CFLAGS='-DLTM_DESC -I/usr/local/include' perl Makefile.PL | |
11 | print "CRYPTX_CFLAGS = $ENV{CRYPTX_CFLAGS}\n" if $ENV{CRYPTX_CFLAGS}; | |
12 | print "CRYPTX_LDFLAGS = $ENV{CRYPTX_LDFLAGS}\n" if $ENV{CRYPTX_LDFLAGS}; | |
13 | @EUMM_INC_LIB = ( | |
14 | INC => $ENV{CRYPTX_CFLAGS}, | |
15 | LIBS => [ $ENV{CRYPTX_LDFLAGS} ], | |
16 | ); | |
17 | } | |
18 | else { | |
19 | # PREFERRED: use bundled libtomcrypt + libtommath (from ./src subdir) | |
20 | my @myobjs = map { s|.c$|$Config{obj_ext}|; $_ } grep { $_ !~ m|^src/ltc/\.*tab\.c$| } ( | |
21 | glob('src/ltm/*.c'), | |
22 | glob('src/ltc/*/*.c'), | |
23 | glob('src/ltc/*/*/*.c'), | |
24 | glob('src/ltc/*/*/*/*.c'), | |
25 | glob('src/ltc/*/*/*/*/*.c'), | |
26 | ); | |
27 | $mycflags = "$Config{ccflags} $Config{cccdlflags} $Config{optimize}"; | |
18 | 28 | |
19 | #FIX: gcc with -flto is a trouble maker see https://github.com/DCIT/perl-CryptX/issues/32 | |
20 | $mycflags =~ s/-flto\b//g; | |
29 | #FIX: this is particularly useful for Debian https://github.com/DCIT/perl-CryptX/pull/39 | |
30 | $mycflags .= " $ENV{CFLAGS}" if $ENV{CFLAGS}; | |
31 | $mycflags .= " $ENV{CPPFLAGS}" if $ENV{CPPFLAGS}; | |
21 | 32 | |
22 | #FIX: avoid -Wwrite-strings -Wcast-qual -pedantic -pedantic-errors -ansi -std=c89 | |
23 | $mycflags =~ s/-pedantic\b//g; | |
24 | $mycflags =~ s/-pedantic-errors\b//g; | |
25 | $mycflags =~ s/-std=c89\b//g; | |
26 | $mycflags =~ s/-ansi\b//g; | |
27 | $mycflags =~ s/-Wwrite-strings\b//g; | |
28 | $mycflags =~ s/-Wcast-qual\b//g; | |
33 | #FIX: gcc with -flto is a trouble maker see https://github.com/DCIT/perl-CryptX/issues/32 | |
34 | $mycflags =~ s/-flto\b//g; | |
29 | 35 | |
30 | #FIX: avoid "ar: fatal: Numeric group ID too large" see https://github.com/DCIT/perl-CryptX/issues/33 | |
31 | my $myarflags = '$(AR_STATIC_ARGS)'; | |
32 | if ($^O ne 'MSWin32' && $Config{ar}) { | |
33 | # for ar's "deterministic mode" we need GNU binutils 2.20+ (2009-10-16) | |
34 | my $arver = `$Config{ar} --version 2>/dev/null`; | |
35 | my ($maj, $min) = $arver =~ /^GNU ar [^\d]*(\d)\.(\d+)\.\d+/s; | |
36 | $myarflags = 'rcD' if ($maj && $min && $maj >= 2 && $min >= 20) || $arver=~ /^BSD ar /; | |
36 | #FIX: avoid -Wwrite-strings -Wcast-qual -pedantic -pedantic-errors -ansi -std=c89 | |
37 | $mycflags =~ s/-pedantic\b//g; | |
38 | $mycflags =~ s/-pedantic-errors\b//g; | |
39 | $mycflags =~ s/-std=c89\b//g; | |
40 | $mycflags =~ s/-ansi\b//g; | |
41 | $mycflags =~ s/-Wwrite-strings\b//g; | |
42 | $mycflags =~ s/-Wcast-qual\b//g; | |
43 | ||
44 | #FIX: avoid "ar: fatal: Numeric group ID too large" see https://github.com/DCIT/perl-CryptX/issues/33 | |
45 | $myarflags = '$(AR_STATIC_ARGS)'; | |
46 | if ($^O ne 'MSWin32' && $Config{ar}) { | |
47 | # for ar's "deterministic mode" we need GNU binutils 2.20+ (2009-10-16) | |
48 | my $arver = `$Config{ar} --version 2>/dev/null`; | |
49 | my ($maj, $min) = $arver =~ /^GNU ar [^\d]*(\d)\.(\d+)\.\d+/s; | |
50 | $myarflags = 'rcD' if ($maj && $min && $maj >= 2 && $min >= 20) || $arver=~ /^BSD ar /; | |
51 | } | |
52 | @EUMM_INC_LIB = ( | |
53 | INC => '-DLTM_DESC -Isrc/ltc/headers -Isrc/ltm', | |
54 | MYEXTLIB => "src/liballinone$Config{lib_ext}", | |
55 | clean => { 'FILES' => join(' ', @myobjs, "src/liballinone$Config{lib_ext}") }, | |
56 | ); | |
37 | 57 | } |
38 | 58 | |
39 | 59 | my %eumm_args = ( |
45 | 65 | LICENSE => 'perl_5', |
46 | 66 | META_MERGE => { resources => { repository => 'https://github.com/DCIT/perl-CryptX', bugtracker => 'https://github.com/DCIT/perl-CryptX/issues' } }, |
47 | 67 | dist => { 'PREOP' => 'perldoc -u lib/CryptX.pm | pod2markdown > README.md' }, |
48 | ($ENV{CRYPTX_CFLAGS} || $ENV{CRYPTX_LDFLAGS}) | |
49 | ? | |
50 | ( | |
51 | # e.g. CRYPTX_LDFLAGS='-L/usr/local/lib -ltommath -ltomcrypt' CRYPTX_CFLAGS='-DLTM_DESC -I/usr/local/include' perl Makefile.PL | |
52 | INC => $ENV{CRYPTX_CFLAGS}, | |
53 | LIBS => [ $ENV{CRYPTX_LDFLAGS} ], | |
54 | ) | |
55 | : | |
56 | ( | |
57 | # bundled libtomcrypt + libtommath | |
58 | INC => '-DLTM_DESC -Isrc/ltc/headers -Isrc/ltm', | |
59 | MYEXTLIB => $myextlib, | |
60 | clean => { 'FILES' => join(' ', @myobjs, $myextlib) }, | |
61 | ) | |
68 | @EUMM_INC_LIB | |
62 | 69 | ); |
63 | 70 | |
64 | my $eumm_ver = eval $ExtUtils::MakeMaker::VERSION; | |
71 | my $eumm_ver = eval $ExtUtils::MakeMaker::VERSION; | |
65 | 72 | delete $eumm_args{MIN_PERL_VERSION} if $eumm_ver < 6.48; |
66 | 73 | delete $eumm_args{META_ADD} if $eumm_ver < 6.46; |
67 | 74 | delete $eumm_args{META_MERGE} if $eumm_ver < 6.46; |
69 | 76 | |
70 | 77 | WriteMakefile(%eumm_args); |
71 | 78 | |
72 | # ARFLAGS=\$(AR_STATIC_ARGS) RANLIB=\$(RANLIB) AR=\$(AR) | |
79 | sub MY::postamble { | |
80 | return "" unless $mycflags && $myarflags; | |
73 | 81 | |
74 | sub MY::postamble { | |
75 | my $myextlib = qq{ | |
82 | my $extra_targets = qq{ | |
76 | 83 | \$(MYEXTLIB): src/Makefile |
77 | 84 | cd src && \$(MAKE) ARFLAGS="$myarflags" RANLIB="\$(RANLIB)" AR="\$(AR)" CC="\$(CC)" LIB_EXT=\$(LIB_EXT) OBJ_EXT=\$(OBJ_EXT) CFLAGS="$mycflags" |
78 | 85 | }; |
79 | 86 | |
80 | $myextlib = qq{ | |
87 | $extra_targets = qq{ | |
81 | 88 | \$(MYEXTLIB): src/Makefile |
82 | 89 | cd src && \$(MAKE) -f Makefile.nmake CFLAGS="$mycflags" |
83 | 90 | } if $^O eq 'MSWin32' && $Config{make} =~ /nmake/ && $Config{cc} =~ /cl/; |
84 | 91 | |
85 | $myextlib = qq{ | |
92 | $extra_targets = qq{ | |
86 | 93 | \$(MYEXTLIB): src/Makefile |
87 | 94 | cd src && \$(MAKE) CC="$Config{cc}" CFLAGS="$mycflags" |
88 | 95 | } if $^O eq 'MSWin32' && $Config{cc} =~ /gcc/; |
89 | 96 | |
90 | my $version_patch = q{ | |
97 | $extra_targets .= q{ | |
91 | 98 | versionsync: |
92 | 99 | $(NOECHO) perl _generators/version_patch.pl sync |
93 | 100 | versioninc: |
113 | 120 | |
114 | 121 | }; |
115 | 122 | |
116 | return "$myextlib\n$version_patch"; | |
123 | return $extra_targets; | |
117 | 124 | } |