~vcs-imports/kupfer/master-new

« back to all changes in this revision

Viewing changes to waflib/extras/relocation.py

  • Committer: Ulrik Sverdrup
  • Date: 2012-02-26 17:32:06 UTC
  • mto: This revision was merged to the branch mainline in revision 2918.
  • Revision ID: git-v1:684a1e79e28fa3d9e346bdf2c1659e7d2c6e7718
Add waf-light and waflib from waf-1.6.11

http://code.google.com/p/waf/
Acquired from: http://waf.googlecode.com/files/waf-1.6.11.tar.bz2

"""
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
"""

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/env python
 
2
# encoding: utf-8
 
3
 
 
4
"""
 
5
Waf 1.6
 
6
 
 
7
Try to detect if the project directory was relocated, and if it was,
 
8
change the node representing the project directory. Just call:
 
9
 
 
10
 waf configure build
 
11
 
 
12
Note that if the project directory name changes, the signatures for the tasks using
 
13
files in that directory will change, causing a partial build.
 
14
"""
 
15
 
 
16
import os
 
17
from waflib import Build, ConfigSet, Task, Utils, Errors
 
18
from waflib.TaskGen import feature, before_method, after_method
 
19
 
 
20
EXTRA_LOCK = '.old_srcdir'
 
21
 
 
22
old1 = Build.BuildContext.store
 
23
def store(self):
 
24
        old1(self)
 
25
        db = os.path.join(self.variant_dir, EXTRA_LOCK)
 
26
        env = ConfigSet.ConfigSet()
 
27
        env.SRCDIR = self.srcnode.abspath()
 
28
        env.store(db)
 
29
Build.BuildContext.store = store
 
30
 
 
31
old2 = Build.BuildContext.init_dirs
 
32
def init_dirs(self):
 
33
 
 
34
        if not (os.path.isabs(self.top_dir) and os.path.isabs(self.out_dir)):
 
35
                raise Errors.WafError('The project was not configured: run "waf configure" first!')
 
36
 
 
37
        srcdir = None
 
38
        db = os.path.join(self.variant_dir, EXTRA_LOCK)
 
39
        env = ConfigSet.ConfigSet()
 
40
        try:
 
41
                env.load(db)
 
42
                srcdir = env.SRCDIR
 
43
        except:
 
44
                pass
 
45
 
 
46
        if srcdir:
 
47
                d = self.root.find_node(srcdir)
 
48
                if d and srcdir != self.top_dir and getattr(d, 'children', ''):
 
49
                        srcnode = self.root.make_node(self.top_dir)
 
50
                        print("relocating the source directory %r -> %r" % (srcdir, self.top_dir))
 
51
                        srcnode.children = {}
 
52
 
 
53
                        for (k, v) in d.children.items():
 
54
                                srcnode.children[k] = v
 
55
                                v.parent = srcnode
 
56
                        d.children = {}
 
57
 
 
58
        old2(self)
 
59
 
 
60
Build.BuildContext.init_dirs = init_dirs
 
61
 
 
62
 
 
63
def uid(self):
 
64
        try:
 
65
                return self.uid_
 
66
        except AttributeError:
 
67
                # this is not a real hot zone, but we want to avoid surprizes here
 
68
                m = Utils.md5()
 
69
                up = m.update
 
70
                up(self.__class__.__name__.encode())
 
71
                for x in self.inputs + self.outputs:
 
72
                        up(x.path_from(x.ctx.srcnode).encode())
 
73
                self.uid_ = m.digest()
 
74
                return self.uid_
 
75
Task.Task.uid = uid
 
76
 
 
77
@feature('c', 'cxx', 'd', 'go', 'asm', 'fc', 'includes')
 
78
@after_method('propagate_uselib_vars', 'process_source')
 
79
def apply_incpaths(self):
 
80
        lst = self.to_incnodes(self.to_list(getattr(self, 'includes', [])) + self.env['INCLUDES'])
 
81
        self.includes_nodes = lst
 
82
        bld = self.bld
 
83
        self.env['INCPATHS'] = [x.is_child_of(bld.srcnode) and x.path_from(bld.bldnode) or x.abspath() for x in lst]
 
84
 
 
85