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

Last change on this file since 703 was 703, checked in by Bruno Cornec, 15 years ago
  • Adds documentation for latest VE fields added
File size: 29.9 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#version $ENV{'PBPROJ'} = devel,stable
437
438# Is it a test version or a production version
439testver $ENV{'PBPROJ'} = true
440
441# Additional repository to add at build time
442# 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
443# 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
444
445# Adapt to your needs:
446# Optional if you need to overwrite the global values above
447#
448EOF
449
450 foreach my $pp (@pkgs) {
451 print CONF << "EOF";
452#pkgver $pp = stable
453#pkgtag $pp = 3
454EOF
455 }
456 foreach my $pp (@pkgs) {
457 print CONF << "EOF";
458# Hash of default package/package directory
459#defpkgdir $pp = dir-$pp
460EOF
461 }
462
463 print CONF << "EOF";
464# Hash of additional package/package directory
465#extpkgdir minor-pkg = dir-minor-pkg
466
467# List of files per pkg on which to apply filters
468# Files are mentioned relatively to pbroot/defpkgdir
469EOF
470 foreach my $pp (@pkgs) {
471 print CONF << "EOF";
472#filteredfiles $pp = Makefile.PL,configure.in,install.sh,$pp.8
473#supfiles $pp = $pp.init
474
475# For perl modules, names are different depending on distro
476# Here perl-xxx for RPMs, libxxx-perl for debs, ...
477# So the package name is indeed virtual
478#namingtype $pp = perl
479EOF
480 }
481 close(CONF);
482 pb_mkdir_p("$ENV{'PBROOTDIR'}/pbfilter") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter";
483 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/all.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/all.pbf";
484 print CONF << "EOF";
485#
486# \$Id\$
487#
488# Filter for all files
489#
490#
491# PBREPO is replaced by the root URL to access the repository
492filter PBREPO = \$pb->{'repo'}
493
494# PBSRC is replaced by the source package location after the repo
495#filter PBSRC = src/%{name}-%{version}.tar.gz
496# Used if virtual name != real name (perl, ...)
497#filter PBSRC = src/%{srcname}-%{version}.tar.gz
498
499# PBVER is replaced by the version (\$pb->{'ver'} in code)
500filter PBVER = \$pb->{'ver'}
501
502# PBDATE is replaced by the date (\$pb->{'date'} in code)
503filter PBDATE = \$pb->{'date'}
504
505# PBLOG is replaced by the changelog if value is yes
506#filter PBLOG = yes
507
508# PBPATCHSRC is replaced by the patches names if value is yes
509#filter PBPATCHSRC = yes
510
511# PBPATCHCMD is replaced by the patches commands if value is yes
512#filter PBPATCHCMD = yes
513
514# PBTAG is replaced by the tag (\$pb->{'tag'} in code)
515filter PBTAG = \$pb->{'tag'}
516
517# PBREV is replaced by the revision (\$pb->{'rev'} in code)
518filter PBREV = \$pb->{'rev'}
519
520# PBREALPKG is replaced by the package name (\$pb->{'realpkg'} in code)
521filter PBREALPKG = \$pb->{'realpkg'}
522
523# PBPKG is replaced by the package name (\$pb->{'pkg'} in code)
524filter PBPKG = \$pb->{'pkg'}
525
526# PBPROJ is replaced by the project name (\$pb->{'proj'} in code)
527filter PBPROJ = \$pb->{'proj'}
528
529# PBPACKAGER is replaced by the packager name (\$pb->{'packager'} in code)
530filter PBPACKAGER = \$pb->{'packager'}
531
532# PBDESC contains the description of the package
533#filter PBDESC = "Bla-Bla"
534
535# PBURL contains the URL of the Web site of the project
536#filter PBURL = http://www.$ENV{'PBPROJ'}.org
537EOF
538 close(CONF);
539 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/rpm.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/rpm.pbf";
540 print CONF << "EOF";
541#
542# \$Id\$
543#
544# Filter for rpm build
545#
546
547# PBGRP is replaced by the RPM group of apps
548#filter PBGRP = Applications/Archiving
549
550# PBLIC is replaced by the license of the application
551#filter PBLIC = GPL
552
553# PBDEP is replaced by the list of dependencies
554#filter PBDEP =
555
556# PBSUF is replaced by the package suffix (\$pb->{'suf'} in code)
557filter PBSUF = \$pb->{'suf'}
558
559# PBOBS is replaced by the Obsolete line
560#filter PBOBS =
561
562EOF
563 close(CONF);
564 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/fedora.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/fedora.pbf";
565 print CONF << "EOF";
566#
567# \$Id\$
568#
569# Filter for rpm build
570#
571
572# PBGRP is replaced by the RPM group of apps
573# Cf: http://fedoraproject.org/wiki/RPMGroups
574#filter PBGRP = Applications/Archiving
575
576# PBLIC is replaced by the license of the application
577# Cf: http://fedoraproject.org/wiki/Licensing
578#filter PBLIC = GPLv2+
579
580# PBDEP is replaced by the list of dependencies
581#filter PBDEP =
582
583# PBSUF is replaced by the package suffix (\$pbsuf'} in code)
584filter PBSUF = %{dist}
585
586# PBOBS is replaced by the Obsolete line
587#filter PBOBS =
588
589EOF
590 close(CONF);
591 foreach my $i (1..7) {
592 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/fedora-$i.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/fedora-$i.pbf";
593 print CONF << "EOF";
594#
595# \$Id\$
596#
597# Filter for old fedora build
598#
599
600# PBSUF is replaced by the package suffix (\$pb->{'suf'} in code)
601filter PBSUF = \$pb->{'suf'}
602
603EOF
604 close(CONF);
605 }
606 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/deb.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/deb.pbf";
607 print CONF << "EOF";
608#
609# \$Id\$
610#
611# Filter for debian build
612#
613# PBGRP is replaced by the group of apps
614filter PBGRP = utils
615
616# PBLIC is replaced by the license of the application
617# Cf:
618#filter PBLIC = GPL
619
620# PBDEP is replaced by the list of dependencies
621#filter PBDEP =
622
623# PBSUG is replaced by the list of suggestions
624#filter PBSUG =
625
626# PBREC is replaced by the list of recommandations
627#filter PBREC =
628
629EOF
630 close(CONF);
631 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/md.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/md.pbf";
632 print CONF << "EOF";
633# Specific group for Mandriva for $ENV{'PBPROJ'}
634# Cf: http://wiki.mandriva.com/en/Development/Packaging/Groups
635#filter PBGRP = Archiving/Backup
636
637# PBLIC is replaced by the license of the application
638# Cf: http://wiki.mandriva.com/en/Development/Packaging/Licenses
639#filter PBLIC = GPL
640
641EOF
642 close(CONF);
643 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/novell.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/novell.pbf";
644 print CONF << "EOF";
645# Specific group for SuSE for $ENV{'PBPROJ'}
646# Cf: http://en.opensuse.org/SUSE_Package_Conventions/RPM_Groups
647#filter PBGRP = Productivity/Archiving/Backup
648
649# PBLIC is replaced by the license of the application
650# Cf: http://en.opensuse.org/Packaging/SUSE_Package_Conventions/RPM_Style#1.6._License_Tag
651#filter PBLIC = GPL
652
653EOF
654 close(CONF);
655 foreach my $pp (@pkgs) {
656 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/deb") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb";
657 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/control") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/control";
658 print CONF << "EOF";
659Source: PBPKG
660Section: PBGRP
661Priority: optional
662Maintainer: PBPACKAGER
663Build-Depends: debhelper (>= 4.2.20), PBDEP
664Standards-Version: 3.6.1
665
666Package: PBPKG
667Architecture: amd64 i386 ia64
668Section: PBGRP
669Priority: optional
670Depends: \${shlibs:Depends}, \${misc:Depends}, PBDEP
671Recommends: PBREC
672Suggests: PBSUG
673Description:
674 PBDESC
675 .
676 Homepage: PBURL
677
678EOF
679 close(CONF);
680 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/copyright") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/copyright";
681 print CONF << "EOF";
682This package is debianized by PBPACKAGER
683`date`
684
685The current upstream source was downloaded from
686PBREPO.
687
688Upstream Authors: Put their name here
689
690Copyright:
691
692 This package is free software; you can redistribute it and/or modify
693 it under the terms of the GNU General Public License as published by
694 the Free Software Foundation; version 2 dated June, 1991.
695
696 This package is distributed in the hope that it will be useful,
697 but WITHOUT ANY WARRANTY; without even the implied warranty of
698 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
699 GNU General Public License for more details.
700
701 You should have received a copy of the GNU General Public License
702 along with this package; if not, write to the Free Software
703 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
704 MA 02110-1301, USA.
705
706On Debian systems, the complete text of the GNU General
707Public License can be found in /usr/share/common-licenses/GPL.
708
709EOF
710 close(CONF);
711 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/changelog") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/changelog";
712 print CONF << "EOF";
713PBLOG
714EOF
715 close(CONF);
716 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/compat") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/compat";
717 print CONF << "EOF";
7184
719EOF
720 close(CONF);
721 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/$pp.dirs") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/$pp.dirs";
722 print CONF << "EOF";
723EOF
724 close(CONF);
725 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/$pp.docs") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/$pp.docs";
726 print CONF << "EOF";
727INSTALL
728COPYING
729AUTHORS
730NEWS
731README
732EOF
733 close(CONF);
734 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/rules") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/rules";
735 print CONF << 'EOF';
736#!/usr/bin/make -f
737# -*- makefile -*-
738# Sample debian/rules that uses debhelper.
739# GNU copyright 1997 to 1999 by Joey Hess.
740#
741# $Id$
742#
743
744# Uncomment this to turn on verbose mode.
745#export DH_VERBOSE=1
746
747# Define package name variable for a one-stop change.
748PACKAGE_NAME = PBPKG
749
750# These are used for cross-compiling and for saving the configure script
751# from having to guess our platform (since we know it already)
752DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
753DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
754
755CFLAGS = -Wall -g
756
757ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
758 CFLAGS += -O0
759else
760 CFLAGS += -O2
761endif
762ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
763 INSTALL_PROGRAM += -s
764endif
765config.status: configure
766 dh_testdir
767
768 # Configure the package.
769 CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr
770 --mandir=\$${prefix}/share/man
771
772# Build both architecture dependent and independent
773build: build-arch build-indep
774
775# Build architecture dependent
776build-arch: build-arch-stamp
777
778build-arch-stamp: config.status
779 dh_testdir
780
781 # Compile the package.
782 $(MAKE)
783
784 touch build-stamp
785
786# Build architecture independent
787build-indep: build-indep-stamp
788
789build-indep-stamp: config.status
790 # Nothing to do, the only indep item is the manual which is available as html in original source
791 touch build-indep-stamp
792
793# Clean up
794clean:
795 dh_testdir
796 dh_testroot
797 rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#
798 # Clean temporary document directory
799 rm -rf debian/doc-temp
800 # Clean up.
801 -$(MAKE) distclean
802 rm -f config.log
803ifneq "$(wildcard /usr/share/misc/config.sub)" ""
804 cp -f /usr/share/misc/config.sub config.sub
805endif
806ifneq "$(wildcard /usr/share/misc/config.guess)" ""
807 cp -f /usr/share/misc/config.guess config.guess
808endif
809
810 dh_clean
811
812# Install architecture dependent and independent
813install: install-arch install-indep
814
815# Install architecture dependent
816install-arch: build-arch
817 dh_testdir
818 dh_testroot
819 dh_clean -k -s
820 dh_installdirs -s
821
822 # Install the package files into build directory:
823 # - start with upstream make install
824 $(MAKE) install prefix=$(CURDIR)/debian/$(PACKAGE_NAME)/usr mandir=$(CURDIR)/debian/$(PACKAGE_NAME)/us
825r/share/man
826 # - copy html manual to temporary location for renaming
827 mkdir -p debian/doc-temp
828 dh_install -s
829
830# Install architecture independent
831install-indep: build-indep
832 dh_testdir
833 dh_testroot
834 dh_clean -k -i
835 dh_installdirs -i
836 dh_install -i
837
838# Must not depend on anything. This is to be called by
839# binary-arch/binary-indep
840# in another 'make' thread.
841binary-common:
842 dh_testdir
843 dh_testroot
844 dh_installchangelogs ChangeLog
845 dh_installdocs
846 dh_installman
847 dh_link
848 dh_strip
849 dh_compress
850 dh_fixperms
851 dh_installdeb
852 dh_shlibdeps
853 dh_gencontrol
854 dh_md5sums
855 dh_builddeb
856
857# Build architecture independant packages using the common target.
858binary-indep: build-indep install-indep
859 $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
860
861# Build architecture dependant packages using the common target.
862binary-arch: build-arch install-arch
863 $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
864
865# Build architecture depdendent and independent packages
866binary: binary-arch binary-indep
867.PHONY: clean binary
868
869EOF
870 close(CONF);
871 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/rpm") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/rpm";
872 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/rpm/$pp.spec") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/rpm/$pp.spec";
873 print CONF << 'EOF';
874#
875# $Id$
876#
877# Used if virtual name != real name (perl, ...)
878#%define srcname PBPKG
879
880Summary: bla-bla
881Summary(fr): french bla-bla
882
883Name: PBREALPKG
884Version: PBVER
885Release: PBTAGPBSUF
886License: PBLIC
887Group: PBGRP
888Url: PBURL
889Source: PBREPO/PBSRC
890#PBPATCHSRC
891BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -u -n)
892#Requires: PBDEP
893
894%description
895PBDESC
896
897%description -l fr
898french desc
899
900%prep
901%setup -q
902# Used if virtual name != real name (perl, ...)
903#%setup -q -n %{srcname}-%{version}
904#PBPATCHCMD
905
906%build
907%configure
908make %{?_smp_mflags}
909
910%install
911%{__rm} -rf $RPM_BUILD_ROOT
912make DESTDIR=$RPM_BUILD_ROOT install
913
914%clean
915%{__rm} -rf $RPM_BUILD_ROOT
916
917%files
918%defattr(-,root,root)
919%doc ChangeLog
920%doc INSTALL COPYING README AUTHORS NEWS
921
922%changelog
923PBLOG
924
925EOF
926 close(CONF);
927 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/pbfilter") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/pbfilter";
928
929 }
930 pb_cms_add($pbconf{$ENV{'PBPROJ'}},$ENV{'PBCONFDIR'});
931 pb_cms_checkin($pbconf{$ENV{'PBPROJ'}},"$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}",$pbinit);
932 } else {
933 die "Unable to open $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb";
934 }
935 }
936 umask 0022;
937 return(\%filteredfiles, \%supfiles, \%defpkgdir, \%extpkgdir);
938} else {
939 # Setup the variables from what has been stored at the end of cms2build
940 my ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","pbroot");
941 $ENV{'PBROOTDIR'} = $var->{$ENV{'PBPROJ'}};
942
943 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","projver");
944 $ENV{'PBPROJVER'} = $var->{$ENV{'PBPROJ'}};
945
946 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","projtag");
947 $ENV{'PBPROJTAG'} = $var->{$ENV{'PBPROJ'}};
948
949 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","pbpackager");
950 $ENV{'PBPACKAGER'} = $var->{$ENV{'PBPROJ'}};
951
952 return;
953}
954}
955
956=back
957
958=head1 WEB SITES
959
960The 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/>.
961
962=head1 USER MAILING LIST
963
964None exists for the moment.
965
966=head1 AUTHORS
967
968The Project-Builder.org team L<http://trac.project-builder.org/> lead by Bruno Cornec L<mailto:bruno@project-builder.org>.
969
970=head1 COPYRIGHT
971
972Project-Builder.org is distributed under the GPL v2.0 license
973described in the file C<COPYING> included with the distribution.
974
975=cut
976
9771;
Note: See TracBrowser for help on using the repository browser.