source: ProjectBuilder/devel/pb/lib/ProjectBuilder/Env.pm@ 540

Last change on this file since 540 was 540, checked in by Bruno Cornec, 16 years ago

Fix #32 for RPMS based packages

File size: 28.8 KB
Line 
1#!/usr/bin/perl -w
2#
3# Project Builder Env module
4# Env subroutines brought by the the Project-Builder project
5# which can be easily used by pbinit scripts
6#
7# $Id$
8#
9# Copyright B. Cornec 2007
10# Provided under the GPL v2
11
12package ProjectBuilder::Env;
13
14use strict 'vars';
15use Data::Dumper;
16use English;
17use File::Basename;
18use File::stat;
19use POSIX qw(strftime);
20use lib qw (lib);
21use ProjectBuilder::Base;
22use ProjectBuilder::Conf;
23use ProjectBuilder::CMS;
24
25# Inherit from the "Exporter" module which handles exporting functions.
26
27use Exporter;
28
29# Export, by default, all the functions into the namespace of
30# any code which uses this module.
31
32our @ISA = qw(Exporter);
33our @EXPORT = qw(pb_env_init);
34
35=pod
36
37=head1 NAME
38
39ProjectBuilder::Env, part of the project-builder.org
40
41=head1 DESCRIPTION
42
43This modules provides environment functions suitable for pbinit calls.
44
45=head1 USAGE
46
47=over 4
48
49=item B<pb_env_init>
50
51This function setup the environment for project-builder.
52The first parameter is the project if given on the command line.
53The second parameter is a flag indicating whether we should setup up the pbconf environment or not.
54The third parameter is the action passed to pb.
55It sets up environement variables (PBETC, PBPROJ, PBDEFDIR, PBBUILDDIR, PBROOTDIR, PBDESTDIR, PBCONFDIR, PBPROJVER)
56
57=cut
58
59sub pb_env_init {
60
61my $proj=shift || undef;
62my $pbinit=shift || undef;
63my $action=shift;
64my $ver;
65my $tag;
66
67$ENV{'PBETC'} = "$ENV{'HOME'}/.pbrc";
68
69# We only have one configuration file for now.
70pb_conf_add("$ENV{'PBETC'}");
71
72#
73# Check project name
74# Could be with env var PBPROJ
75# or option -p
76# if not define take the first in conf file
77#
78if ((defined $ENV{'PBPROJ'}) &&
79 (not (defined $proj))) {
80 $proj = $ENV{'PBPROJ'};
81}
82
83#
84# We get the pbconf file for that project
85# and use its content
86#
87my ($pbconf) = pb_conf_get("pbconfurl");
88pb_log(2,"DEBUG pbconfurl: ".Dumper($pbconf)."\n");
89
90my %pbconf = %$pbconf;
91if (not defined $proj) {
92 # Take the first as the default project
93 $proj = (keys %pbconf)[0];
94 if (defined $proj) {
95 pb_log(1,"WARNING: using $proj as default project as none has been specified\n");
96 pb_log(1," Please either create a pbconfurl reference for project $proj in $ENV{'PBETC'}\n");
97 pb_log(1," or call pb with the -p project option or use the env var PBPROJ\n");
98 pb_log(1," if you want to use another project\n");
99 }
100}
101die "No project defined - use env var PBPROJ or -p proj or a pbconfurl entry in $ENV{'PBETC'}" if (not (defined $proj));
102
103# That's always the environment variable that will be used
104$ENV{'PBPROJ'} = $proj;
105pb_log(2,"PBPROJ: $ENV{'PBPROJ'}\n");
106
107if (not defined ($pbconf{$ENV{'PBPROJ'}})) {
108 die "Please create a pbconfurl reference for project $ENV{'PBPROJ'} in $ENV{'PBETC'}\n";
109}
110
111# Adds a potential conf file now as it's more
112# important than the project conf file
113my ($vmpath,$vepath) = pb_conf_get("vmpath","vepath");
114pb_conf_add("$vmpath->{$ENV{'PBPROJ'}}/.pbrc") if (-f "$vmpath->{$ENV{'PBPROJ'}}/.pbrc");
115pb_conf_add("$vepath->{$ENV{'PBPROJ'}}/.pbrc") if (-f "$vepath->{$ENV{'PBPROJ'}}/.pbrc");
116
117#
118# Detect the root dir for hosting all the content generated with pb
119#
120=over 4
121
122 Tree will look like this:
123
124 maint pbdefdir PBDEFDIR dev dir (optional)
125 | |
126 ------------------------ --------------------
127 | | | |
128 pbproj1 pbproj2 PBPROJ pbproj1 pbproj2 PBPROJDIR
129 | |
130 --------------------------------------------- ----------
131 * * * | | | * *
132 tag dev pbconf ... build delivery PBCONFDIR dev tag
133 | | | PBDESTDIR |
134 --- ------ pbrc PBBUILDDIR -------
135 | | | | |
136 1.1 dev tag 1.0 1.1 PBDIR
137 |
138 -------
139 | |
140 1.0 1.1 PBROOTDIR
141 |
142 ----------------------------------
143 | | | |
144 pkg1 pbproj1.pb pbfilter pbcl
145 |
146 -----------------
147 | | |
148 rpm deb pbfilter
149
150
151 (*) By default, if no relocation in .pbrc, dev dir is taken in the maint pbdefdir (when appropriate)
152 Names under a pbproj and the corresponding pbconf should be similar
153
154=cut
155
156my ($pbdefdir) = pb_conf_get_if("pbdefdir");
157
158if (not defined $ENV{'PBDEFDIR'}) {
159 if ((not defined $pbdefdir) || (not defined $pbdefdir->{$ENV{'PBPROJ'}})) {
160 pb_log(1,"WARNING: no pbdefdir defined, using /var/cache\n");
161 pb_log(1," Please create a pbdefdir reference for project $ENV{'PBPROJ'} in $ENV{'PBETC'}\n");
162 pb_log(1," if you want to use another directory\n");
163 $ENV{'PBDEFDIR'} = "/var/cache";
164 } else {
165 # That's always the environment variable that will be used
166 $ENV{'PBDEFDIR'} = $pbdefdir->{$ENV{'PBPROJ'}};
167 }
168}
169# Expand potential env variable in it
170eval { $ENV{'PBDEFDIR'} =~ s/(\$ENV.+\})/$1/eeg };
171
172pb_log(2,"PBDEFDIR: $ENV{'PBDEFDIR'}\n");
173
174# Put under CMS the PBPROJ dir
175if (defined $pbinit) {
176 if (! -d "$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}") {
177 pb_mkdir_p("$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}") || die "Unable to recursively create $ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}";
178 }
179 pb_cms_add($pbconf{$ENV{'PBPROJ'}},"$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}");
180}
181
182#
183# Set delivery directory
184#
185$ENV{'PBDESTDIR'}="$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}/delivery";
186
187pb_log(2,"PBDESTDIR: $ENV{'PBDESTDIR'}\n");
188#
189# Removes all directory existing below the delivery dir
190# as they are temp dir only except when called from pbinit
191# Files stay and have to be cleaned up manually if needed
192# those files serves as communication channels between pb phases
193# Removing them prevents a following phase to detect what has been done before
194#
195if ((-d $ENV{'PBDESTDIR'}) && ($action !~ /pbinit/)) {
196 opendir(DIR,$ENV{'PBDESTDIR'}) || die "Unable to open directory $ENV{'PBDESTDIR'}: $!";
197 foreach my $d (readdir(DIR)) {
198 next if ($d =~ /^\./);
199 next if (-f "$ENV{'PBDESTDIR'}/$d");
200 pb_rm_rf("$ENV{'PBDESTDIR'}/$d") if (-d "$ENV{'PBDESTDIR'}/$d");
201 }
202 closedir(DIR);
203}
204if (! -d "$ENV{'PBDESTDIR'}") {
205 pb_mkdir_p($ENV{'PBDESTDIR'}) || die "Unable to recursively create $ENV{'PBDESTDIR'}";
206}
207
208#
209# Set build directory
210#
211$ENV{'PBBUILDDIR'}="$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}/build";
212if (! -d "$ENV{'PBBUILDDIR'}") {
213 pb_mkdir_p($ENV{'PBBUILDDIR'}) || die "Unable to recursively create $ENV{'PBBUILDDIR'}";
214}
215
216pb_log(2,"PBBUILDDIR: $ENV{'PBBUILDDIR'}\n");
217
218pb_temp_init();
219pb_log(2,"PBTMP: $ENV{'PBTMP'}\n");
220
221#
222# The following part is only useful when in cms2something or newsomething
223# In VMs/VEs we want to skip that by providing good env vars.
224# return values in that case are useless
225#
226if (($action =~ /^cms2/) || ($action =~ /^newver$/) || ($action =~ /pbinit/) || ($action =~ /^newproj$/) || ($action =~ /^announce/)) {
227
228 #
229 # Check pbconf cms compliance
230 #
231 pb_cms_compliant("pbconfdir",'PBCONFDIR',"$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}/pbconf",$pbconf{$ENV{'PBPROJ'}},$pbinit);
232
233 # Check where is our PBROOTDIR (release tag name can't be guessed the first time)
234 #
235 if (not defined $ENV{'PBROOTDIR'}) {
236 if (! -f ("$ENV{'PBDESTDIR'}/pbrc")) {
237 opendir(DIR,$ENV{'PBCONFDIR'}) || die "Unable to open directory $ENV{'PBCONFDIR'}: $!";
238 my $maxmtime = 0;
239 foreach my $d (readdir(DIR)) {
240 pb_log(3,"Looking at \'$d\'...");
241 next if ($d =~ /^\./);
242 next if (! -d "$ENV{'PBCONFDIR'}/$d");
243 my $s = stat("$ENV{'PBCONFDIR'}/$d");
244 next if (not defined $s);
245 pb_log(3,"KEEP\n");
246 # Keep the most recent
247 pb_log(2," $s->mtime\n");
248 if ($s->mtime > $maxmtime) {
249 $ENV{'PBROOTDIR'} = "$ENV{'PBCONFDIR'}/$d";
250 $maxmtime = $s->mtime;
251 }
252 }
253 closedir(DIR);
254 pb_log(1,"WARNING: no pbroot defined, using $ENV{'PBROOTDIR'}\n");
255 pb_log(1," Please use -r release if you want to use another release\n");
256 die "No directory found under $ENV{'PBCONFDIR'}" if (not defined $ENV{'PBROOTDIR'});
257 } else {
258 my ($pbroot) = pb_conf_read_if("$ENV{'PBDESTDIR'}/pbrc","pbroot");
259 # That's always the environment variable that will be used
260 die "Please remove inconsistent $ENV{'PBDESTDIR'}/pbrc" if ((not defined $pbroot) || (not defined $pbroot->{$ENV{'PBPROJ'}}));
261 $ENV{'PBROOTDIR'} = $pbroot->{$ENV{'PBPROJ'}};
262 }
263 } else {
264 # transform in full path if relative
265 $ENV{'PBROOTDIR'} = "$ENV{'PBCONFDIR'}/$ENV{'PBROOTDIR'}" if ($ENV{'PBROOTDIR'} !~ /^\//);
266 pb_mkdir_p($ENV{'PBROOTDIR'}) if (defined $pbinit);
267 die "$ENV{'PBROOTDIR'} is not a directory" if (not -d $ENV{'PBROOTDIR'});
268 }
269
270 # Adds that conf file to the list to consider
271 pb_conf_add("$ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb") if (-f "$ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb");
272
273 return if ($action =~ /^newver$/);
274
275 my %version = ();
276 my %defpkgdir = ();
277 my %extpkgdir = ();
278 my %filteredfiles = ();
279 my %supfiles = ();
280
281 if ((-f "$ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb") and (not defined $pbinit)) {
282
283 # List of pkg to build by default (mandatory)
284 my ($defpkgdir,$pbpackager, $pkgv, $pkgt) = pb_conf_get("defpkgdir","pbpackager","projver","projtag");
285 # List of additional pkg to build when all is called (optional)
286 # Valid version names (optional)
287 # List of files to filter (optional)
288 # Project version and tag (optional)
289 my ($extpkgdir, $version, $filteredfiles, $supfiles) = pb_conf_get_if("extpkgdir","version","filteredfiles","supfiles");
290 pb_log(2,"DEBUG: defpkgdir: ".Dumper($defpkgdir)."\n");
291 pb_log(2,"DEBUG: extpkgdir: ".Dumper($extpkgdir)."\n");
292 pb_log(2,"DEBUG: version: ".Dumper($version)."\n");
293 pb_log(2,"DEBUG: filteredfiles: ".Dumper($filteredfiles)."\n");
294 pb_log(2,"DEBUG: supfiles: ".Dumper($supfiles)."\n");
295 # Global
296 %defpkgdir = %$defpkgdir;
297 %extpkgdir = %$extpkgdir if (defined $extpkgdir);
298 %version = %$version if (defined $version);
299 %filteredfiles = %$filteredfiles if (defined $filteredfiles);
300 %supfiles = %$supfiles if (defined $supfiles);
301 #
302 # Get global Version/Tag
303 #
304 if (not defined $ENV{'PBPROJVER'}) {
305 if ((defined $pkgv) && (defined $pkgv->{$ENV{'PBPROJ'}})) {
306 $ENV{'PBPROJVER'}=$pkgv->{$ENV{'PBPROJ'}};
307 } else {
308 die "No projver found in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb";
309 }
310 }
311 die "Invalid version name $ENV{'PBPROJVER'} in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb" if (($ENV{'PBPROJVER'} !~ /[0-9.]+/) && (not defined $version) && ($ENV{'PBPROJVER'} =~ /$version{$ENV{'PBPROJ'}}/));
312
313 if (not defined $ENV{'PBPROJTAG'}) {
314 if ((defined $pkgt) && (defined $pkgt->{$ENV{'PBPROJ'}})) {
315 $ENV{'PBPROJTAG'}=$pkgt->{$ENV{'PBPROJ'}};
316 } else {
317 die "No projtag found in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb";
318 }
319 }
320 die "Invalid tag name $ENV{'PBPROJTAG'} in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb" if ($ENV{'PBPROJTAG'} !~ /[0-9.]+/);
321
322
323 if (not defined $ENV{'PBPACKAGER'}) {
324 if ((defined $pbpackager) && (defined $pbpackager->{$ENV{'PBPROJ'}})) {
325 $ENV{'PBPACKAGER'}=$pbpackager->{$ENV{'PBPROJ'}};
326 } else {
327 die "No pbpackager found in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb";
328 }
329 }
330 } else {
331 if (defined $pbinit) {
332 my @pkgs = @ARGV;
333 @pkgs = ("pkg1") if (not @pkgs);
334
335 open(CONF,"> $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb") || die "Unable to create $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb";
336 print CONF << "EOF";
337#
338# Project Builder configuration file
339# For project $ENV{'PBPROJ'}
340#
341# \$Id\$
342#
343
344#
345# What is the project URL
346#
347#pburl $ENV{'PBPROJ'} = svn://svn.$ENV{'PBPROJ'}.org/$ENV{'PBPROJ'}/devel
348#pburl $ENV{'PBPROJ'} = svn://svn+ssh.$ENV{'PBPROJ'}.org/$ENV{'PBPROJ'}/devel
349#pburl $ENV{'PBPROJ'} = cvs://cvs.$ENV{'PBPROJ'}.org/$ENV{'PBPROJ'}/devel
350#pburl $ENV{'PBPROJ'} = http://www.$ENV{'PBPROJ'}.org/src/$ENV{'PBPROJ'}-devel.tar.gz
351#pburl $ENV{'PBPROJ'} = ftp://ftp.$ENV{'PBPROJ'}.org/src/$ENV{'PBPROJ'}-devel.tar.gz
352#pburl $ENV{'PBPROJ'} = file:///src/$ENV{'PBPROJ'}-devel.tar.gz
353#pburl $ENV{'PBPROJ'} = dir:///src/$ENV{'PBPROJ'}-devel
354
355# Repository
356#pbrepo $ENV{'PBPROJ'} = ftp://ftp.$ENV{'PBPROJ'}.org
357#pbml $ENV{'PBPROJ'} = $ENV{'PBPROJ'}-announce\@lists.$ENV{'PBPROJ'}.org
358#pbsmtp $ENV{'PBPROJ'} = localhost
359
360# Check whether project is well formed
361# when downloading from ftp/http/...
362# (containing already a directory with the project-version name)
363#pbwf $ENV{'PBPROJ'} = 1
364
365#
366# Packager label
367#
368#pbpackager $ENV{'PBPROJ'} = William Porte <bill\@$ENV{'PBPROJ'}.org>
369#
370
371# For delivery to a machine by SSH (potentially the FTP server)
372# Needs hostname, account and directory
373#
374#sshhost $ENV{'PBPROJ'} = www.$ENV{'PBPROJ'}.org
375#sshlogin $ENV{'PBPROJ'} = bill
376#sshdir $ENV{'PBPROJ'} = /$ENV{'PBPROJ'}/ftp
377#sshport $ENV{'PBPROJ'} = 22
378
379#
380# For Virtual machines management
381# Naming convention to follow: distribution name (as per ProjectBuilder::Distribution)
382# followed by '-' and by release number
383# followed by '-' and by architecture
384# a .vmtype extension will be added to the resulting string
385# a QEMU rhel-3-i286 here means that the VM will be named rhel-3-i386.qemu
386#
387#vmlist $ENV{'PBPROJ'} = mandrake-10.1-i386,mandrake-10.2-i386,mandriva-2006.0-i386,mandriva-2007.0-i386,mandriva-2007.1-i386,mandriva-2008.0-i386,redhat-7.3-i386,redhat-9-i386,fedora-4-i386,fedora-5-i386,fedora-6-i386,fedora-7-i386,fedora-8-i386,rhel-3-i386,rhel-4-i386,rhel-5-i386,suse-10.0-i386,suse-10.1-i386,suse-10.2-i386,suse-10.3-i386,sles-9-i386,sles-10-i386,gentoo-nover-i386,debian-3.1-i386,debian-4.0-i386,ubuntu-6.06-i386,ubuntu-7.04-i386,ubuntu-7.10-i386,mandriva-2007.0-x86_64,mandriva-2007.1-x86_64,mandriva-2008.0-x86_64,fedora-6-x86_64,fedora-7-x86_64,fedora-8-x86_64,rhel-4-x86_64,rhel-5-x86_64,suse-10.2-x86_64,suse-10.3-x86_64,sles-10-x86_64,gentoo-nover-x86_64,debian-4.0-x86_64,ubuntu-7.04-x86_64,ubuntu-7.10-x86_64
388
389#
390# Valid values for vmtype are
391# qemu, (vmware, xen, ... TBD)
392#vmtype $ENV{'PBPROJ'} = qemu
393
394# Hash for VM stuff on vmtype
395#vmntp default = pool.ntp.org
396
397# We suppose we can commmunicate with the VM through SSH
398#vmhost $ENV{'PBPROJ'} = localhost
399#vmlogin $ENV{'PBPROJ'} = pb
400#vmport $ENV{'PBPROJ'} = 2222
401
402# Timeout to wait when VM is launched/stopped
403#vmtmout default = 120
404
405# per VMs needed paramaters
406#vmopt $ENV{'PBPROJ'} = -m 384 -daemonize
407#vmpath $ENV{'PBPROJ'} = /home/qemu
408#vmsize $ENV{'PBPROJ'} = 5G
409
410#
411# For Virtual environment management
412# Naming convention to follow: distribution name (as per ProjectBuilder::Distribution)
413# followed by '-' and by release number
414# followed by '-' and by architecture
415# a .vetype extension will be added to the resulting string
416# a chroot rhel-3-i286 here means that the VE will be named rhel-3-i386.chroot
417#
418#velist $ENV{'PBPROJ'} = fedora-7-i386
419
420# VE params
421#vetype $ENV{'PBPROJ'} = chroot
422#ventp default = pool.ntp.org
423#velogin $ENV{'PBPROJ'} = pb
424#vepath $ENV{'PBPROJ'} = /var/lib/mock
425#veconf $ENV{'PBPROJ'} = /etc/mock
426#verebuild $ENV{'PBPROJ'} = false
427
428#
429# Global version/tag for the project
430#
431#projver $ENV{'PBPROJ'} = devel
432#projtag $ENV{'PBPROJ'} = 1
433
434# Hash of valid version names
435#version $ENV{'PBPROJ'} = devel,stable
436
437# Is it a test version or a production version
438testver $ENV{'PBPROJ'} = true
439
440# Adapt to your needs:
441# Optional if you need to overwrite the global values above
442#
443EOF
444
445 foreach my $pp (@pkgs) {
446 print CONF << "EOF";
447#pkgver $pp = stable
448#pkgtag $pp = 3
449EOF
450 }
451 foreach my $pp (@pkgs) {
452 print CONF << "EOF";
453# Hash of default package/package directory
454#defpkgdir $pp = dir-$pp
455EOF
456 }
457
458 print CONF << "EOF";
459# Hash of additional package/package directory
460#extpkgdir minor-pkg = dir-minor-pkg
461
462# List of files per pkg on which to apply filters
463# Files are mentioned relatively to pbroot/defpkgdir
464EOF
465 foreach my $pp (@pkgs) {
466 print CONF << "EOF";
467#filteredfiles $pp = Makefile.PL,configure.in,install.sh,$pp.8
468#supfiles $pp = $pp.init
469EOF
470 }
471 close(CONF);
472 pb_mkdir_p("$ENV{'PBROOTDIR'}/pbfilter") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter";
473 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/all.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/all.pbf";
474 print CONF << "EOF";
475#
476# \$Id\$
477#
478# Filter for all files
479#
480#
481# PBREPO is replaced by the root URL to access the repository
482filter PBREPO = \$pb->{'repo'}
483
484# PBSRC is replaced by the source package location after the repo
485#filter PBSRC = src/%{name}-%{version}.tar.gz
486# Used if virtual name != real name (perl, ...)
487#filter PBSRC = src/%{srcname}-%{version}.tar.gz
488
489# PBVER is replaced by the version (\$pb->{'ver'} in code)
490filter PBVER = \$pb->{'ver'}
491
492# PBDATE is replaced by the date (\$pb->{'date'} in code)
493filter PBDATE = \$pb->{'date'}
494
495# PBLOG is replaced by the changelog if value is yes
496#filter PBLOG = yes
497
498# PBPATCHSRC is replaced by the patches names if value is yes
499#filter PBPATCHSRC = yes
500
501# PBPATCHCMD is replaced by the patches commands if value is yes
502#filter PBPATCHCMD = yes
503
504# PBTAG is replaced by the tag (\$pb->{'tag'} in code)
505filter PBTAG = \$pb->{'tag'}
506
507# PBREV is replaced by the revision (\$pb->{'rev'} in code)
508filter PBREV = \$pb->{'rev'}
509
510# PBREALPKG is replaced by the package name (\$pb->{'realpkg'} in code)
511filter PBREALPKG = \$pb->{'realpkg'}
512
513# PBPKG is replaced by the package name (\$pb->{'pkg'} in code)
514filter PBPKG = \$pb->{'pkg'}
515
516# PBPACKAGER is replaced by the packager name (\$pb->{'packager'} in code)
517filter PBPACKAGER = \$pb->{'packager'}
518
519# PBDESC contains the description of the package
520#filter PBDESC = "Bla-Bla"
521
522# PBURL contains the URL of the Web site of the project
523#filter PBURL = http://www.$ENV{'PBPROJ'}.org
524EOF
525 close(CONF);
526 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/rpm.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/rpm.pbf";
527 print CONF << "EOF";
528#
529# \$Id\$
530#
531# Filter for rpm build
532#
533
534# PBGRP is replaced by the RPM group of apps
535#filter PBGRP = Applications/Archiving
536
537# PBLIC is replaced by the license of the application
538#filter PBLIC = GPL
539
540# PBDEP is replaced by the list of dependencies
541#filter PBDEP =
542
543# PBSUF is replaced by the package suffix (\$pb->{'suf'} in code)
544filter PBSUF = \$pb->{'suf'}
545
546# PBOBS is replaced by the Obsolete line
547#filter PBOBS =
548
549EOF
550 close(CONF);
551 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/fedora.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/fedora.pbf";
552 print CONF << "EOF";
553#
554# \$Id\$
555#
556# Filter for rpm build
557#
558
559# PBGRP is replaced by the RPM group of apps
560# Cf: http://fedoraproject.org/wiki/RPMGroups
561#filter PBGRP = Applications/Archiving
562
563# PBLIC is replaced by the license of the application
564# Cf: http://fedoraproject.org/wiki/Licensing
565#filter PBLIC = GPLv2+
566
567# PBDEP is replaced by the list of dependencies
568#filter PBDEP =
569
570# PBSUF is replaced by the package suffix (\$pbsuf'} in code)
571filter PBSUF = %{dist}
572
573# PBOBS is replaced by the Obsolete line
574#filter PBOBS =
575
576EOF
577 close(CONF);
578 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/deb.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/deb.pbf";
579 print CONF << "EOF";
580#
581# \$Id\$
582#
583# Filter for debian build
584#
585# PBGRP is replaced by the group of apps
586filter PBGRP = utils
587
588# PBLIC is replaced by the license of the application
589# Cf:
590#filter PBLIC = GPL
591
592# PBDEP is replaced by the list of dependencies
593#filter PBDEP =
594
595# PBSUG is replaced by the list of suggestions
596#filter PBSUG =
597
598# PBREC is replaced by the list of recommandations
599#filter PBREC =
600
601EOF
602 close(CONF);
603 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/md.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/md.pbf";
604 print CONF << "EOF";
605# Specific group for Mandriva for $ENV{'PBPROJ'}
606# Cf: http://wiki.mandriva.com/en/Development/Packaging/Groups
607#filter PBGRP = Archiving/Backup
608
609# PBLIC is replaced by the license of the application
610# Cf: http://wiki.mandriva.com/en/Development/Packaging/Licenses
611#filter PBLIC = GPL
612
613EOF
614 close(CONF);
615 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/novell.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/novell.pbf";
616 print CONF << "EOF";
617# Specific group for SuSE for $ENV{'PBPROJ'}
618# Cf: http://en.opensuse.org/SUSE_Package_Conventions/RPM_Groups
619#filter PBGRP = Productivity/Archiving/Backup
620
621# PBLIC is replaced by the license of the application
622# Cf: http://en.opensuse.org/Packaging/SUSE_Package_Conventions/RPM_Style#1.6._License_Tag
623#filter PBLIC = GPL
624
625EOF
626 close(CONF);
627 foreach my $pp (@pkgs) {
628 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/deb") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb";
629 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/control") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/control";
630 print CONF << "EOF";
631Source: PBPKG
632Section: PBGRP
633Priority: optional
634Maintainer: PBPACKAGER
635Build-Depends: debhelper (>= 4.2.20), PBDEP
636Standards-Version: 3.6.1
637
638Package: PBPKG
639Architecture: amd64 i386 ia64
640Section: PBGRP
641Priority: optional
642Depends: \${shlibs:Depends}, \${misc:Depends}, PBDEP
643Recommends: PBREC
644Suggests: PBSUG
645Description:
646 PBDESC
647 .
648 Homepage: PBURL
649
650EOF
651 close(CONF);
652 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/copyright") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/copyright";
653 print CONF << "EOF";
654This package is debianized by PBPACKAGER
655`date`
656
657The current upstream source was downloaded from
658PBREPO.
659
660Upstream Authors: Put their name here
661
662Copyright:
663
664 This package is free software; you can redistribute it and/or modify
665 it under the terms of the GNU General Public License as published by
666 the Free Software Foundation; version 2 dated June, 1991.
667
668 This package is distributed in the hope that it will be useful,
669 but WITHOUT ANY WARRANTY; without even the implied warranty of
670 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
671 GNU General Public License for more details.
672
673 You should have received a copy of the GNU General Public License
674 along with this package; if not, write to the Free Software
675 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
676 MA 02110-1301, USA.
677
678On Debian systems, the complete text of the GNU General
679Public License can be found in /usr/share/common-licenses/GPL.
680
681EOF
682 close(CONF);
683 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/changelog") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/changelog";
684 print CONF << "EOF";
685PBLOG
686EOF
687 close(CONF);
688 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/compat") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/compat";
689 print CONF << "EOF";
6904
691EOF
692 close(CONF);
693 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/$pp.dirs") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/$pp.dirs";
694 print CONF << "EOF";
695EOF
696 close(CONF);
697 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/$pp.docs") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/$pp.docs";
698 print CONF << "EOF";
699INSTALL
700COPYING
701AUTHORS
702NEWS
703README
704EOF
705 close(CONF);
706 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/rules") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/rules";
707 print CONF << 'EOF';
708#!/usr/bin/make -f
709# -*- makefile -*-
710# Sample debian/rules that uses debhelper.
711# GNU copyright 1997 to 1999 by Joey Hess.
712#
713# $Id$
714#
715
716# Uncomment this to turn on verbose mode.
717#export DH_VERBOSE=1
718
719# Define package name variable for a one-stop change.
720PACKAGE_NAME = PBPKG
721
722# These are used for cross-compiling and for saving the configure script
723# from having to guess our platform (since we know it already)
724DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
725DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
726
727CFLAGS = -Wall -g
728
729ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
730 CFLAGS += -O0
731else
732 CFLAGS += -O2
733endif
734ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
735 INSTALL_PROGRAM += -s
736endif
737config.status: configure
738 dh_testdir
739
740 # Configure the package.
741 CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr
742 --mandir=\$${prefix}/share/man
743
744# Build both architecture dependent and independent
745build: build-arch build-indep
746
747# Build architecture dependent
748build-arch: build-arch-stamp
749
750build-arch-stamp: config.status
751 dh_testdir
752
753 # Compile the package.
754 $(MAKE)
755
756 touch build-stamp
757
758# Build architecture independent
759build-indep: build-indep-stamp
760
761build-indep-stamp: config.status
762 # Nothing to do, the only indep item is the manual which is available as html in original source
763 touch build-indep-stamp
764
765# Clean up
766clean:
767 dh_testdir
768 dh_testroot
769 rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#
770 # Clean temporary document directory
771 rm -rf debian/doc-temp
772 # Clean up.
773 -$(MAKE) distclean
774 rm -f config.log
775ifneq "$(wildcard /usr/share/misc/config.sub)" ""
776 cp -f /usr/share/misc/config.sub config.sub
777endif
778ifneq "$(wildcard /usr/share/misc/config.guess)" ""
779 cp -f /usr/share/misc/config.guess config.guess
780endif
781
782 dh_clean
783
784# Install architecture dependent and independent
785install: install-arch install-indep
786
787# Install architecture dependent
788install-arch: build-arch
789 dh_testdir
790 dh_testroot
791 dh_clean -k -s
792 dh_installdirs -s
793
794 # Install the package files into build directory:
795 # - start with upstream make install
796 $(MAKE) install prefix=$(CURDIR)/debian/$(PACKAGE_NAME)/usr mandir=$(CURDIR)/debian/$(PACKAGE_NAME)/us
797r/share/man
798 # - copy html manual to temporary location for renaming
799 mkdir -p debian/doc-temp
800 dh_install -s
801
802# Install architecture independent
803install-indep: build-indep
804 dh_testdir
805 dh_testroot
806 dh_clean -k -i
807 dh_installdirs -i
808 dh_install -i
809
810# Must not depend on anything. This is to be called by
811# binary-arch/binary-indep
812# in another 'make' thread.
813binary-common:
814 dh_testdir
815 dh_testroot
816 dh_installchangelogs ChangeLog
817 dh_installdocs
818 dh_installman
819 dh_link
820 dh_strip
821 dh_compress
822 dh_fixperms
823 dh_installdeb
824 dh_shlibdeps
825 dh_gencontrol
826 dh_md5sums
827 dh_builddeb
828
829# Build architecture independant packages using the common target.
830binary-indep: build-indep install-indep
831 $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
832
833# Build architecture dependant packages using the common target.
834binary-arch: build-arch install-arch
835 $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
836
837# Build architecture depdendent and independent packages
838binary: binary-arch binary-indep
839.PHONY: clean binary
840
841EOF
842 close(CONF);
843 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/rpm") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/rpm";
844 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/rpm/$pp.spec") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/rpm/$pp.spec";
845 print CONF << 'EOF';
846#
847# $Id$
848#
849# Used if virtual name != real name (perl, ...)
850#%define srcname PBPKG
851
852Summary: bla-bla
853Summary(fr): french bla-bla
854
855Name: PBREALPKG
856Version: PBVER
857Release: PBTAGPBSUF
858License: PBLIC
859Group: PBGRP
860Url: PBURL
861Source: PBREPO/PBSRC
862#PBPATCHSRC
863BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -u -n)
864#Requires: PBDEP
865
866%description
867PBDESC
868
869%description -l fr
870french desc
871
872%prep
873%setup -q
874# Used if virtual name != real name (perl, ...)
875#%setup -q -n %{srcname}-%{version}
876#PBPATCHCMD
877
878%build
879%configure
880make %{?_smp_mflags}
881
882%install
883%{__rm} -rf $RPM_BUILD_ROOT
884make DESTDIR=$RPM_BUILD_ROOT install
885
886%clean
887%{__rm} -rf $RPM_BUILD_ROOT
888
889%files
890%defattr(-,root,root)
891%doc ChangeLog
892%doc INSTALL COPYING README AUTHORS NEWS
893
894%changelog
895PBLOG
896
897EOF
898 close(CONF);
899 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/pbfilter") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/pbfilter";
900
901 }
902 pb_cms_add($pbconf{$ENV{'PBPROJ'}},$ENV{'PBCONFDIR'});
903 pb_cms_checkin($pbconf{$ENV{'PBPROJ'}},"$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}",$pbinit);
904 } else {
905 die "Unable to open $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb";
906 }
907 }
908 umask 0022;
909 return(\%filteredfiles, \%supfiles, \%defpkgdir, \%extpkgdir);
910} else {
911 # Setup the variables from what has been stored at the end of cms2build
912 my ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","pbroot");
913 $ENV{'PBROOTDIR'} = $var->{$ENV{'PBPROJ'}};
914
915 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","projver");
916 $ENV{'PBPROJVER'} = $var->{$ENV{'PBPROJ'}};
917
918 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","projtag");
919 $ENV{'PBPROJTAG'} = $var->{$ENV{'PBPROJ'}};
920
921 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","pbpackager");
922 $ENV{'PBPACKAGER'} = $var->{$ENV{'PBPROJ'}};
923
924 return;
925}
926}
927
928=back
929
930=head1 WEB SITES
931
932The main Web site of the project is available at L<http://www.project-builder.org/>. Bug reports should be filled using the trac instance of the project at L<http://trac.project-builder.org/>.
933
934=head1 USER MAILING LIST
935
936None exists for the moment.
937
938=head1 AUTHORS
939
940The Project-Builder.org team L<http://trac.project-builder.org/> lead by Bruno Cornec L<mailto:bruno@project-builder.org>.
941
942=head1 COPYRIGHT
943
944Project-Builder.org is distributed under the GPL v2.0 license
945described in the file C<COPYING> included with the distribution.
946
947=cut
948
9491;
Note: See TracBrowser for help on using the repository browser.