$target=shift @ARGV;
$ENV{DESTDIR}=$ENV{DSTROOT};
if($ENV{MACOSFORGE_RELEASE} eq "YES") {
$ENV{PYTHONPATH}="/usr/X11/lib/python2.5:/usr/X11/lib/python2.5/site-packages:$ENV{PYTHONPATH}";
}
sub sys_print {
$command=shift;
print "$command\n";
system $command;
$retval=$? >> 8;
die "returned code $retval" if $retval;
}
sub sys_print_nodie {
$command=shift;
print "$command\n";
system $command;
$retval=$? >> 8;
print "returned code $retval\n" if $retval;
}
if($target eq 'installsrc') {
sys_print("mkdir $ENV{SRCROOT}") unless -e $ENV{SRCROOT};
sys_print("ditto . $ENV{SRCROOT}");
chdir($ENV{SRCROOT});
foreach $module (glob('*')) {
next if $module =~ /build/;
next if $module =~ /Make/;
next if $module =~ /uvn/;
next if $module =~ /\./;
print "installing source for $module\n";
chdir($module);
sys_print("../uvn extract; ../uvn patch");
chdir('..');
}
exit();
}
if($target eq 'clean') {
print "Cleaning out directory $ENV{SRCROOT}\n";
chdir($ENV{SRCROOT});
sys_print("find . -name .svn | xargs rm -rf");
sys_print("find . -name .uvn | xargs rm -rf");
sys_print("find . -name \"*.gz\" | xargs rm");
sys_print("find . -name \"*.bz2\" | xargs rm");
sys_print("find . -name patches | xargs rm -rf");
exit();
}
if($target eq 'install') {
print "Install phase: \n";
sys_print("mkdir $ENV{DSTROOT}") unless -e $ENV{DSTROOT};
sys_print("mkdir $ENV{OBJROOT}") unless -e $ENV{OBJROOT};
$ENV{DESTDIR}=$ENV{DSTROOT};
$prefix="/usr/X11";
($osx_version)=(`sw_vers -productVersion` =~ /(10\.\d)/);
$ACLOCAL_LOCALDIR="$ENV{DSTROOT}$prefix/share/aclocal";
system "mkdir -p $ACLOCAL_LOCALDIR";
$ENV{ACLOCAL}="aclocal -I $ACLOCAL_LOCALDIR -I $prefix/share/aclocal";
$ENV{LIBTOOLIZE}="/usr/bin/glibtoolize";
$ENV{PKG_CONFIG_PATH}="$ENV{DSTROOT}$prefix/lib/pkgconfig:$prefix/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}";
$ENV{LD_LIBRARY_PATH}="$ENV{DSTROOT}$prefix/lib:$prefix/lib/:$ENV{LD_LIBRARY_PATH}";
$ENV{PATH}="$ENV{DSTROOT}$prefix/bin:$prefix/bin:$ENV{PATH}";
$ENV{FONTPATH}="$prefix/lib/X11/fonts/misc/,$prefix/lib/X11/fonts/Type1/,$prefix/lib/X11/fonts/75dpi/,$prefix/lib/X11/fonts/100dpi/,$prefix/lib/X11/fonts/cyrillic/,$prefix/lib/X11/fonts/TTF/";
foreach $arch (split(/ /,$ENV{RC_ARCHS})) {
$arch_flags .= " -arch $arch ";
}
$ENV{CC}="gcc -I$ENV{DSTROOT}$prefix/include -I$ENV{DSTROOT}$prefix/include/pixman-1 ";
$ENV{CFLAGS}="-I$prefix/include -D__DEBUG__ -ggdb3 -pipe $arch_flags -Os -D_FORTIFY_SOURCE=2 -Wall -Wformat-security";
$ENV{LDFLAGS}="-L$ENV{DSTROOT}$prefix/lib -L$prefix/lib -pipe $arch_flags";
$ENV{MACOSX_DEPLOYMENT_TARGET}=$osx_version;
build_lib();
if($ENV{MACOSFORGE_RELEASE} eq "YES") {
fix_la_reverse();
} else {
nuke_la();
}
sys_print_nodie("rm $ENV{DSTROOT}$prefix/lib/*.so.*");
lipoexec("$ENV{DSTROOT}$prefix/bin/cxpm");
lipoexec("$ENV{DSTROOT}$prefix/bin/sxpm");
lipoexec("$ENV{DSTROOT}$prefix/bin/makestrs");
make_dsyms();
}
sub get_workdir {
foreach (glob('*')) {
if(-e "$_/configure") {
return $_;
}
}
die "Unable to determine workdir";
}
sub build {
($module)=@_;
$m1=$module;
print("build($module): ");
die "$module not found" unless -e "$ENV{SRCROOT}/$module";
chdir ("$ENV{SRCROOT}/$module");
$full_path="$module/".get_workdir();
sys_print("mkdir -p $ENV{OBJROOT}/$full_path");
sys_print("ditto $ENV{SRCROOT}/$full_path $ENV{OBJROOT}/$full_path");
chdir("$ENV{OBJROOT}/$full_path");
sys_print("autoreconf -fvi") unless($module eq 'cairo');
print "Configuring...\n";
$conf_flags=" --prefix=$prefix --disable-static --disable-dependency-tracking --disable-nls ";
$conf_flags_path=$ENV{SRCROOT}."/$dir/$module/conf_flags";
$post_config_path=$ENV{SRCROOT}."/$dir/$module/post_config";
if(-e $conf_flags_path) {
$conf_flags .= `cat $conf_flags_path`;
chomp $conf_flags;
}
if($ENV{MACOSFORGE_RELEASE} eq "YES") {
sys_print("sed -i.bak 's/sysconfig.get_python_lib(\\([^,]\\),0/sysconfig.get_python_lib(\\1,1/g' configure");
} else {
sys_print(q{sed -i.bak 's|from distutils import sysconfig; print sysconfig.get_python_lib(.*,.*,prefix=.*)|import sys, os;print os.path.join(sys.prefix, \\\\"Extras/X11\\\\")|' configure});
}
sys_print("./configure $conf_flags");
sys_print("make -j".`sysctl -n hw.activecpu`);
if($module eq 'libXaw8') {
sys_print("make install-exec");
} else {
sys_print("make install");
}
fix_la();
chdir('../..');
}
sub build_lib {
build("libpng");
build("pixman");
build("xtrans");
build("libpthread-stubs");
build("libXau");
build("libXdmcp");
build("libxcb");
build("xcb-util");
build("libX11");
build("libXext");
build("libAppleWM");
build("libdmx");
build("libfontenc");
build("libFS");
build("libICE");
build("liblbxutil");
build("liboldX");
build("libSM");
build("libXt");
build("libXmu");
build("libXpm");
build("libXp");
build("libXaw8");
build("libXaw");
build("libXfixes");
build("libXcomposite");
build("libXrender");
build("libXdamage");
build("libXcursor");
build("libXevie");
build("libXfont");
build("libXfontcache");
build("libXxf86misc");
build("libXxf86vm");
build("libXft");
build("libXi");
build("libXinerama");
build("libxkbfile");
build("libxkbui");
build("libXprintUtil");
build("libXprintAppUtil");
build("libXrandr");
build("libXres");
build("libXScrnSaver");
build("libXTrap");
build("libXtst");
build("libXv");
build("libXvMC");
build("cairo");
build("xpyb");
}
sub make_dsyms {
open(FIND,"find $ENV{DSTROOT} -type f -exec file {} +|");
while(<FIND>) {
if(/(.*): .*Mach-O/) {
$basename=$1;
$fullname=$1;
$basename =~ s/\/.*\///;
sys_print_nodie("dsymutil --out=$ENV{SYMROOT}/$basename.dSYM $fullname");
sys_print_nodie("strip -S $fullname");
}
}
close FIND;
}
sub fix_la {
sys_print_nodie("sed -i.bak 's_libdir=.*_libdir=$ENV{DSTROOT}$prefix/lib_' $ENV{DSTROOT}$prefix/lib/*.la");
sys_print_nodie("sed -i.bak 's_ ".$prefix."_ ".$ENV{DSTROOT}.$prefix."_' $ENV{DSTROOT}$prefix/lib/*.la");
sys_print_nodie("sed -i.bak \"s/\\(library_names='[^ ]* [^ ]*\\) [^ ]*'/\\1'/\" $ENV{DSTROOT}$prefix/lib/*.la");
sys_print_nodie("rm $ENV{DSTROOT}$prefix/lib/*.bak");
}
sub fix_la_reverse {
sys_print_nodie("sed -i.bak 's_libdir=.*_libdir=$prefix/lib_' $ENV{DSTROOT}$prefix/lib/*.la");
sys_print_nodie("sed -i.bak 's_$ENV{DSTROOT}__g' $ENV{DSTROOT}$prefix/lib/*.la");
sys_print_nodie("rm $ENV{DSTROOT}$prefix/lib/*.bak");
}
sub lipoexec {
$fname=shift;
if($ENV{MACOSFORGE_RELEASE} eq "YES") {
sys_print_nodie("lipo $fname -verify_arch x86_64 && lipo -remove x86_64 -output $fname $fname");
sys_print_nodie("lipo $fname -verify_arch ppc64 && lipo -remove ppc64 -output $fname $fname");
} else {
sys_print_nodie("lipo $fname -verify_arch ppc && lipo -remove ppc -output $fname $fname");
}
}
sub nuke_la {
sys_print("rm $ENV{DSTROOT}$prefix/lib/*.la");
sys_print("rm $ENV{DSTROOT}/" . `python -c 'import sys, os;print os.path.join(sys.prefix, "Extras/X11/xcb/xcb.la")'`);
}