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

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