File: Torpm.pm

package info (click to toggle)
alien 6.54
  • links: PTS
  • area: main
  • in suites: potato
  • size: 364 kB
  • ctags: 62
  • sloc: perl: 974; makefile: 117; sh: 8
file content (138 lines) | stat: -rw-r--r-- 4,013 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/perl
#
# Package for converting to .rpm file.

package To::rpm;

use strict;

# Mangle the fields to make rpm happy with them.
sub FixFields { my ($self,%fields)=@_;
  # Make sure the version has no dashes in it.
	$fields{VERSION} =~ tr/-/_/;

	# Fix up the scripts. Since debian/slackware scripts can be anything, even
	# perl programs or binary files, and redhat is limited to only shell scripts,
	# we need to encode the files and add a scrap of shell script to make it 
	# unextract and run on the fly.
	my $field;
	foreach $field ('POSTINST', 'POSTRM', 'PREINST', 'PRERM') {
		if ($fields{$field}) {
			$fields{$field}=
				"set -e\n".
				"mkdir /tmp/alien.\$\$\n".
				qq{perl -pe '\$_=unpack("u",\$_)' << '__EOF__' > /tmp/alien.\$\$/script\n}.
				pack("u",$fields{$field}).
				"__EOF__\n".
				"chmod 755 /tmp/alien.\$\$/script\n".
				"/tmp/alien.\$\$/script \"\$@\"\n".
				"rm -f /tmp/alien.\$\$/script\n".
				"rmdir /tmp/alien.\$\$";
		}
	}

	return %fields;
}

# Generate the spec file.
sub Convert { my ($self,$workdir,$nopatch,%fields)=@_;
	Alien::Status("Automatic spec file generation");

	# Create some more fields we will need.
	my $pwd=`pwd`;
	chomp $pwd;
	$fields{BUILDROOT}="$pwd/$workdir"; # must be absolute filename.

	# Remove directories from the filelist. Place %config in front of files 
	# that are conffiles.
	my @conffiles=split(/\n/,$fields{CONFFILES});
	my $filelist;
	my $fn;
	foreach $fn (split(/\n/,$fields{FILELIST})) {
		if ($fn=~m:/$: eq undef) { # not a directory
			if (grep(m:^\Q$fn\E$:,@conffiles)) { # it's a conffile
				$filelist.="%config $fn\n";
			}
			else { # normal file
				$filelist.="$fn\n";
			}
		}
	}
	$fields{FILELIST}=$filelist;

	Alien::FillOutTemplate("$main::libdir/to-$main::desttype/$main::filetype/spec",
		"$workdir/$fields{NAME}-$fields{VERSION}-$fields{RELEASE}.spec",%fields);

	if ($main::generate) {
		print "Directory $workdir prepared.\n";
	}
}

# Passed the available info about the package in a hash, return the name of
# the rpm package that will be made.
sub GetPackageName { my ($self,%fields)=@_;

	# Ask rpm how it's set up. We want to know what architecture it will output,
	# and where it will place rpms.
	my ($rpmarch, $rpmdir);
	foreach (`rpm --showrc`) {
		chomp;
		if (/^build arch\s+:\s(.*)$/) {
			$rpmarch=$1;
		}
		elsif (/^rpmdir\s+:\s(.*)$/) {
			$rpmdir=$1;
		}
	}
	if (!$rpmarch) {
		Alien::Error("rpm --showrc failed.");
	}

	# Debian's "all" architecture is a special case, and the output rpm
	# will be a noarch rpm.
	if ($fields{ARCH} eq 'all') { $rpmarch='noarch' }

	if (! $rpmdir) {
		# Presumably we're delaing with rpm 3.0 or above, which
		# doesn't output rpmdir in any format I'd care to try to parse.
		# Instead, rpm is now of a late enough version to notice the
		# %define's in the spec file, that will make the file end up in
		# the directory we started in.
		return "$fields{NAME}-$fields{VERSION}-$fields{RELEASE}.$rpmarch.rpm";
	}
	else {
		# Old rpm.
		return "$rpmdir/$rpmarch/$fields{NAME}-$fields{VERSION}-$fields{RELEASE}.$rpmarch.rpm";
	}
}

# Build a rpm file.
sub Build { my ($self,%fields)=@_;
		# Debian's "all" architecture is a special case where we make noarch rpms.
		my $buildarch;
		if ($fields{ARCH} eq 'all') {
			# Nasty version check in here because rpm gratuitously
			# changed this option at version 3.0.
			my $lc_all=$ENV{LC_ALL};
			$ENV{LC_ALL}='C';
			my $version=`rpm --version`;
			$ENV{LC_ALL}=$lc_all; # important to reset it.
			my $minor;
			($version,$minor)=$version=~m/version (\d+).(\d+)/;
			if ($version >= 3 || ($version eq 2 && $minor >= 92)) {
				$buildarch="--target noarch";
			}
			else {
				$buildarch="--buildarch noarch"
			}
		}
		Alien::SafeSystem("rpm $buildarch -bb $ENV{RPMBUILDOPT} $fields{NAME}-$fields{VERSION}-$fields{RELEASE}.spec",
			"Error putting together the RPM package.\n");
}

# Install the passed rpm file.
sub Install { my ($self,$package)=@_;
	Alien::SafeSystem("rpm -ivh $ENV{RPMINSTALLOPT} $package");
}

1