source: ProjectBuilder/devel/pb/lib/ProjectBuilder/Base.pm@ 74

Last change on this file since 74 was 74, checked in by Bruno Cornec, 17 years ago

Big renaming to be more perlish
Single module Base contains all routines except when detaching makes sense

  • Property svn:executable set to *
File size: 7.4 KB
Line 
1#!/usr/bin/perl -w
2#
3# Base subroutines for the Project-Builder project
4#
5# $Id$
6#
7
8use strict;
9use lib qw (lib);
10use File::Basename;
11use File::Path;
12use File::Temp qw /tempdir/;
13use AppConfig qw(ARGCOUNT_HASH);
14use Data::Dumper;
15
16$ENV{'PBETC'} = "$ENV{'HOME'}/.pbrc";
17
18sub pb_env_init {
19
20my $proj=shift;
21my $ver;
22my $tag;
23
24#
25# Check project name
26# Could be with env var PBPROJ
27# or option -p
28# if not define take the first in conf file
29#
30if ((defined $ENV{'PBPROJ'}) &&
31 (not (defined $proj))) {
32 $proj = $ENV{'PBPROJ'};
33}
34
35#
36# We get the pbrc file for that project
37# and use its content
38#
39my $pbrc = pb_conf_read("$ENV{'PBETC'}","pbrc");
40print "DEBUG pbrc: ".Dumper($pbrc)."\n" if ($debug >= 1);
41
42%pbrc = %$pbrc;
43if (not defined $proj) {
44 # Take the first as the default project
45 $proj = (keys %pbrc)[0];
46 print $LOG "Using $proj as default project as none has been specified\n" if (($debug >= 0) and (defined $proj));
47}
48die "No project defined - use env var PBPROJ or -p proj" if (not (defined $proj));
49
50#
51# Set delivery directory
52#
53my $topdir=dirname($pbrc{$proj});
54chdir $topdir || die "Unable to change directory to $topdir";
55$ENV{'PBDESTDIR'}=$topdir."/delivery";
56
57#
58# Use project configuration file if needed
59#
60if (not defined $ENV{'PBROOT'}) {
61 if (-f $pbrc{$proj}) {
62 my $pbroot = pb_conf_read($pbrc{$proj},"pbroot");
63 my %pbroot = %$pbroot;
64 # There is normaly only one line in it
65 $ENV{'PBROOT'} = (values %$pbroot)[0] if (defined $pbroot);
66 print $LOG "Using $ENV{'PBROOT'} as default pbroot from $pbrc{$proj}\n" if (($debug >= 0) and (defined $ENV{'PBROOT'}));
67 }
68 die "No pbroot defined - use env var PBROOT or -r pbroot " if (not defined $ENV{'PBROOT'});
69}
70
71#
72# Check pb conf compliance
73#
74$ENV{'PBCONF'} = "$ENV{'PBROOT'}/pbconf";
75die "Project $proj not Project-Builder compliant. Please populate $ENV{'PBCONF'}" if ( not -d "$ENV{'PBCONF'}");
76
77my %version = ();
78my %confparam = ();
79
80if (-f "$ENV{'PBCONF'}/$proj.pb") {
81 # main parameter confparam (mandatory)
82 # List of pkg to build by default (mandatory)
83 # List of additional pkg to build when all is called (optional)
84 # Valid version names (optional)
85 # List of files to filter (optional)
86 my $ptr = pb_conf_read("$ENV{'PBCONF'}/$proj.pb","confparam","defpkgdir","extpkgdir","version","filteredfiles");
87 my ($confparam, $defpkgdir, $extpkgdir, $version, $filteredfiles) = @$ptr;
88 print "DEBUG: confparam: ".Dumper($confparam)."\n" if ($debug >= 1);
89 print "DEBUG: defpkgdir: ".Dumper($defpkgdir)."\n" if ($debug >= 1);
90 print "DEBUG: extpkgdir: ".Dumper($extpkgdir)."\n" if ($debug >= 1);
91 print "DEBUG: version: ".Dumper($version)."\n" if ($debug >= 1);
92 print "DEBUG: filteredfiles: ".Dumper($filteredfiles)."\n" if ($debug >= 1);
93 die "Unable to find confparam in $ENV{'PBCONF'}/$proj.pb" if (not defined $confparam);
94 die "Unable to find defpkgdir in $ENV{'PBCONF'}/$proj.pb" if (not defined $defpkgdir);
95 %confparam = %$confparam;
96 # Global
97 %defpkgdir = %$defpkgdir;
98 # Global
99 %extpkgdir = ();
100 %extpkgdir = %$defpkgdir if (defined $defpkgdir);
101 %version = ();
102 %version = %$version if (defined $version);
103 # Global
104 %filteredfiles = ();
105 %filteredfiles = %$filteredfiles if (defined $filteredfiles);
106} else {
107 die "Unable to open $ENV{'PBCONF'}/$proj.pb";
108}
109
110#
111# Export content if needed
112#
113if (defined $confparam{"cvsroot"}) {
114 $ENV{'CVSROOT'} = $confparam{"cvsroot"};
115}
116
117#
118# Set temp directory
119#
120if (not defined $ENV{'TMPDIR'}) {
121 $ENV{'TMPDIR'}="/tmp";
122}
123$ENV{'PBTMP'} = tempdir( "pb.XXXXXXXXXX", DIR => $ENV{'TMPDIR'}, CLEANUP => 1 );
124
125#
126# Get global VERSION
127#
128open(VER, "$ENV{'PBCONF'}/VERSION") || die "Unable to open $ENV{'PBCONF'}/VERSION: $?";
129$ver = <VER>;
130chomp($ver);
131#print Dumper(%version);
132die "Invalid version name $ver in $ENV{'PBROOT'}/VERSION" if ($ver !~ /[0-9.]+/) && (not exists $version{$ver});
133$ENV{'PBVER'}=$ver;
134close(VER);
135
136#
137# Get global TAG
138#
139open(TAG, "$ENV{'PBCONF'}/TAG") || die "Unable to open $ENV{'PBCONF'}/TAG: $?";
140$tag = <TAG>;
141chomp($tag);
142die "Invalid tag name $tag in $ENV{'PBROOT'}/TAG" if ($tag !~ /[0-9]+/);
143$ENV{'PBTAG'}=$tag;
144close(TAG);
145
146#
147# Removes all directory existing below the delivery dir
148# as they are temp dir only
149# Files stay and have to be cleaned up manually
150#
151if (-d $ENV{'PBDESTDIR'}) {
152 opendir(DIR,$ENV{'PBDESTDIR'}) || die "Unable to open directory $ENV{'PBDESTDIR'}: $!";
153 foreach my $d (readdir(DIR)) {
154 next if ($d =~ /^\./);
155 next if (-f "$ENV{'PBDESTDIR'}/$d");
156 pb_rm_rf("$ENV{'PBDESTDIR'}/$d") if (-d "$ENV{'PBDESTDIR'}/$d");
157 }
158 closedir(DIR);
159}
160if (! -d "$ENV{'PBDESTDIR'}") {
161 pb_mkdir_p($ENV{'PBDESTDIR'}) || die "Unable to recursively create $ENV{'PBDESTDIR'}";
162}
163
164#
165# Set build directory
166#
167$ENV{'PBBUILDDIR'}=$topdir."/build";
168pb_rm_rf($ENV{'PBBUILDDIR'}) if (-d "$ENV{'PBBUILDDIR'}");
169pb_mkdir_p($ENV{'PBBUILDDIR'}) || die "Unable to recursively create $ENV{'PBBUILDDIR'}";
170
171umask 0022;
172return($proj);
173}
174
175# Internal mkdir -p function
176sub pb_mkdir_p {
177my @dir = @_;
178my $ret = mkpath(@dir, 0, 0755);
179return($ret);
180}
181
182# Internal rm -rf function
183sub pb_rm_rf {
184my @dir = @_;
185my $ret = rmtree(@dir, 0, 0);
186return($ret);
187}
188
189# Internal system function
190sub pb_system {
191
192my $cmd=shift;
193my $cmt=shift || $cmd;
194
195print $LOG "$cmt... ";
196system("$cmd");
197if ($? == -1) {
198 print $LOG "failed to execute: $!\n" if ($debug >= 0);
199} elsif ($? & 127) {
200 printf $LOG "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without' if ($debug >= 0);
201} else {
202 print $LOG "OK\n" if ($debug >= 0);
203}
204}
205
206# Function which returns a pointer on a hash
207# corresponding to a declaration (arg2) in a conf file (arg1)
208sub pb_conf_read {
209
210my $conffile = shift;
211my @param = @_;
212my $trace;
213my @ptr;
214
215if ($debug > 0) {
216 $trace = 1;
217} else {
218 $trace = 0;
219}
220
221
222my $config = AppConfig->new({
223 # Auto Create variables mentioned in Conf file
224 CREATE => 1,
225 DEBUG => $trace,
226 GLOBAL => {
227 # Each conf item is a hash
228 ARGCOUNT => ARGCOUNT_HASH,
229 },
230 });
231$config->file($conffile);
232for my $param (@param) {
233 push @ptr,$config->get($param);
234}
235if ($#param == 0) {
236 print "DEBUG: param: ".Dumper($ptr[0])."\n" if ($debug >= 1);
237 return($ptr[0]);
238} else {
239 my $ptr = \@ptr;
240 print "DEBUG: params: ".Dumper($ptr)."\n" if ($debug >= 1);
241 return($ptr);
242}
243}
244
245sub pb_conf_init {
246
247my $conffile = shift;
248my $ptr;
249my $trace;
250
251if ($debug > 0) {
252 $trace = 1;
253} else {
254 $trace = 0;
255}
256
257my $config = AppConfig->new({
258 # Auto Create variables mentioned in Conf file
259 DEBUG => $trace,
260 CREATE => '1',
261 GLOBAL => {
262 # Each conf item is a hash
263 ARGCOUNT => ARGCOUNT_HASH,
264 },
265 });
266$config->file($conffile);
267
268# Root of the project to build
269# needs at least 2 levels of dir as in the upper
270# other dirs will be created and used
271
272}
273
274# Setup environment for CMS system
275sub pb_cms_init {
276
277my $proj = shift || undef;
278my $ret;
279
280my $cms = pb_conf_read("$ENV{'PBETC'}","cms");
281die "No CMS defined for $proj" if (not defined $cms);
282my %cms = %$cms;
283die "No CMS defined for $proj" if (not defined $cms{$proj});
284
285if ($cms{$proj} eq "svn") {
286 $ENV{'PBREVISION'}=`(cd "$ENV{'PBROOT'}" ; svnversion .)`;
287 chomp($ENV{'PBREVISION'});
288 $ENV{'PBCMSLOG'}="svn log";
289 $ENV{'PBCMSLOGFILE'}="svn.log";
290 $ENV{'PBCMSEXP'}="svn export";
291} elsif ($cms{$proj} eq "cvs") {
292 $ENV{'PBREVISION'}=`(cd "$ENV{'PBROOT'}" ; cvs rannotate -f . 2>&1 | awk '{print \$1}' | grep -E '^[0-9]' | cut -d. -f2 |sort -nu | tail -1)`;
293 chomp($ENV{'PBREVISION'});
294 $ENV{'PBCMSLOG'}="cvs log";
295 $ENV{'PBCMSLOGFILE'}="cvs.log";
296 $ENV{'PBCMSEXP'}="cvs export"
297} else {
298 die "CMS $cms{$proj} unknown";
299}
300}
301
3021;
Note: See TracBrowser for help on using the repository browser.