waf

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

cfg_altoptions.py (2825B)


      1 #!/usr/bin/python
      2 # -*- coding: utf-8 -*-
      3 # Tool to extend c_config.check_cfg()
      4 
      5 __author__ = __maintainer__ = "Jérôme Carretero <cJ-waf@zougloub.eu>"
      6 __copyright__ = "Jérôme Carretero, 2014"
      7 
      8 """
      9 
     10 This tool allows to work around the absence of ``*-config`` programs
     11 on systems, by keeping the same clean configuration syntax but inferring
     12 values or permitting their modification via the options interface.
     13 
     14 Note that pkg-config can also support setting ``PKG_CONFIG_PATH``,
     15 so you can put custom files in a folder containing new .pc files.
     16 This tool could also be implemented by taking advantage of this fact.
     17 
     18 Usage::
     19 
     20    def options(opt):
     21      opt.load('c_config_alt')
     22      opt.add_package_option('package')
     23 
     24    def configure(cfg):
     25      conf.load('c_config_alt')
     26      conf.check_cfg(...)
     27 
     28 Known issues:
     29 
     30 - Behavior with different build contexts...
     31 
     32 """
     33 
     34 import os
     35 import functools
     36 from waflib import Configure, Options, Errors
     37 
     38 def name_to_dest(x):
     39 	return x.lower().replace('-', '_')
     40 
     41 
     42 def options(opt):
     43 	def x(opt, param):
     44 		dest = name_to_dest(param)
     45 		gr = opt.get_option_group("configure options")
     46 		gr.add_option('--%s-root' % dest,
     47 		 help="path containing include and lib subfolders for %s" \
     48 		  % param,
     49 		)
     50 
     51 	opt.add_package_option = functools.partial(x, opt)
     52 
     53 
     54 check_cfg_old = getattr(Configure.ConfigurationContext, 'check_cfg')
     55 
     56 @Configure.conf
     57 def check_cfg(conf, *k, **kw):
     58 	if k:
     59 		lst = k[0].split()
     60 		kw['package'] = lst[0]
     61 		kw['args'] = ' '.join(lst[1:])
     62 
     63 	if not 'package' in kw:
     64 		return check_cfg_old(conf, **kw)
     65 
     66 	package = kw['package']
     67 
     68 	package_lo = name_to_dest(package)
     69 	package_hi = package.upper().replace('-', '_') # TODO FIXME
     70 	package_hi = kw.get('uselib_store', package_hi)
     71 
     72 	def check_folder(path, name):
     73 		try:
     74 			assert os.path.isdir(path)
     75 		except AssertionError:
     76 			raise Errors.ConfigurationError(
     77 				"%s_%s (%s) is not a folder!" \
     78 				% (package_lo, name, path))
     79 		return path
     80 
     81 	root = getattr(Options.options, '%s_root' % package_lo, None)
     82 
     83 	if root is None:
     84 		return check_cfg_old(conf, **kw)
     85 	else:
     86 		def add_manual_var(k, v):
     87 			conf.start_msg('Adding for %s a manual var' % (package))
     88 			conf.env["%s_%s" % (k, package_hi)] = v
     89 			conf.end_msg("%s = %s" % (k, v))
     90 
     91 
     92 		check_folder(root, 'root')
     93 
     94 		pkg_inc = check_folder(os.path.join(root, "include"), 'inc')
     95 		add_manual_var('INCLUDES', [pkg_inc])
     96 		pkg_lib = check_folder(os.path.join(root, "lib"), 'libpath')
     97 		add_manual_var('LIBPATH', [pkg_lib])
     98 		add_manual_var('LIB', [package])
     99 
    100 		for x in kw.get('manual_deps', []):
    101 			for k, v in sorted(conf.env.get_merged_dict().items()):
    102 				if k.endswith('_%s' % x):
    103 					k = k.replace('_%s' % x, '')
    104 					conf.start_msg('Adding for %s a manual dep' \
    105 					 %(package))
    106 					conf.env["%s_%s" % (k, package_hi)] += v
    107 					conf.end_msg('%s += %s' % (k, v))
    108 
    109 		return True
    110