package UCW::Configure::C;
use UCW::Configure;
+use strict;
+use warnings;
+
Test("OS", "Checking on which OS we run", sub {
my $os = `uname`;
chomp $os;
### CPU ###
Test("ARCH", "Checking for machine architecture", sub {
- my $mach = `uname -m`;
+ #
+ # We have to ask GCC for the target architecture, because it may
+ # differ from what uname tells us. This can happen even if we are
+ # not cross-compiling, for example on Linux with amd64 kernel, but
+ # i386 userspace.
+ #
+ my $gcc = Get("CC");
+ my $mach = `$gcc -dumpmachine 2>/dev/null`;
+ if (!$? && $mach ne "") {
+ $mach =~ s/-.*//;
+ } else {
+ $mach = `uname -m`;
+ Fail "Unable to determine machine type" if $? || $mach eq "";
+ }
chomp $mach;
- Fail "Unable to determine machine type" if $? || $mach eq "";
if ($mach =~ /^i[0-9]86$/) {
return "i386";
} elsif ($mach =~ /^(x86[_-]|amd)64$/) {
return "amd64";
} else {
- return "unknown";
+ return "unknown ($mach)";
}
});
}
sub parse_cpuinfo_darwin() {
- @cpu = (`sysctl -n machdep.cpu.vendor`,
- `sysctl -n machdep.cpu.family`,
- `sysctl -n machdep.cpu.model`);
+ my @cpu = (`sysctl -n machdep.cpu.vendor`,
+ `sysctl -n machdep.cpu.family`,
+ `sysctl -n machdep.cpu.model`);
chomp @cpu;
return @cpu;
}
elsif ($model >= 3) { $arch = "prescott"; }
else { $arch = "pentium4"; }
} elsif ($family == 6 && $gccver >= 3003) {
- if ($model == 15) { $arch = "prescott"; }
+ if ($model == 23) { $arch = "nocona"; }
+ elsif ($model == 15) { $arch = "prescott"; }
elsif (($model == 9 || $model == 13) && $gccver >= 3004) { $arch = "pentium-m"; }
elsif ($model >= 7) { $arch = "pentium3"; }
elsif ($model >= 3) { $arch = "pentium2"; }
Append("COPT" => "-I/sw/include");
# Fill in some constants not found in the system header files
Set("SOL_TCP" => 6); # missing in /usr/include/netinet/tcp.h
+ if (IsGiven("CONFIG_DIRECT_IO") && IsSet("CONFIG_DIRECT_IO")) {
+ Fail("Direct I/O is not available on darwin");
+ } else {
+ UnSet("CONFIG_DIRECT_IO");
+ }
+ if (!IsSet("CONFIG_POSIX_REGEX") && !IsSet("CONFIG_PCRE")) {
+ Set("CONFIG_POSIX_REGEX" => 1);
+ Warn "BSD regex library on Darwin isn't compatible, using POSIX regex.\n";
+ }
}
### Writing C headers with configuration ###
open X, ">obj/$hdr" or Fail $!;
print X "/* Generated automatically by $0, please don't touch manually. */\n";
- sub match_rules($) {
- my ($name) = @_;
+ sub match_rules($$) {
+ my ($rules, $name) = @_;
for (my $i=0; $i < scalar @$rules; $i++) {
my ($r, $v) = ($rules->[$i], $rules->[$i+1]);
return $v if $name =~ $r;
}
foreach my $x (sort keys %UCW::Configure::vars) {
- next unless match_rules($x);
+ next unless match_rules($rules, $x);
my $v = $UCW::Configure::vars{$x};
# Try to add quotes if necessary
$v = '"' . $v . '"' unless ($v =~ /^"/ || $v =~ /^\d*$/);