X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=OSX%2Fupdate-info-plist.pl;h=3e0fb8f5ee703f905c1e371d82e4e563b4eb3951;hb=HEAD;hp=2b7968c320cb3b7691e1e5c464f70ee11a349cd6;hpb=aa75c7476aeaa84cf3abc192b376a8b03c325213;p=xscreensaver diff --git a/OSX/update-info-plist.pl b/OSX/update-info-plist.pl index 2b7968c3..ccb86a2c 100755 --- a/OSX/update-info-plist.pl +++ b/OSX/update-info-plist.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# Copyright © 2006-2016 Jamie Zawinski +# Copyright © 2006-2023 Jamie Zawinski # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -27,7 +27,7 @@ use IO::Compress::Gzip qw(gzip $GzipError); my ($exec_dir, $progname) = ($0 =~ m@^(.*?)/([^/]+)$@); -my ($version) = ('$Revision: 1.45 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.58 $' =~ m/\s(\d[.\d]+)\s/s); $ENV{PATH} = "/usr/local/bin:$ENV{PATH}"; # for seticon $ENV{PATH} = "/opt/local/bin:$ENV{PATH}"; # for macports wget @@ -96,8 +96,10 @@ sub read_saver_xml($) { my $name = $1; return () if ($name eq 'XScreenSaver'); + return () if ($name eq 'XScreenSaver-tvOS'); return () if ($name eq 'SaverTester'); return () if ($name eq 'XScreenSaverUpdater'); + return () if ($name eq 'RandomXScreenSaver'); my $file = "$app_dir/Contents/Resources/" . lc($name) . ".xml"; my $file2 = "$app_dir/" . lc($name) . ".xml"; @@ -232,6 +234,18 @@ sub update_saver_xml($$) { # so we convert these to UTF8 when embedding them in the .saver bundle. $body =~ s@encoding="ISO-8859-1"@encoding="UTF-8"@gsi; + # Make sure "xscreensaver-text" is included if and only if the XML + # contains "". + # + my $text_p = ($body =~ m/ 1); } else { @@ -253,7 +267,7 @@ sub update_saver_xml($$) { print STDERR "$progname: wrote $filename\n" if ($verbose); } - return ($desc1, $desc2); + return ($desc1, $desc2, $name); } @@ -330,75 +344,36 @@ sub set_icon($) { sub set_thumb($) { my ($app_dir) = @_; + error ("$app_dir: no name") + unless ($app_dir =~ m@/([^/.]+).(app|saver)/?$@x); + my $name = $1; + my $oname = $name; + return unless ($app_dir =~ m@\.saver/?$@s); - my $name = $app_dir; + $name = $app_dir; $name =~ s@^.*/@@s; $name =~ s@\..*?$@@s; $name = lc($name); - $name = 'rd-bomb' if ($name eq 'rdbomb'); # sigh + my $src = "$thumbdir/$name.png"; - if (! -f "$thumbdir/$name.png") { - system ("make", "$thumbdir/$name.png"); + if (! -f $src) { + print STDERR "$progname: exec: make \"$src\"\n" if ($verbose); + system ("make", $src); my $exit = $? >> 8; exit ($exit) if $exit; error ("unable to download $name.png") - unless (-f "$thumbdir/$name.png"); + unless (-f $src); } $app_dir =~ s@/+$@@s; $app_dir .= "/Contents/Resources"; - error ("$app_dir does not exist") unless (-d $app_dir); - - system ("cp", "-p", "$thumbdir/$name.png", "$app_dir/thumbnail.png"); - my $exit = $? >> 8; - exit ($exit) if $exit; -} - - -sub enable_gc($) { - my ($app_dir) = @_; - - return unless ($app_dir =~ m@\.saver/?$@s); - my ($dir, $name) = ($app_dir =~ m@^(.*)/([^/]+)\.saver$@s); - error ("unparsable: $app_dir") unless $name; - my $exe = "$app_dir/Contents/MacOS/$name"; - my @cmd = ("$dir/enable_gc", $exe); - print STDERR "$progname: exec: " . join(' ', @cmd) . "\n" - if ($verbose > 1); - system (@cmd); - my $exit = $? >> 8; - exit ($exit) if $exit; -} - - -sub fix_coretext($) { - my ($app_dir) = @_; - - # In MacOS 10.8, they moved CoreText.framework from - # /System/Library/Frameworks/ApplicationServices.framework/Frameworks/ - # to /System/Library/Frameworks/ which means that executables compiled - # on 10.8 and newer won't run on 10.7 and older because they can't find - # the library. Fortunately, 10.8 and later leave a symlink behind, so - # the old location still works. So we need our executables to contain - # an LC_LOAD_DYLIB pointing at the old directory instead of the new - # one. - # - return if ($app_dir =~ m@-iphone@s); - my ($dir, $name) = ($app_dir =~ m@^(.*)/([^/]+)\.(app|saver)$@s); - error ("unparsable: $app_dir") unless $name; - my $exe = "$app_dir/Contents/MacOS/$name"; - - my $new = ("/System/Library/Frameworks/CoreText.framework/" . - "Versions/A/CoreText"); - my $old = ("/System/Library/Frameworks/ApplicationServices.framework/" . - "Frameworks/CoreText.framework/Versions/A/CoreText"); - my @cmd = ("install_name_tool", "-change", $new, $old, $exe); + if (! -d $app_dir) { + mkdir ($app_dir) || error ("mkdir: $app_dir: $!"); + } - print STDERR "$progname: exec: " . join(' ', @cmd) . "\n" - if ($verbose > 1); - system (@cmd); + system ("cp", "-p", $src, "$app_dir/thumbnail.png"); my $exit = $? >> 8; exit ($exit) if $exit; } @@ -418,33 +393,45 @@ sub update($) { unless ($plist =~ m@CFBundleShortVersionString\s* ([^<>]+)@sx); my $vers = $1; - my ($ignore, $info_str) = update_saver_xml ($app_dir, $vers); + my ($ignore, $info_str, $name) = update_saver_xml ($app_dir, $vers); # No, don't do this -- the iOS version reads the XML file in a few # different places, and most of those places don't understand gzip. if ($app_name eq 'XScreenSaver') { compress_all_xml_files ($app_dir); - } elsif (! defined($info_str)) { - print STDERR "$progname: $filename: no XML file\n" if ($verbose > 1); } else { - $info_str =~ m@^([^\n]+)\n@s || - error ("$filename: unparsable copyright"); - my $copyright = "$1"; - $copyright =~ s/\b\d{4}-(\d{4})\b/$1/; + $plist = set_plist_key ($filename, $plist, + "CFBundleIdentifier", + "org.jwz.xscreensaver." . $app_name); - # Lose the Wikipedia URLs. - $info_str =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm; + error ("$filename: no bundle identifier") + unless ($plist =~ m@>CFBundleIdentifier\s*[^<>]*@s); - $info_str =~ s/(\n\n)\n+/$1/gs; - $info_str =~ s/(^\s+|\s+$)//gs; - $plist = set_plist_key ($filename, $plist, - "NSHumanReadableCopyright", $copyright); - $plist = set_plist_key ($filename, $plist, - "CFBundleLongVersionString",$copyright); - $plist = set_plist_key ($filename, $plist, - "CFBundleGetInfoString", $info_str); + if (!defined($info_str)) { + print STDERR "$progname: $filename: no XML file\n" if ($verbose > 1); + } else { + $info_str =~ m@^([^\n]+)\n@s || + error ("$filename: unparsable copyright"); + my $copyright = "$1"; + $copyright =~ s/\b\d{4}-(\d{4})\b/$1/; + + # Lose the Wikipedia URLs. + $info_str =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm; + + $info_str =~ s/(\n\n)\n+/$1/gs; + $info_str =~ s/(^\s+|\s+$)//gs; + $plist = set_plist_key ($filename, $plist, + "NSHumanReadableCopyright", $copyright); + $plist = set_plist_key ($filename, $plist, + "CFBundleLongVersionString",$copyright); + $plist = set_plist_key ($filename, $plist, + "CFBundleGetInfoString", $info_str); + + $plist = set_plist_key ($filename, $plist, "CFBundleName", $name) + unless ($app_name eq $name); # Some names contain spaces. + } if ($oplist eq $plist) { print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1); @@ -463,10 +450,11 @@ sub update($) { } } - set_icon ($app_dir); + # MacOS 10.12: codesign says "resource fork, Finder information, or + # similar detritus not allowed" if any bundle has an Icon\r file. + # set_icon ($app_dir); + set_thumb ($app_dir); -# enable_gc ($app_dir); - fix_coretext ($app_dir) }