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

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