build   [plain text]


#!/usr/bin/perl

# Handle environment parsing for the MacOSForge releases and set defaults for the OSX release
$ENV{X11_PREFIX}="/usr/X11" if ($ENV{X11_PREFIX} eq '');
$ENV{X11_APP_DIR}="/Applications/Utilities" if ($ENV{X11_APP_DIR} eq '');
$ENV{X11_APP_NAME}="X11" if ($ENV{X11_APP_NAME} eq '');
$ENV{X11_APP}="$ENV{X11_APP_DIR}/$ENV{X11_APP_NAME}.app";
$ENV{X11_BUNDLE_ID_PREFIX}="org.x" if ($ENV{X11_BUNDLE_ID_PREFIX} eq '');
$ENV{LAUNCHD_PREFIX}="/System/Library" if ($ENV{LAUNCHD_PREFIX} eq '');

$target=shift @ARGV;

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);
        foreach $file (glob('*.tar.bz2')) {
            sys_print("tar -xjf ".$file);
        }
        foreach $file (glob('*.tar.gz')) {
            sys_print("tar -xzf ".$file);
        }
        foreach $file (glob('patches/*')) {
            next if (($ENV{MACOSFORGE_RELEASE} eq "YES") && ($file =~ /\/9/));
            sys_print("patch -p0 < ".$file);
        }
        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");

    # Prune GPL bits we don't use
    sys_print("rm -rf {kdrive,Xquartz}/*/hw/xwin/*yacc.[hc]");
    sys_print("rm -rf {kdrive,Xquartz}/*/hw/dmx/config/parser.[hc]");

    # libtool m4s muckup autoreconf
    sys_print("rm -rf */*/m4/l*.m4");

    exit();
}

