third_party:waf: update to upstream 2.0.4 release
[samba.git] / third_party / waf / waflib / extras / bjam.py
1 #! /usr/bin/env python
2 # encoding: utf-8
3 # WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file
4
5 #! /usr/bin/env python
6 # per rosengren 2011
7
8 from os import sep, readlink
9 from waflib import Logs
10 from waflib.TaskGen import feature, after_method
11 from waflib.Task import Task, always_run
12
13 def options(opt):
14         grp = opt.add_option_group('Bjam Options')
15         grp.add_option('--bjam_src', default=None, help='You can find it in <boost root>/tools/jam/src')
16         grp.add_option('--bjam_uname', default='linuxx86_64', help='bjam is built in <src>/bin.<uname>/bjam')
17         grp.add_option('--bjam_config', default=None)
18         grp.add_option('--bjam_toolset', default=None)
19
20 def configure(cnf):
21         if not cnf.env.BJAM_SRC:
22                 cnf.env.BJAM_SRC = cnf.options.bjam_src
23         if not cnf.env.BJAM_UNAME:
24                 cnf.env.BJAM_UNAME = cnf.options.bjam_uname
25         try:
26                 cnf.find_program('bjam', path_list=[
27                         cnf.env.BJAM_SRC + sep + 'bin.' + cnf.env.BJAM_UNAME
28                 ])
29         except Exception:
30                 cnf.env.BJAM = None
31         if not cnf.env.BJAM_CONFIG:
32                 cnf.env.BJAM_CONFIG = cnf.options.bjam_config
33         if not cnf.env.BJAM_TOOLSET:
34                 cnf.env.BJAM_TOOLSET = cnf.options.bjam_toolset
35
36 @feature('bjam')
37 @after_method('process_rule')
38 def process_bjam(self):
39         if not self.bld.env.BJAM:
40                 self.create_task('bjam_creator')
41         self.create_task('bjam_build')
42         self.create_task('bjam_installer')
43         if getattr(self, 'always', False):
44                 always_run(bjam_creator)
45                 always_run(bjam_build)
46         always_run(bjam_installer)
47
48 class bjam_creator(Task):
49         ext_out = 'bjam_exe'
50         vars=['BJAM_SRC', 'BJAM_UNAME']
51         def run(self):
52                 env = self.env
53                 gen = self.generator
54                 bjam = gen.bld.root.find_dir(env.BJAM_SRC)
55                 if not bjam:
56                         Logs.error('Can not find bjam source')
57                         return -1
58                 bjam_exe_relpath = 'bin.' + env.BJAM_UNAME + '/bjam'
59                 bjam_exe = bjam.find_resource(bjam_exe_relpath)
60                 if bjam_exe:
61                         env.BJAM = bjam_exe.srcpath()
62                         return 0
63                 bjam_cmd = ['./build.sh']
64                 Logs.debug('runner: ' + bjam.srcpath() + '> ' + str(bjam_cmd))
65                 result = self.exec_command(bjam_cmd, cwd=bjam.srcpath())
66                 if not result == 0:
67                         Logs.error('bjam failed')
68                         return -1
69                 bjam_exe = bjam.find_resource(bjam_exe_relpath)
70                 if bjam_exe:
71                         env.BJAM = bjam_exe.srcpath()
72                         return 0
73                 Logs.error('bjam failed')
74                 return -1
75
76 class bjam_build(Task):
77         ext_in = 'bjam_exe'
78         ext_out = 'install'
79         vars = ['BJAM_TOOLSET']
80         def run(self):
81                 env = self.env
82                 gen = self.generator
83                 path = gen.path
84                 bld = gen.bld
85                 if hasattr(gen, 'root'):
86                         build_root = path.find_node(gen.root)
87                 else:
88                         build_root = path
89                 jam = bld.srcnode.find_resource(env.BJAM_CONFIG)
90                 if jam:
91                         Logs.debug('bjam: Using jam configuration from ' + jam.srcpath())
92                         jam_rel = jam.relpath_gen(build_root)
93                 else:
94                         Logs.warn('No build configuration in build_config/user-config.jam. Using default')
95                         jam_rel = None
96                 bjam_exe = bld.srcnode.find_node(env.BJAM)
97                 if not bjam_exe:
98                         Logs.error('env.BJAM is not set')
99                         return -1
100                 bjam_exe_rel = bjam_exe.relpath_gen(build_root)
101                 cmd = ([bjam_exe_rel] +
102                         (['--user-config=' + jam_rel] if jam_rel else []) +
103                         ['--stagedir=' + path.get_bld().path_from(build_root)] +
104                         ['--debug-configuration'] +
105                         ['--with-' + lib for lib in self.generator.target] +
106                         (['toolset=' + env.BJAM_TOOLSET] if env.BJAM_TOOLSET else []) +
107                         ['link=' + 'shared'] +
108                         ['variant=' + 'release']
109                 )
110                 Logs.debug('runner: ' + build_root.srcpath() + '> ' + str(cmd))
111                 ret = self.exec_command(cmd, cwd=build_root.srcpath())
112                 if ret != 0:
113                         return ret
114                 self.set_outputs(path.get_bld().ant_glob('lib/*') + path.get_bld().ant_glob('bin/*'))
115                 return 0
116
117 class bjam_installer(Task):
118         ext_in = 'install'
119         def run(self):
120                 gen = self.generator
121                 path = gen.path
122                 for idir, pat in (('${LIBDIR}', 'lib/*'), ('${BINDIR}', 'bin/*')):
123                         files = []
124                         for n in path.get_bld().ant_glob(pat):
125                                 try:
126                                         t = readlink(n.srcpath())
127                                         gen.bld.symlink_as(sep.join([idir, n.name]), t, postpone=False)
128                                 except OSError:
129                                         files.append(n)
130                         gen.bld.install_files(idir, files, postpone=False)
131                 return 0
132