From 3977d73fe232bfe2529ce99bb7237ed8ddf116e5 Mon Sep 17 00:00:00 2001 From: "blizzard%redhat.com" Date: Sat, 18 Dec 1999 04:37:50 +0000 Subject: [PATCH] add perl script and spec file generation for building an rpm spec file from the packages-unix file git-svn-id: svn://10.0.0.236/trunk@56182 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xpinstall/packager/unix/genSpecFile.pl | 444 ++++++++++++++++++ .../xpinstall/packager/unix/mozilla.spec.in | 37 ++ 2 files changed, 481 insertions(+) create mode 100755 mozilla/xpinstall/packager/unix/genSpecFile.pl create mode 100644 mozilla/xpinstall/packager/unix/mozilla.spec.in diff --git a/mozilla/xpinstall/packager/unix/genSpecFile.pl b/mozilla/xpinstall/packager/unix/genSpecFile.pl new file mode 100755 index 00000000000..2b62f2876f2 --- /dev/null +++ b/mozilla/xpinstall/packager/unix/genSpecFile.pl @@ -0,0 +1,444 @@ +#!/usr/bin/perl +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla Communicator client code, released +# March 31, 1998. +# +# The Initial Developer of the Original Code is Christopher Blizzard. +# Portions created by Christopher Blizzard are Copyright (C) 1998-1999 +# Christopher Blizzard. All Rights Reserved. +# +# Contributor(s): +# Christopher Blizzard (blizzard@mozilla.org) + +use strict; +use Data::Dumper; + +my $package_file = '../packages-unix'; +my $spec_in_file = 'mozilla.spec.in'; +my $output; + +my $packages = parse_package_file($package_file); + +open (FILE, $spec_in_file) || die("Failed to open file " . $spec_in_file . ": $!\n"); + +while () { + if (/PACKAGE_LISTING/) + { + $output .= print_package_desc($packages); + } + elsif (/FILE_LISTING/) + { + $output .= print_package_list($packages); + } + elsif (/PACKAGE_INSTALL/) + { + $output .= print_package_install($packages); + } + else + { + $output .= $_; + } +} + +print $output; + +sub print_package_desc +{ + my $modules = shift; + my $this_key; + my $retval; + + my $default_desc = { 'browser' => 'Mozilla browser', + 'installer' => 'Mozilla XP installer', + 'mail' => 'Mozilla Mail/News' }; + + foreach $this_key (keys %{$modules}) + { + $retval .= '%package mozilla-' . $this_key . "\n"; + $retval .= 'Summary: mozilla-' . $this_key . "\n"; + $retval .= "Group: Mozilla\n"; + } + + foreach $this_key (keys %{$modules}) + { + $retval .= '%description mozilla-' . $this_key . "\n"; + $retval .= $default_desc->{$this_key} . "\n"; + } + return $retval; +} + +sub print_package_list +{ + my $modules = shift; + my $retval; + my $this_key; + + foreach $this_key (keys %{$modules}) { + my $list = $modules->{$this_key}; + my $len = scalar @{$list}; + my $i; + $retval .= '%files mozilla-' . $this_key . "\n"; + for ($i = 0; $i < $len; $i++) { + my $this_item = $list->[$i]; + my $dirname; + chomp $this_item; + if (is_component_library($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/lib/mozilla/' . $this_item . "\n"; + } + elsif (is_component_xpt($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/lib/mozilla/' . $this_item . "\n"; + } + elsif (is_component_js($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/lib/mozilla/' . $this_item . "\n"; + } + elsif (is_library($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/lib/' . $this_item . "\n"; + } + elsif (is_binary($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/bin/' . $this_item . "\n"; + } + elsif ($dirname = is_default($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/share/mozilla/' . $this_item . "\n"; + } + elsif ($dirname = is_chrome_wildcard($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/share/mozilla/chrome/' . $dirname . "\n"; + } + elsif ($dirname = is_res_wildcard($this_item)) { + $this_item = strip_bin($this_item); + $this_item = strip_res($this_item); + $retval .= '%{prefix}/share/mozilla/resources/' . $dirname . "/\n"; + } + elsif (is_res($this_item)) { + $this_item = strip_bin($this_item); + $this_item = strip_res($this_item); + $retval .= '%{prefix}/share/mozilla/resources/' . $this_item . "\n"; + } + elsif ($dirname = is_res_file_in_dir($this_item)) { + $this_item = strip_bin($this_item); + $this_item = strip_res($this_item); + $retval .= '%{prefix}/share/mozilla/resources/' . $this_item . "\n"; + } + elsif ($dirname = is_dir_wildcard($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/lib/mozilla/' . $dirname . "/\n"; + } + elsif (is_base_chrome($this_item)) { + $this_item = strip_bin($this_item); + $retval .= '%{prefix}/share/mozilla/' . $this_item . "\n"; + } + elsif (is_removed($this_item)) { + # nada. + } + else { + print STDERR "Warning: print_package_list $this_item is not valid\n"; + } + } + } + return $retval; +} + +sub print_package_install +{ + my $modules = shift; + my $retval; + my $this_key; + my $src = "dist/"; + my @list; + + $retval .= q( +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/chrome +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/html +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/entityTables +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/rdf +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/throbber +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/toolbar +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/xpinstall +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/defaults +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/defaults/pref +mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/mozilla/defaults/profile +mkdir -p $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/components +mkdir -p $RPM_BUILD_ROOT/%{prefix}/include/mozilla +mkdir -p $RPM_BUILD_ROOT/%{prefix}/include/mozilla/idl +ln -s ../../share/mozilla/chrome $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/chrome +ln -s ../../share/mozilla/resources $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/resources +ln -s ../../share/mozilla/defaults $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/defaults +mkdir -p $RPM_BUILD_ROOT/%{prefix}/lib +mkdir -p $RPM_BUILD_ROOT/%{prefix}/bin +); + + foreach $this_key (keys %{$modules}) { + my $list = $modules->{$this_key}; + my $len = scalar @{$list}; + my $i; + for ($i = 0; $i < $len; $i++) { + my $this_item = $list->[$i]; + my $dirname; + chomp $this_item; + if (is_component_library($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/components' . "\n"; + } + elsif (is_component_xpt($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/components' . "\n"; + } + elsif (is_component_js($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/components' . "\n"; + } + elsif (is_library($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/lib/' . "\n"; + } + elsif (is_binary($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/bin/' . "\n"; + } + elsif ($dirname = is_default($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/share/mozilla/defaults/' . $dirname . "/" . "\n"; + } + elsif ($dirname = is_chrome_wildcard($this_item)) { + $retval .= 'if [ ! -d $RPM_BUILD_ROOT/%{prefix}/share/mozilla/chrome/' . $dirname . " ]; then\n\t"; + $retval .= 'mkdir $RPM_BUILD_ROOT/%{prefix}/share/mozilla/chrome/' . $dirname; + $retval .= "\nfi\n"; + $retval .= "cp -r " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/share/mozilla/chrome/' . $dirname . "/" . "\n"; + } + elsif ($dirname = is_res_wildcard($this_item)) { + $retval .= "cp -r " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/' . $dirname . "/" . "\n"; + } + elsif (is_res($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/' . "\n"; + } + elsif ($dirname = is_res_file_in_dir($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/share/mozilla/resources/' . $dirname . "/" . "\n"; + } + elsif ($dirname = is_dir_wildcard($this_item)) { + $retval .= 'if [ -e ' . $src . $this_item . " ]; then\n\t"; + $retval .= "cp -r " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/lib/mozilla/' . $dirname . "/" . "\n"; + $retval .= "\nfi\n"; + } + elsif (is_base_chrome($this_item)) { + $retval .= "cp " . $src . $this_item . ' $RPM_BUILD_ROOT/%{prefix}/share/mozilla/chrome/' . "\n"; + } + elsif (is_removed($this_item)) { + # nada. + } + else { + print STDERR "Warning: print_package_install $this_item is not valid\n"; + } + } + } + return $retval; +} + +sub strip_bin +{ + my $file = shift; + $file =~ s/^bin\///; + return $file; +} + +sub strip_res +{ + my $file = shift; + $file =~ s/^res\///; + return $file; +} + +sub is_removed +{ + my $file = shift; + if ($file =~ /^-/) { return 1; } + else { return 0; } +} + + +sub is_default +{ + my $file = shift; + my $dirname; + if (($dirname) = $file =~ /^bin\/defaults\/([a-zA-Z-\.]+)\/.*/) + { + return $dirname; + } + else + { + return 0; + } +} + +sub is_chrome_wildcard +{ + my $file = shift; + my $dirname; + if (($dirname) = $file =~ /^bin\/chrome\/([\w\/-]+)\/\*$/) + { + return $dirname; + } + else + { + return 0; + } +} + +sub is_dir_wildcard +{ + my $file = shift; + my $dirname; + if (($dirname) = $file =~ /^bin\/([a-zA-Z-\.]+)\/\*/) + { + return $dirname; + } + else + { + return 0; + } +} + +sub is_res_file_in_dir +{ + my $file = shift; + my $dirname; + if (($dirname) = $file =~ /^bin\/res\/([a-zA-Z-\.]+)\/[a-zA-Z-\.]+$/) { return $dirname; } + return 0; +} + +sub is_res +{ + my $file = shift; + if ($file =~ /^bin\/res\/[a-zA-Z-\.]+$/) { return 1; } + else { return 0; } + +} + +sub is_res_wildcard +{ + my $file = shift; + my $dirname; + if (($dirname) = $file =~ /^bin\/res\/([a-zA-Z-\.]+)\/\*/) + { + return $dirname; + } + else + { + return 0; + } +} + +sub is_base_chrome +{ + my $file = shift; + if ($file =~ /^bin\/chrome\/[a-zA-Z-\.]+$/) { return 1; } + else { return 0; } +} + +sub is_component_library +{ + my $file = shift; + if ($file =~ /components.*so$/) { return 1; } + else { return 0; } +} + +sub is_component_xpt +{ + my $file = shift; + if ($file =~ /components.*xpt$/) { return 1; } + else { return 0; } +} + +sub is_component_js +{ + my $file = shift; + if ($file =~ /components.*js$/) { return 1; } + else { return 0; } +} + +sub is_library +{ + my $file = shift; + if ( $file =~ /.*so$/ ) { return 1; } + else { return 0; } +} + +sub is_binary +{ + my $file = shift; + if ($file =~ /^bin\/[a-zA-Z-\.]+$/) { return 1; } + else { return 0; } +} + +# this function will parse the package file and return a dictionary +# that has the package names as the keys and the +# file list. +sub parse_package_file +{ + my $package_file = shift; + my $retval = {}; + my $lineno = 0; + my $debug = 0; + my $component = ""; + + if (!$package_file) + { + die("parse_package_file called without package file name."); + } + open (FILE, "$package_file") || die("Failed to open file " . $package_file . ": $!\n"); + + LINE: + while () + { + $lineno++; + my $line; + + s/\;.*//; # it's a comment, kill it. + s/^\s+//; # nuke leading whitespace + s/\s+$//; # nuke trailing whitespace + + ($debug >= 2) && print "\n"; + ($debug >= 8) && print "line $lineno:$_\n"; + + # it's a blank line, skip it. + /^$/ && do { + ($debug >= 10) && print "blank line.\n"; + next LINE; + }; + + # it's a new component + /^\[/ && do { + ( $component ) = /^\[(.*)\]$/; + ($debug >= 10) && print "component.\n"; + $retval->{$component} = (); + next LINE; + }; + + # make sure a component is defined before doing any copies or deletes. + ( $component eq "" ) && + die "Error: item $_ outside a component ($lineno). Exiting...\n"; + + $line = $_; + + if ($debug >= 10) + { + print "adding $line to $component\n"; + } + + push(@{$retval->{$component}}, $line); + + } # LINE + close (FILE); + return $retval; +} + diff --git a/mozilla/xpinstall/packager/unix/mozilla.spec.in b/mozilla/xpinstall/packager/unix/mozilla.spec.in new file mode 100644 index 00000000000..23866a064b4 --- /dev/null +++ b/mozilla/xpinstall/packager/unix/mozilla.spec.in @@ -0,0 +1,37 @@ +Name: mozilla +Summary: Mozilla +Version: 5.0 +Release: M12 +Serial: 0 +Copyright: MPL/NPL +Source0: mozilla-m12.tar.gz +Buildroot: /var/tmp/mozilla-root +Prefix: /usr +Group: Mozilla + +%description +This is Mozilla. + + +PACKAGE_LISTING + +%prep + +%setup -n mozilla +./configure + +%install +export NSDISTMODE=copy +make + +PACKAGE_INSTALL + +%clean +rm -rf $RPM_BUILD_ROOT + +FILE_LISTING + + + + +