Cider Isn't Darwin Emulation, Really
Something went wrong. Try again.
3.4 kB · 133 lines
Perl
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134#!/usr/bin/perl## Copyright (c) 2010 Apple Inc. All rights reserved.## @APPLE_OSREFERENCE_LICENSE_HEADER_START@# # This file contains Original Code and/or Modifications of Original Code# as defined in and that are subject to the Apple Public Source License# Version 2.0 (the 'License'). You may not use this file except in# compliance with the License. The rights granted to you under the License# may not be used to create, or enable the creation or redistribution of,# unlawful or unlicensed copies of an Apple operating system, or to# circumvent, violate, or enable the circumvention or violation of, any# terms of an Apple operating system software license agreement.# # Please obtain a copy of the License at# http://www.opensource.apple.com/apsl/ and read it before using this file.# # The Original Code and all software distributed under the License are# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.# Please see the License for the specific language governing rights and# limitations under the License.# # @APPLE_OSREFERENCE_LICENSE_HEADER_END@#
use warnings;use strict;
use Data::Dumper;use File::Spec;use IO::File;use File::Basename ();
my $basename = File::Basename::basename($0);
sub usage { print "$basename: <source list> <output archive>"; exit 1;}
usage unless scalar(@ARGV) == 2;
my $sourceList = $ARGV[0];my $outputFile = $ARGV[1];
my $f = IO::File->new($sourceList, 'r');die "$basename: $sourceList: $!\n" unless defined($f);
my @objects;my @archs = split / /, $ENV{"ARCHS"};my @sources = <$f>;chomp @sources;
undef $f;
# compiler optionschomp(my $CC = `xcrun -sdk "$ENV{'SDKROOT'}" -find cc`);my @CFLAGS = ( "-x assembler-with-cpp", "-c", "-isysroot", $ENV{'SDKROOT'} || "/", "-I".$ENV{"SDKROOT"}."/".$ENV{"SDK_INSTALL_HEADERS_ROOT"}."/usr/include", "-I".$ENV{"SDKROOT"}."/".$ENV{"SDK_INSTALL_HEADERS_ROOT"}."/usr/local/include", "-I".$ENV{"SDKROOT"}."/".$ENV{"SDK_INSTALL_HEADERS_ROOT"}."/System/Library/Frameworks/System.framework/PrivateHeaders",);
chomp(my $LIBTOOL = `xcrun -sdk "$ENV{'SDKROOT'}" -find libtool`);my @LIBTOOLFLAGS = ( "-static",);
# architecturesfor my $arch (@archs) { push(@CFLAGS, "-arch $arch");}
# do each compilemy $jobs = `sysctl -n hw.ncpu` + 2;
for my $src (@sources) { if ($jobs == 0) { if (wait != -1) { $jobs++; } else { printf "wait exited with -1 (no children) and exhausted allowed jobs. Exiting.\n"; exit 1; } if ($? != 0) { printf "$CC exited with value %d\n", $? >> 8; exit 1; } } (my $o = $src) =~ s/\.s$/\.o/; my $compileCommand = "$CC " . join(' ', @CFLAGS) . " -o $o $src"; printf $compileCommand . "\n";
$jobs--; my $pid = fork(); if ($pid == 0) { exec($compileCommand); } push(@objects, $o);}
while (wait != -1) { if ($? != 0) { printf "$CC exited with value %d\n", $? >> 8; exit 1; }}
printf "Finished assembly, beginning link.\n";
# final link
if (-f $outputFile) { unlink($outputFile);}
my $linkCommand = "$LIBTOOL " . join(' ', @LIBTOOLFLAGS) . " -o $outputFile " . join(' ', @objects);
printf $linkCommand . "\n";system($linkCommand);if ($? != 0) { print "$LIBTOOL exited with value %d\n", $? >> 8; exit 1;}