$ENV{X11_PREFIX}="/usr/X11" if ($ENV{X11_PREFIX} eq '');
$ENV{CC}="gcc" if ($ENV{CC} eq '');
$ENV{CC_BASE}=$ENV{CC};
$target=shift @ARGV;
sub build_app {
build("xterm");
build("mesa-demos");
build("xscope");
build("xbitmaps");
build("x11perf");
build("xload");
build("appres");
build("bdftopcf");
build("bitmap");
build("editres");
build("fonttosfnt");
build("fslsfonts");
build("fstobdf");
build("iceauth");
build("ico");
build("listres");
build("luit");
build("mkfontdir");
build("mkfontscale");
build("oclock");
build("rgb");
build("sessreg");
build("showfont");
build("smproxy");
build("twm");
build("viewres");
build("xauth");
build("xbacklight");
build("xcalc");
build("xclipboard");
build("xclock");
build("xcmsdb");
build("xconsole");
build("xcursorgen");
build("xditview");
build("xdm");
build("xdpyinfo");
build("xedit");
build("xev");
build("xeyes");
build("xfd");
build("xfontsel");
build("xfs");
build("xfsinfo");
build("xgamma");
build("xgc");
build("xhost");
build("xinput");
build("xkill");
build("xlogo");
build("xlsatoms");
build("xlsclients");
build("xlsfonts");
build("xmag");
build("xman");
build("xmessage");
build("xmh");
build("xmodmap");
build("xmore");
build("xpr");
build("xprop");
build("xrandr");
build("xrdb");
build("xrefresh");
build("xset");
build("xsetmode");
build("xsetpointer");
build("xsetroot");
build("xsm");
build("xstdcmap");
build("xvinfo");
build("xwd");
build("xwininfo");
build("xwud");
build("setxkbmap");
build("xkbcomp");
build("xkeyboard-config");
build("xkbevd");
build("xkbprint");
build("xkbutils");
if($ENV{MACOSFORGE_SL} ne "YES") {
build("xtrap");
}
}
if($target eq 'installsrc') {
sys_print("tar -cp --exclude .git --exclude .svn --exclude CVS . | tar -pox -C $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 .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");
sys_print("rm -f xkbcomp/xkbcomp-*/xkbparse.c");
sys_print("rm -f xkbevd/xkbevd-*/cfgparse.c");
sys_print("rm -f {twm/twm-*/src,xgc/xgc-*}/gram.[hc]");
sys_print("rm -f twm/twm-*/src/lex.c");
exit();
}
if($target eq 'install') {
sys_print("mkdir $ENV{DSTROOT}") unless -e $ENV{DSTROOT};
sys_print("mkdir $ENV{OBJROOT}") unless -e $ENV{OBJROOT};
print "Install phase: \n";
$prefix=$ENV{X11_PREFIX};
($osx_version)=(`sw_vers -productVersion` =~ /(10\.\d)/);
print "Building on $osx_version\n";
$ACLOCAL_LOCALDIR="$ENV{DSTROOT}$prefix/share/aclocal";
system "mkdir -p $ACLOCAL_LOCALDIR";
$ENV{ACLOCAL}="aclocal -I $ACLOCAL_LOCALDIR -I $prefix/share/aclocal -I/usr/local/share/aclocal";
$ENV{LIBTOOLIZE}="/usr/bin/glibtoolize";
$ENV{PKG_CONFIG_PATH}="$ENV{DSTROOT}$prefix/share/pkgconfig:$ENV{DSTROOT}$prefix/lib/pkgconfig:$prefix/share/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}";
foreach $arch (split(/ /,$ENV{RC_ARCHS})) {
$arch_flags_lib .= "-arch $arch ";
if($ENV{MACOSFORGE_LEO} eq "YES") {
$arch_flags_exec .= " -arch $arch " unless $arch =~ /64/;
} else {
$arch_flags_exec .= " -arch $arch " unless $arch =~ /ppc/;
}
}
$ENV{MACOSX_DEPLOYMENT_TARGET}=$osx_version;
system "date";
set_arch_exec();
build_app();
make_dsyms();
sys_print("/Developer/Makefiles/bin/compress-man-pages.pl -d $ENV{DSTROOT}/$prefix/share/man/ man1 man2 man3 man4 man5 man6 man7 man8 man9");
}
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");
sys_print("find . -depth 1 -type f -print | xargs -I foo cp -pv foo $ENV{OBJROOT}/$module");
chdir("$ENV{OBJROOT}/$full_path");
if($module eq "mesa-demos") {
sys_print("$ENV{CC} $ENV{CPPFLAGS} $ENV{CFLAGS} -c src/xdemos/glxinfo.c");
sys_print("$ENV{CC} $ENV{CPPFLAGS} $ENV{CFLAGS} -c src/xdemos/glxgears.c");
sys_print("install -d $ENV{DSTROOT}/$prefix/bin");
sys_print("$ENV{CC} $ENV{LDFLAGS} glxinfo.o -lGL -lX11 -o $ENV{DSTROOT}/$prefix/bin/glxinfo");
sys_print("$ENV{CC} $ENV{LDFLAGS} glxgears.o -lGL -lX11 -o $ENV{DSTROOT}/$prefix/bin/glxgears");
} else {
sys_print("rm -f m4/libtool.m4 m4/lt*.m4") if(-f "m4/libtool.m4");
sys_print("autoreconf -fvi") unless($module eq 'xterm');
if($module eq 'xkeyboard-config') {
sys_print("sed -e 's/_description/description/g' -e 's/_shortDescription/shortDescription/g' rules/base.xml.in > rules/base.xml")
}
print "Configuring...\n";
$conf_flags=" --prefix=$prefix --disable-static --disable-dependency-tracking --disable-nls --cache-file=$ENV{OBJROOT}/configure.cache ";
$conf_flags_path=$ENV{OBJROOT}."/$module/conf_flags";
$post_config_path=$ENV{OBJROOT}."/$module/post-config";
if($ENV{MACOSFORGE_SL} eq "YES") {
$conf_flags="$conf_flags --without-xprint --without-fontcache --without-xf86misc --without-dga "
}
if(-e $conf_flags_path) {
$conf_flags .= `cat $conf_flags_path`;
chomp $conf_flags;
}
sys_print("./configure $conf_flags");
if(-e $post_config_path) {
sys_print("cd .. && $post_config_path");
}
sys_print("make -j".`sysctl -n hw.activecpu`);
sys_print("make install DESTDIR='$ENV{DSTROOT}'");
}
chdir('../..');
}
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("cp $fullname $ENV{SYMROOT}");
sys_print_nodie("strip -S $fullname");
}
}
close FIND;
}
sub set_arch_exec {
$ENV{CC}="$ENV{CC_BASE} -I$ENV{DSTROOT}$prefix/include -I$prefix/include";
$ENV{CPPFLAGS}="-D__DEBUG__ -D_FORTIFY_SOURCE=2";
$ENV{CFLAGS}="-ggdb3 -Os -pipe $arch_flags_exec -Wall -Wformat=2";
$ENV{LDFLAGS}="-pipe $arch_flags_exec -L$ENV{DSTROOT}$prefix/lib -L$prefix/lib";
sys_print_nodie("rm $ENV{OBJROOT}/configure.cache");
}
sub set_arch_lib {
$ENV{CC}="$ENV{CC_BASE} -I$ENV{DSTROOT}$prefix/include -I$prefix/include";
$ENV{CPPFLAGS}="-D__DEBUG__ -D_FORTIFY_SOURCE=2";
$ENV{CFLAGS}="-ggdb3 -Os -pipe $arch_flags_lib -Wall -Wformat=2";
$ENV{LDFLAGS}="-pipe $arch_flags_lib -L$ENV{DSTROOT}$prefix/lib -L$prefix/lib";
sys_print_nodie("rm $ENV{OBJROOT}/configure.cache");
}
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;
}