1 # 2 # CDDL HEADER START 3 # 4 # The contents of this file are subject to the terms of the 5 # Common Development and Distribution License (the "License"). 6 # You may not use this file except in compliance with the License. 7 # 8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 # or http://www.opensolaris.org/os/licensing. 10 # See the License for the specific language governing permissions 11 # and limitations under the License. 12 # 13 # When distributing Covered Code, include this CDDL HEADER in each 14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 # If applicable, add the following below this CDDL HEADER, with the 16 # fields enclosed by brackets "[]" replaced with your own identifying 17 # information: Portions Copyright [yyyy] [name of copyright owner] 18 # 19 # CDDL HEADER END 20 # 21 22 # 23 # Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 24 # Copyright (c) 2013 Racktop Systems. 25 # 26 27 require 5.0010; 28 use strict; 29 use warnings; 30 use ExtUtils::MakeMaker; 31 use Config; 32 33 # 34 # Compare OS versions. 35 # 36 sub cmp_os_ver 37 { 38 our ($a, $b); 39 my @v1 = split(/\./, $a); 40 my @v2 = split(/\./, $b); 41 my $diff = 0; 42 while (@v1 || @v2) { 43 last if (($diff = shift(@v1) - shift(@v2)) != 0); 44 } 45 return ($diff); 46 } 47 48 # Check we are on a supported OS version. 49 my $rel = qx{uname -r}; chomp($rel); 50 my $arch = qx{uname -p}; chomp($arch); 51 my $pver = sprintf('%vd', $^V); 52 53 # Figure out the appropriate Config.pm. Use an older version if necessary. 54 my $configpm = $Config{'archlibexp'} . "/Config.pm"; 55 if (! -f $configpm) { 56 my $p = "config/$pver"; 57 my $dh; 58 opendir($dh, $p) || die("Can't read directory $_: $!\n"); 59 my $old_rel = (sort(cmp_os_ver 60 grep(-d "$p/$_" && $_ =~ /^\d[\d.]+\d$/, readdir($dh))))[-1]; 61 closedir($dh); 62 if (defined($old_rel)) { 63 print(STDERR "Warning: No config file for OS version $rel, " . 64 "using $old_rel file\n"); 65 $rel = $old_rel; 66 $configpm = "config/$pver/$rel/$arch/Config.pm"; 67 } else { 68 die("Unsupported version of Perl/OS/Architecture " . 69 "$pver/$rel/$arch\n"); 70 } 71 } else { 72 open CONFIGPM, "<", $configpm or die $!; 73 open CONFIGPM_OUT, ">", "Config.pm" or die $!; 74 while(<CONFIGPM>) { 75 if (/'cc/) { 76 s/=>\s*'cc/=> 'gcc/; 77 s/=\s*'cc/='gcc/; 78 } 79 print CONFIGPM_OUT $_; 80 } 81 close CONFIGPM; 82 close CONFIGPM_OUT; 83 $configpm = "Config.pm"; 84 } 85 86 # Figure out the appropriate Config_heavy.pl. Use an older version if necessary. 87 my $configpl = $Config{'archlibexp'} . "/Config_heavy.pl"; 88 if (! -f $configpl) { 89 my $p = "config/$pver"; 90 my $dh; 91 opendir($dh, $p) || die("Can't read directory $_: $!\n"); 92 my $old_rel = (sort(cmp_os_ver 93 grep(-d "$p/$_" && $_ =~ /^\d[\d.]+\d$/, readdir($dh))))[-1]; 94 closedir($dh); 95 if (defined($old_rel)) { 96 print(STDERR "Warning: No config file for OS version $rel, " . 97 "using $old_rel file\n"); 98 $rel = $old_rel; 99 $configpl = "config/$pver/$rel/$arch/Config_heavy.pl"; 100 } else { 101 die("Unsupported version of Perl/OS/Architecture " . 102 "$pver/$rel/$arch\n"); 103 } 104 } else { 105 open CONFIGPL, "<", $configpl or die $!; 106 open CONFIGPL_OUT, ">", "Config_heavy.pl" or die $!; 107 while(<CONFIGPL>) { 108 if (/^cccdlflags=/) { 109 print CONFIGPL_OUT "cccdlflags='-fPIC'\n"; 110 } elsif (/^optimize=/) { 111 print CONFIGPL_OUT "optimize='-O2 -fno-strict-aliasing'\n"; 112 } else { 113 print CONFIGPL_OUT $_; 114 } 115 } 116 close CONFIGPL; 117 close CONFIGPL_OUT; 118 $configpl = "Config_heavy.pl"; 119 } 120 121 our %man1pods; 122 # Only install the pods for onn-ON builds. 123 if (! exists($ENV{CODEMGR_WS}) && ! exists($ENV{ENVCPPFLAGS1})) { 124 $man1pods{'pod/perlgcc.pod'} = '$(INST_MAN1DIR)/perlgcc.$(MAN1EXT)'; 125 } 126 127 WriteMakefile( 128 NAME => 'Sun::Solaris::PerlGcc', 129 VERSION_FROM => 'perlgcc.PL', 130 PL_FILES => { 'perlgcc.PL' => 'perlgcc' }, 131 EXE_FILES => [ 'perlgcc' ], 132 PM => { $configpm => '$(INST_LIBDIR)/PerlGcc/Config.pm', 133 $configpl => '$(INST_LIBDIR)/PerlGcc/Config_heavy.pl' }, 134 MAN1PODS => \%man1pods, 135 MAN3PODS => { }, # Stop autopodification. 136 clean => { FILES => 'perlgcc' }, 137 );