if($target eq 'install') {
    print "Install phase: \n";
    $prefix="$ENV{X11_PREFIX}";
    sys_print("mkdir $ENV{DSTROOT}") unless -e $ENV{DSTROOT};
    sys_print("mkdir $ENV{OBJROOT}") unless -e $ENV{OBJROOT};

# Must create local aclocal dir or aclocal fails
    $ACLOCAL_LOCALDIR="$ENV{DSTROOT}$prefix/share/aclocal";
    system "mkdir -p $ACLOCAL_LOCALDIR";
        
# The following is required to make aclocal find our .m4 macros
    $ENV{ACLOCAL}="aclocal -I $ACLOCAL_LOCALDIR -I $prefix/share/aclocal -I/usr/local/share/aclocal";
    $ENV{LIBTOOLIZE}="/usr/bin/glibtoolize";

# The following is required to make pkg-config find our .pc metadata files
    $ENV{PKG_CONFIG_PATH}="$ENV{DSTROOT}$prefix/share/pkgconfig:$ENV{DSTROOT}$prefix/lib/pkgconfig:$prefix/share/pkgconfig:$prefix/lib/pkgconfig:/usr/share/pkgconfig:/usr/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}";

# Set the library path so that locally built libs will be found by apps
    $ENV{LD_LIBRARY_PATH}="$prefix/lib:$ENV{LD_LIBRARY_PATH}";
    
    $ENV{PATH}="$prefix/bin:$ENV{PATH}";
    
    # Set the default font path for xserver/xorg unless it's already set
    $ENV{FONTPATH}="$prefix/share/fonts/misc/,$prefix/share/fonts/TTF/,$prefix/share/fonts/OTF,$prefix/share/fonts/Type1/,$prefix/share/fonts/75dpi/:unscaled,$prefix/share/fonts/100dpi/:unscaled,$prefix/share/fonts/75dpi/,$prefix/share/fonts/100dpi/,/Library/Fonts,/System/Library/Fonts";
    
    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{RC_Project_Source_Version}=0 unless exists $ENV{RC_Project_Source_Version};
    sys_print("ditto $ENV{SRCROOT}/ $ENV{OBJROOT}");

    $ENV{CPPFLAGS}="-DNO_ALLOCA -D__DEBUG__ -D_FORTIFY_SOURCE=2 -DFAIL_HARD";

    if($ENV{MACOSFORGE_RELEASE} eq "YES") {
        print "Building sparkle\n";

        chdir("$ENV{OBJROOT}/Sparkle/sparkle.git");

        $ENV{CFLAGS}="-Wall -Wformat=2 -ggdb3 -pipe -Os $arch_flags_exec";
        $ENV{OBJCFLAGS}="$ENV{CFLAGS}";
        $ENV{LDFLAGS}="-L$ENV{DSTROOT}$prefix/lib -L$prefix/lib -pipe $arch_flags_exec";

        sys_print("xcodebuild -project Sparkle.xcodeproj -configuration Release ARCHS='$ENV{RC_ARCHS}' SDKROOT='$ENV{SDKROOT}' DSTROOT='$ENV{DSTROOT}' INSTALL_PATH='$ENV{X11_APP}/Contents/Frameworks' install");
        sys_print("mkdir $ENV{DSTROOT}$ENV{X11_APP}/Contents/Resources");
        sys_print("cp $ENV{OBJROOT}/Resources/sparkle.pem $ENV{DSTROOT}$ENV{X11_APP}/Contents/Resources");

        sys_print("install_name_tool -id \@executable_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle $ENV{DSTROOT}$ENV{X11_APP}/Contents/Frameworks/Sparkle.framework/Versions/A/Sparkle");
    }

    $ENV{CC}="gcc" if ($ENV{CC} eq '');
    $ENV{CC}="$ENV{CC} -I$ENV{DSTROOT}$prefix/include";
    $ENV{CFLAGS}="-Wall -Wformat=2 -ggdb3 -pipe -Os $arch_flags_exec";
    $ENV{OBJCFLAGS}="$ENV{CFLAGS}";
    $ENV{LDFLAGS}="-L$ENV{DSTROOT}$prefix/lib -L$prefix/lib -pipe $arch_flags_exec";

    chdir("$ENV{OBJROOT}/kdrive/xorg-server-1.6.5-apple3");
    print "Building Xephyr, Xfake, Xnest, and Xvfb\n";

    sys_print("autoreconf -fvi");

    $conf_flags="--disable-dri --disable-glx --disable-shave --disable-dependency-tracking --disable-nls --with-fontdir=$prefix/share/fonts --with-default-font-path='$ENV{FONTPATH}' --prefix=$prefix --disable-xquartz --enable-kdrive --enable-xfake --enable-xephyr --disable-sdl --enable-xnest --enable-xvfb --disable-specs --disable-devel-docs --disable-docs";
    # TODO: dtrace in the other DDXs
    $conf_flags="$conf_flags --without-dtrace";
    sys_print( "./configure $conf_flags");
    print "building\n";
    sys_print("make V=1 -j".`sysctl -n hw.activecpu`);
    chdir("hw");
    sys_print("make install DESTDIR=$ENV{DSTROOT}");

    chdir("$ENV{OBJROOT}/Xquartz/xorg-server-1.10.6");
    print "Building Xquartz\n";

    sys_print("autoreconf -fvi");

    $conf_flags="--disable-shave --disable-dependency-tracking --disable-nls --enable-xcsecurity --enable-record --with-fontdir=$prefix/share/fonts --with-default-font-path='$ENV{FONTPATH}' --prefix=$prefix --with-launchd-id-prefix=$ENV{X11_BUNDLE_ID_PREFIX} --with-apple-application-name=$ENV{X11_APP_NAME} --with-apple-applications-dir=$ENV{X11_APP_DIR}";
    if($ENV{MACOSFORGE_LEO} eq "YES") {
        $conf_flags="$conf_flags --without-dtrace";
    }
    if($ENV{MACOSFORGE_RELEASE} eq "YES") {
        $conf_flags="$conf_flags --enable-sparkle";

        $ENV{CFLAGS}="$ENV{CFLAGS} -F$ENV{DSTROOT}$ENV{X11_APP}/Contents/Frameworks";
        $ENV{OBJCFLAGS}="$ENV{OBJCFLAGS} -F$ENV{DSTROOT}$ENV{X11_APP}/Contents/Frameworks";
        $ENV{LDFLAGS}="$ENV{LDFLAGS} -F$ENV{DSTROOT}$ENV{X11_APP}/Contents/Frameworks";
 
        if($ENV{MACOSFORGE_BUILD_DOCS} ne "YES") {
            $conf_flags .= " --disable-specs --disable-devel-docs --disable-docs ";
        }
    } else {
        $conf_flags .= " --disable-specs --disable-devel-docs --disable-docs ";
    }

    sys_print( "./configure $conf_flags");
    print "building\n";
    sys_print("make V=1 -j".`sysctl -n hw.activecpu`);
    sys_print("make install DESTDIR=$ENV{DSTROOT}");

    if($ENV{MACOSFORGE_RELEASE} ne "YES") {
        chdir("$ENV{DSTROOT}$ENV{X11_APP}/Contents/Resources");
        foreach $locale_dir (glob('*.lproj')) {
            #next if $locale_dir =~ /English.lproj/;
            sys_print("rm -rf ./$locale_dir");
        }
        sys_print("ditto $ENV{OBJROOT}/Resources/English.lproj $ENV{DSTROOT}$ENV{X11_APP}/Contents/Resources/English.lproj");
        sys_print("cp $ENV{OBJROOT}/Resources/X11.icns $ENV{DSTROOT}$ENV{X11_APP}/Contents/Resources");
    }

    chdir("$ENV{OBJROOT}/xinit/xinit-1.3.0");
    print "Building xinit\n";

    sys_print("autoreconf -fvi");

    $conf_flags="--enable-debug --disable-dependency-tracking --disable-nls --with-xinit=$prefix/bin/xinit --prefix=$prefix --with-launchagents-dir=$ENV{LAUNCHD_PREFIX}/LaunchAgents --with-launchdaemons-dir=$ENV{LAUNCHD_PREFIX}/LaunchDaemons --with-launchd-id-prefix=$ENV{X11_BUNDLE_ID_PREFIX}";
    sys_print( "./configure $conf_flags");
    print "building\n";
    sys_print("make -j".`sysctl -n hw.activecpu`);
    sys_print("make install DESTDIR=$ENV{DSTROOT}");

    chdir("../..");

    sys_print("mkdir $ENV{DSTROOT}$prefix/lib/X11/xinit/xinitrc.d");
    foreach $file (glob('xinitrc.d/*.sh')) {
        sys_print("sed 's:__PREFIX__:".$prefix.":g' ".$file." > $ENV{DSTROOT}$prefix/lib/X11/xinit/".$file);
    }
    sys_print("chown -R root:wheel $ENV{DSTROOT}$prefix/lib/X11/xinit");
    sys_print("chmod 755 $ENV{DSTROOT}$prefix/lib/X11/xinit/xinitrc.d/*");

    sys_print_nodie("ln -s Xquartz $ENV{DSTROOT}$prefix/bin/X");
    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('*')) {
	return $_ if(-e "$_/configure");
    }
    die "Unable to determine workdir";
}

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 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;
}

sub lipoexec {
    $fname=shift;
    if($ENV{MACOSFORGE_LEO} 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");
    }
}