]> git.tdb.fi Git - builder.git/blob - source/package.cpp
Revamp problem reporting system to be more useful
[builder.git] / source / package.cpp
1 /* $Id$
2
3 This file is part of builder
4 Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #include <msp/strings/lexicalcast.h>
9 #include <msp/strings/utils.h>
10 #include "builder.h"
11 #include "misc.h"
12 #include "package.h"
13
14 using namespace std;
15 using namespace Msp;
16
17 #include <iostream>
18
19 /**
20 Creates a buildable package.
21 */
22 Package::Package(Builder &b, const string &n):
23         builder(b),
24         name(n),
25         conf_done(false),
26         use_pkgconfig(true)
27 { }
28
29 /**
30 Collects all directly and indirectly required packages, including the package
31 itself.
32 */
33 PackageList Package::collect_requires()
34 {
35         PackageList result;
36         result.push_back(this);
37         for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i)
38         {
39                 PackageList r=(*i)->collect_requires();
40                 result.splice(result.end(), r);
41         }
42
43         result.sort();
44         result.unique();
45
46         return result;
47 }
48
49 /**
50 Processes configuration options that were most likely obtained from the command
51 line.
52 */
53 void Package::configure(const StringMap &opts, unsigned flag)
54 {
55         if(conf_done)
56                 return;
57
58         if(builder.get_verbose()>=3)
59                 cout<<"Configuring "<<name<<'\n';
60
61         do_configure(opts, flag);
62
63         requires.sort();
64         requires.unique();
65
66         for(PackageList::iterator i=requires.begin(); i!=requires.end(); ++i)
67                 (*i)->configure(opts, flag&2);
68
69         create_build_info();
70
71         conf_done=true;
72 }
73
74 /*** private ***/
75
76 Package::Loader::Loader(Package &p):
77         pkg(p)
78 {
79         add("require", &Loader::require);
80 }
81
82 void Package::Loader::require(const string &n)
83 {
84         Package *req=pkg.builder.get_package(n);
85         if(req)
86                 pkg.requires.push_back(req);
87 }