#!/usr/bin/perl $ENV{X11_PREFIX}="/usr/X11" if ($ENV{X11_PREFIX} eq ''); $ENV{CC}="gcc" if ($ENV{CC} eq ''); $ENV{CC_BASE}=$ENV{CC}; $prefix=$ENV{X11_PREFIX}; $target=shift @ARGV; $ENV{DESTDIR}=$ENV{DSTROOT}; $ENV{LD_LIBRARY_PATH}="$prefix/lib:$ENV{LD_LIBRARY_PATH}" unless $ENV{LD_LIBRARY_PATH} =~ /$prefix/; $ENV{PATH}="$ENV{DSTROOT}$prefix/bin:$prefix/bin:$ENV{PATH}" unless $ENV{PATH} =~ /$prefix/; $ENV{FREETYPE_LIBS}="-L$prefix/lib -lfreetype -lz -Xlinker -framework -Xlinker CoreServices -Xlinker -framework -Xlinker ApplicationServices"; $ENV{PKG_CONFIG_PATH}="$ENV{DSTROOT}$prefix/share/pkgconfig:$ENV{DSTROOT}$prefix/lib/pkgconfig:$prefix/share/pkgconfig:$prefix/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}"; 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"); exit(); } if($target eq 'install') { # 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"; print "Install phase: \n"; print "SRCROOT = $ENV{SRCROOT}\n"; print "DSTROOT = $ENV{DSTROOT}\n"; print "OBJROOT = $ENV{OBJROOT}/\n"; print "SYMROOT = $ENV{SYMROOT}\n"; sys_print("ditto $ENV{SRCROOT} $ENV{OBJROOT}"); # All fonts require mkfontscale and mkfontdir to be available # # The following fonts require bdftopcf to be available: # adobe-100dpi, adobe-75dpi, adobe-utopia-100dpi, adobe-utopia-75dpi, # arabic-misc, bh-100dpi, bh-75dpi, bh-lucidatypewriter-100dpi, # bh-lucidatypewriter-75dpi, bitstream-100dpi, bitstream-75dpi, # cronyx-cyrillic, cursor-misc, daewoo-misc, dec-misc, isas-misc, # jis-misc, micro-misc, misc-cyrillic, misc-misc, mutt-misc, # schumacher-misc, screen-cyrillic, sony-misc, sun-misc and # winitzki-cyrillic # # Within the font module, the util component must be built before the # following fonts: # adobe-100dpi, adobe-75dpi, adobe-utopia-100dpi, adobe-utopia-75dpi, # bh-100dpi, bh-75dpi, bh-lucidatypewriter-100dpi, bh-lucidatypewriter-75dpi, # misc-misc and schumacher-misc # # The alias component is recommended to be installed after the other fonts # since the fonts.alias files reference specific fonts installed from the # other font components chdir($ENV{OBJROOT}); while() { next if /util/; next if /alias/; push @font_packages, $_; } 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/; } } set_arch_exec(); # Backwards compatible symlink for Leopard/SnowLeopard which had them in /opt/X11/lib/X11/fonts sys_print("mkdir -p $ENV{DSTROOT}/$prefix/lib/X11"); sys_print("mkdir -p $ENV{DSTROOT}/$prefix/share/fonts"); sys_print("ln -s ../../share/fonts $ENV{DSTROOT}/$prefix/lib/X11/fonts"); # Where font_cache stores its .pid file sys_print("mkdir -p $ENV{DSTROOT}/$prefix/var/run"); build("encodings"); foreach (@font_packages) { build($_); } build("font-alias"); sys_print("mkdir -p $ENV{DSTROOT}/$prefix/share/fonts/TTF"); sys_print("ditto $ENV{SRCROOT}/TTF $ENV{DSTROOT}/$prefix/share/fonts/TTF"); sys_print("chown -R root:wheel $ENV{DSTROOT}/$prefix/share/fonts/TTF"); # This isn't needed with fonts released in 2009 # sys_print("rm -rf $ENV{DSTROOT}/$prefix/var/cache/fontconfig"); sys_print("mkdir -p $ENV{DSTROOT}/$prefix/lib/X11/fontconfig/conf.avail"); sys_print("mkdir -p $ENV{DSTROOT}/$prefix/lib/X11/fontconfig/conf.d"); sys_print("install -c $ENV{SRCROOT}/fontconfig.osx-fonts.conf $ENV{DSTROOT}/$prefix/lib/X11/fontconfig/conf.avail/05-osx-fonts.conf"); sys_print("ln -s ../conf.avail/05-osx-fonts.conf $ENV{DSTROOT}/$prefix/lib/X11/fontconfig/conf.d/05-osx-fonts.conf"); sys_print("mkdir -p $ENV{DSTROOT}/$prefix/bin"); sys_print("sed 's:__PREFIX__:$prefix:' $ENV{SRCROOT}/font_cache.sh > $ENV{OBJROOT}/font_cache"); sys_print("install -c -m 755 $ENV{OBJROOT}/font_cache $ENV{DSTROOT}/$prefix/bin/font_cache"); sys_print("/Developer/Makefiles/bin/compress-man-pages.pl -d $ENV{DSTROOT}/$prefix/share/man/ man1 man2 man3 man4 man5 man6 man7 man8 man9"); make_dsyms(); } 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(); print "full_path=$full_path\n"; 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"); sys_print("rm -f m4/libtool.m4 m4/lt*.m4") if(-f "m4/libtool.m4"); sys_print("autoreconf -fvi"); print "Configuring...\n"; $conf_flags=" --prefix=$prefix --disable-static --disable-dependency-tracking --disable-nls --mandir=$prefix/share/man --cache-file=$ENV{OBJROOT}/configure.cache "; $conf_flags_path=$ENV{OBJROOT}."/$module/conf_flags"; $post_config_path=$ENV{OBJROOT}."/$module/post-config"; 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"); chdir('../..'); } sub get_workdir { system "pwd"; system "ls -l"; foreach (glob('*')) { if(-e "$_/configure") { return $_; } } die "Unable to determine workdir"; } sub set_arch_exec { $ENV{CC}="$ENV{CC_BASE} -I$ENV{DSTROOT}$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"; sys_print_nodie("rm $ENV{OBJROOT}/configure.cache"); } sub set_arch_lib { $ENV{CC}="$ENV{CC_BASE} -I$ENV{DSTROOT}$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"; 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; } sub make_dsyms { open(FIND,"find $ENV{DSTROOT} -type f -exec file {} +|"); while() { if(/(.*): .*Mach-O/) { $basename=$1; $fullpath=$1; $basename =~ s/\/.*\///; sys_print_nodie("dsymutil --out=$ENV{SYMROOT}/$basename.dSYM $fullpath"); sys_print_nodie("strip -S $fullpath"); } } close FIND; }