waf

FORK: waf with some random patches
git clone https://git.neptards.moe/neptards/waf.git
Log | Files | Refs | README

bjam.py (3893B)


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