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