1sub OsArch { 2 my ($UNAME, $HOST_OS, $HOST_ARCH, 3 $MARCH, # machine hardware name returned by uname -m 4 @ARCHITECTURES); 5 if ($^O eq 'MSWin32') { 6 $UNAME = $HOST_OS = 'win'; 7 $HOST_ARCH = $MARCH = 'x86_64'; 8 @ARCHITECTURES = qw(x86_64 i386); 9 } else { 10 $UNAME = `uname -s`; 11 chomp $UNAME; 12 if ($UNAME =~ /Darwin/) { 13 $HOST_OS = 'mac'; 14 } elsif ($UNAME =~ /Linux/) { 15 $HOST_OS = 'linux'; 16 } elsif ($UNAME =~ /SunOS/) { 17 $HOST_OS = 'sun'; 18 @ARCHITECTURES = qw(x86_64 i386); 19 } elsif ($UNAME =~ /xCYGWIN/) { 20 $HOST_OS = 'win'; 21 } elsif ($UNAME =~ /xMINGW/) { 22 $HOST_OS = 'win'; 23 } else { 24 $HOST_OS = $UNAME; 25 } 26 if ($HOST_OS eq 'mac') { 27 $MARCH = $HOST_ARCH = MacArch(); 28 @ARCHITECTURES = qw(x86_64 i386 fat86) if ($MARCH eq 'x86_64'); 29 } else { 30 $MARCH = `uname -m`; 31 chomp $MARCH; 32 if ($MARCH =~ /i386/) { 33 $HOST_ARCH = 'i386'; 34 } elsif ($MARCH =~ /i486/) { 35 $HOST_ARCH = 'i386'; 36 } elsif ($MARCH =~ /i586/) { 37 $HOST_ARCH = 'i386'; 38 } elsif ($MARCH =~ /i686/) { 39 if ($UNAME =~ /WOW64/) { # 64-bit capable Cygwin. 40 # Analyze the version of cl to set the correct architecture 41 my $CL = `cl.exe 2>&1 > /dev/null`; 42 if ($CL =~ /for x64/) { 43 $HOST_ARCH = 'x86_64'; 44 } else { 45 $HOST_ARCH = 'i386'; 46 } 47 } else { 48 $HOST_ARCH = 'i386'; 49 } 50 } elsif ($MARCH =~ /x86_64/) { 51 $HOST_ARCH = 'x86_64'; 52 } elsif ($MARCH =~ /i86pc/) { 53 $HOST_ARCH = 'x86_64'; 54 @ARCHITECTURES = qw(x86_64 i386); 55 } elsif ($MARCH =~ /sun4v/) { 56 $HOST_ARCH = 'sparc64'; 57 @ARCHITECTURES = qw(sparc64 sparc32); 58 } elsif ($MARCH =~ /aarch64/) { 59 $HOST_ARCH = 'arm64'; 60 } else { 61 $HOST_ARCH = $MARCH; 62 } 63 } 64 } 65 ($HOST_OS, $HOST_ARCH, $UNAME, $MARCH, @ARCHITECTURES); 66} 67 68sub MacArch { 69 my $ARCH = `uname -m`; 70 chomp $ARCH; 71 if ($ARCH eq 'x86_64') { 72 return $ARCH; 73 } else { 74 my $SYSCTL = '/usr/sbin/sysctl'; 75 $SYSCTL = '/sbin/sysctl' if (-x '/sbin/sysctl'); 76 77 my $CAP64 = `$SYSCTL -n hw.cpu64bit_capable`; 78 chomp $CAP64; 79 80 my $PADDR_BITS = `$SYSCTL -n machdep.cpu.address_bits.physical`; 81 chomp $PADDR_BITS; 82 83 my $VADDR_BITS = `$SYSCTL -n machdep.cpu.address_bits.virtual`; 84 chomp $VADDR_BITS; 85 86 if ($CAP64 != 0) { 87 if ($PADDR_BITS > 32 && $VADDR_BITS > 32) { 88 if ($ARCH eq 'i386' || $ARCH eq 'x86_64') { 89 return 'x86_64'; 90 } elsif ($ARCH eq 'Power Macintosh') { 91 return 'ppc64'; 92 } else { 93 return 'unrecognized'; 94 } 95 } 96 } 97 98 if ($ARCH eq 'i386') { 99 return 'i386'; 100 } elsif ($ARCH eq 'Power Macintosh') { 101 return 'ppc32'; 102 } else { 103 return 'unrecognized'; 104 } 105 } 106} 107 1081 109