use strict;
use DirHandle;
use File::Basename ();
use File::chdir;
use File::Spec;
use File::Temp ();
my $MyName = File::Basename::basename($0);
my $sdkroot = $ENV{SDKROOT};
my $splitarchs = $ENV{_TC_SPLIT_ARCHS};
my %SDKArchs;
%SDKArchs = map {($_ => 1)} split(' ', `tconf --archs`)
if defined($sdkroot) && defined($splitarchs);
my $compile = 0;
my $doprint = 0;
my $got_arch = 0;
my $got_o = 0;
my $no64 = 0;
my $output;
my(%sdkarchhash, %sdk64archhash, %regulararchhash, %regular64archhash, @otherargs);
for(@ARGV) {
if($got_arch) {
if($SDKArchs{$_}) {
if(/64$/) {
$sdk64archhash{$_} = 1;
} else {
$sdkarchhash{$_} = 1;
}
} elsif(/64$/) {
$regular64archhash{$_} = 1;
} else {
$regulararchhash{$_} = 1;
}
$got_arch = 0;
next;
}
if($got_o) {
$output = $_;
$got_o = 0;
next;
}
if($_ eq '-arch') {
$got_arch++;
next;
}
if($_ eq '-no64') {
$no64++;
next;
}
if($_ eq '-o') {
$got_o++;
next;
}
$compile++ if $_ eq '-c';
push(@otherargs, $_);
}
my @sdkarchlist = map {('-arch', $_)} keys(%sdkarchhash);
my @sdk64archlist = map {('-arch', $_)} keys(%sdk64archhash);
my @regulararchlist = map {('-arch', $_)} keys(%regulararchhash);
my @regular64archlist = map {('-arch', $_)} keys(%regular64archhash);
if(scalar(@sdk64archlist) > 0) {
if($no64) {
$doprint++;
} else {
push(@sdkarchlist, @sdk64archlist);
}
}
if(scalar(@regular64archlist) > 0) {
if($no64) {
$doprint++;
} else {
push(@regulararchlist, @regular64archlist);
}
}
if(!defined($splitarchs)) {
my @args = ("/usr/bin/$MyName", @regulararchlist);
if(defined($sdkroot)) {
push(@args, $compile ? ('-isysroot', $sdkroot) :
"-Wl,-syslibroot,$sdkroot");
$doprint = 1;
}
push(@args, '-o', $output) if defined($output);
push(@args, @otherargs);
print STDERR "===>@args\n" if $doprint;
exec @args;
exit 1; }
if(scalar(@regulararchlist) > 0 && scalar(@sdkarchlist) > 0) {
my @args;
my $tmpdir = File::Temp::tempdir('compilertempXXXXXXXX', CLEANUP => 1, TMPDIR => 1);
if(defined($output)) {
my $sdkfile = File::Spec->join($tmpdir, "sdkfile");
if($compile) {
@args = ("/usr/bin/$MyName", @sdkarchlist, '-isysroot', $sdkroot, '-o', $sdkfile, @otherargs);
} else {
@args = ("/usr/bin/$MyName", @sdkarchlist, "-Wl,-syslibroot,$sdkroot", '-o', $sdkfile, @otherargs);
}
print STDERR "===>@args\n";
system(@args) == 0 or exit 1;
my $regularfile = File::Spec->join($tmpdir, "regularfile");
@args = ("/usr/bin/$MyName", @regulararchlist, '-o', $regularfile, @otherargs);
print STDERR "===>@args\n";
system(@args) == 0 or exit 1;
@args = ('lipo', '-create', $sdkfile, $regularfile, '-output', $output);
print STDERR "===>@args\n";
system(@args) == 0 or exit 1;
} else {
my $sdkdir = File::Spec->join($tmpdir, "sdkdir");
mkdir $sdkdir or die "Can't mkdir($sdkdir): $!\n";
my $regulardir = File::Spec->join($tmpdir, "regulardir");
mkdir $regulardir or die "Can't mkdir($regulardir): $!\n";
my $d = DirHandle->new('.') or die "Can't DirHandle->new('.'): $!\n";
while(defined($_ = $d->read)) {
next if $_ eq '.' || $_ eq '..';
my $oldname = File::Spec->join($CWD, $_);
my $newname = File::Spec->join($sdkdir, $_);
symlink($oldname, $newname)
or die "Can't symlink($oldname, $newname): $!\n";
$newname = File::Spec->join($regulardir, $_);
symlink($oldname, $newname)
or die "Can't symlink($oldname, $newname): $!\n";
}
undef $d;
if($compile) {
@args = ("/usr/bin/$MyName", @sdkarchlist,
'-isysroot', $sdkroot, @otherargs);
} else {
@args = ("/usr/bin/$MyName", @sdkarchlist,
"-Wl,-syslibroot,$sdkroot", @otherargs);
}
print STDERR "===>@args\n";
my @filelist;
{
local $CWD = $sdkdir; system(@args) == 0 or exit 1;
my $d = DirHandle->new('.')
or die "Can't DirHandle->new('.'): $!\n";
while(defined($_ = $d->read)) {
push(@filelist, $_) if !-l $_ && -f _;
}
}
@args = ("/usr/bin/$MyName", @regulararchlist, @otherargs);
print STDERR "===>@args\n";
{
local $CWD = $regulardir; system(@args) == 0 or exit 1;
}
for(@filelist) {
@args = (
'lipo',
'-create',
File::Spec->join($sdkdir, $_),
File::Spec->join($regulardir, $_),
'-output',
$_
);
print STDERR "===>@args\n";
system(@args) == 0 or exit 1;
}
}
exit 0;
} else {
push(@regulararchlist, @sdkarchlist);
}
if(scalar(@regulararchlist) == 0) { chomp(my $nativearch = `arch`);
push(@sdkarchlist, $nativearch) if $SDKArchs{$nativearch};
}
my @args = ("/usr/bin/$MyName", @regulararchlist);
if(scalar(@sdkarchlist)) {
push(@args, $compile ? ('-isysroot', $sdkroot) :
"-Wl,-syslibroot,$sdkroot");
$doprint = 1;
}
push(@args, '-o', $output) if defined($output);
push(@args, @otherargs);
print STDERR "===>@args\n" if $doprint;
exec @args;
exit 1;