1#! /usr/bin/env python
2# encoding: utf-8
3
4"""
5Waf 1.6
6
7Try to detect if the project directory was relocated, and if it was,
8change the node representing the project directory. Just call:
9
10 waf configure build
11
12Note that if the project directory name changes, the signatures for the tasks using
13files in that directory will change, causing a partial build.
14"""
15
16import os
17from waflib import Build, ConfigSet, Task, Utils, Errors
18from waflib.TaskGen import feature, after_method
19
20EXTRA_LOCK = '.old_srcdir'
21
22old1 = Build.BuildContext.store
23def 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)
29Build.BuildContext.store = store
30
31old2 = Build.BuildContext.init_dirs
32def 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
60Build.BuildContext.init_dirs = init_dirs
61
62
63def uid(self):
64	try:
65		return self.uid_
66	except AttributeError:
67		# this is not a real hot zone, but we want to avoid surprises 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_
75Task.Task.uid = uid
76
77@feature('c', 'cxx', 'd', 'go', 'asm', 'fc', 'includes')
78@after_method('propagate_uselib_vars', 'process_source')
79def 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
86