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
5import os,tempfile,optparse,sys,re
6from waflib import Logs,Utils,Context,Errors
7options=optparse.Values()
8commands=[]
9envvars=[]
10lockfile=os.environ.get('WAFLOCK','.lock-waf_%s_build'%sys.platform)
11class opt_parser(optparse.OptionParser):
12	def __init__(self,ctx,allow_unknown=False):
13		optparse.OptionParser.__init__(self,conflict_handler='resolve',add_help_option=False,version='waf %s (%s)'%(Context.WAFVERSION,Context.WAFREVISION))
14		self.formatter.width=Logs.get_term_cols()
15		self.ctx=ctx
16		self.allow_unknown=allow_unknown
17	def _process_args(self,largs,rargs,values):
18		while rargs:
19			try:
20				optparse.OptionParser._process_args(self,largs,rargs,values)
21			except(optparse.BadOptionError,optparse.AmbiguousOptionError)as e:
22				if self.allow_unknown:
23					largs.append(e.opt_str)
24				else:
25					self.error(str(e))
26	def print_usage(self,file=None):
27		return self.print_help(file)
28	def get_usage(self):
29		cmds_str={}
30		for cls in Context.classes:
31			if not cls.cmd or cls.cmd=='options'or cls.cmd.startswith('_'):
32				continue
33			s=cls.__doc__ or''
34			cmds_str[cls.cmd]=s
35		if Context.g_module:
36			for(k,v)in Context.g_module.__dict__.items():
37				if k in('options','init','shutdown'):
38					continue
39				if type(v)is type(Context.create_context):
40					if v.__doc__ and not k.startswith('_'):
41						cmds_str[k]=v.__doc__
42		just=0
43		for k in cmds_str:
44			just=max(just,len(k))
45		lst=['  %s: %s'%(k.ljust(just),v)for(k,v)in cmds_str.items()]
46		lst.sort()
47		ret='\n'.join(lst)
48		return'''waf [commands] [options]
49
50Main commands (example: ./waf build -j4)
51%s
52'''%ret
53class OptionsContext(Context.Context):
54	cmd='options'
55	fun='options'
56	def __init__(self,**kw):
57		super(OptionsContext,self).__init__(**kw)
58		self.parser=opt_parser(self)
59		self.option_groups={}
60		jobs=self.jobs()
61		p=self.add_option
62		color=os.environ.get('NOCOLOR','')and'no'or'auto'
63		if os.environ.get('CLICOLOR','')=='0':
64			color='no'
65		elif os.environ.get('CLICOLOR_FORCE','')=='1':
66			color='yes'
67		p('-c','--color',dest='colors',default=color,action='store',help='whether to use colors (yes/no/auto) [default: auto]',choices=('yes','no','auto'))
68		p('-j','--jobs',dest='jobs',default=jobs,type='int',help='amount of parallel jobs (%r)'%jobs)
69		p('-k','--keep',dest='keep',default=0,action='count',help='continue despite errors (-kk to try harder)')
70		p('-v','--verbose',dest='verbose',default=0,action='count',help='verbosity level -v -vv or -vvv [default: 0]')
71		p('--zones',dest='zones',default='',action='store',help='debugging zones (task_gen, deps, tasks, etc)')
72		p('--profile',dest='profile',default=0,action='store_true',help=optparse.SUPPRESS_HELP)
73		p('--pdb',dest='pdb',default=0,action='store_true',help=optparse.SUPPRESS_HELP)
74		p('-h','--help',dest='whelp',default=0,action='store_true',help="show this help message and exit")
75		gr=self.add_option_group('Configuration options')
76		self.option_groups['configure options']=gr
77		gr.add_option('-o','--out',action='store',default='',help='build dir for the project',dest='out')
78		gr.add_option('-t','--top',action='store',default='',help='src dir for the project',dest='top')
79		gr.add_option('--no-lock-in-run',action='store_true',default='',help=optparse.SUPPRESS_HELP,dest='no_lock_in_run')
80		gr.add_option('--no-lock-in-out',action='store_true',default='',help=optparse.SUPPRESS_HELP,dest='no_lock_in_out')
81		gr.add_option('--no-lock-in-top',action='store_true',default='',help=optparse.SUPPRESS_HELP,dest='no_lock_in_top')
82		default_prefix=getattr(Context.g_module,'default_prefix',os.environ.get('PREFIX'))
83		if not default_prefix:
84			if Utils.unversioned_sys_platform()=='win32':
85				d=tempfile.gettempdir()
86				default_prefix=d[0].upper()+d[1:]
87			else:
88				default_prefix='/usr/local/'
89		gr.add_option('--prefix',dest='prefix',default=default_prefix,help='installation prefix [default: %r]'%default_prefix)
90		gr.add_option('--bindir',dest='bindir',help='bindir')
91		gr.add_option('--libdir',dest='libdir',help='libdir')
92		gr=self.add_option_group('Build and installation options')
93		self.option_groups['build and install options']=gr
94		gr.add_option('-p','--progress',dest='progress_bar',default=0,action='count',help='-p: progress bar; -pp: ide output')
95		gr.add_option('--targets',dest='targets',default='',action='store',help='task generators, e.g. "target1,target2"')
96		gr=self.add_option_group('Step options')
97		self.option_groups['step options']=gr
98		gr.add_option('--files',dest='files',default='',action='store',help='files to process, by regexp, e.g. "*/main.c,*/test/main.o"')
99		default_destdir=os.environ.get('DESTDIR','')
100		gr=self.add_option_group('Installation and uninstallation options')
101		self.option_groups['install/uninstall options']=gr
102		gr.add_option('--destdir',help='installation root [default: %r]'%default_destdir,default=default_destdir,dest='destdir')
103		gr.add_option('-f','--force',dest='force',default=False,action='store_true',help='force file installation')
104		gr.add_option('--distcheck-args',metavar='ARGS',help='arguments to pass to distcheck',default=None,action='store')
105	def jobs(self):
106		count=int(os.environ.get('JOBS',0))
107		if count<1:
108			if'NUMBER_OF_PROCESSORS'in os.environ:
109				count=int(os.environ.get('NUMBER_OF_PROCESSORS',1))
110			else:
111				if hasattr(os,'sysconf_names'):
112					if'SC_NPROCESSORS_ONLN'in os.sysconf_names:
113						count=int(os.sysconf('SC_NPROCESSORS_ONLN'))
114					elif'SC_NPROCESSORS_CONF'in os.sysconf_names:
115						count=int(os.sysconf('SC_NPROCESSORS_CONF'))
116				if not count and os.name not in('nt','java'):
117					try:
118						tmp=self.cmd_and_log(['sysctl','-n','hw.ncpu'],quiet=0)
119					except Errors.WafError:
120						pass
121					else:
122						if re.match('^[0-9]+$',tmp):
123							count=int(tmp)
124		if count<1:
125			count=1
126		elif count>1024:
127			count=1024
128		return count
129	def add_option(self,*k,**kw):
130		return self.parser.add_option(*k,**kw)
131	def add_option_group(self,*k,**kw):
132		try:
133			gr=self.option_groups[k[0]]
134		except KeyError:
135			gr=self.parser.add_option_group(*k,**kw)
136		self.option_groups[k[0]]=gr
137		return gr
138	def get_option_group(self,opt_str):
139		try:
140			return self.option_groups[opt_str]
141		except KeyError:
142			for group in self.parser.option_groups:
143				if group.title==opt_str:
144					return group
145			return None
146	def sanitize_path(self,path,cwd=None):
147		if not cwd:
148			cwd=Context.launch_dir
149		p=os.path.expanduser(path)
150		p=os.path.join(cwd,p)
151		p=os.path.normpath(p)
152		p=os.path.abspath(p)
153		return p
154	def parse_cmd_args(self,_args=None,cwd=None,allow_unknown=False):
155		self.parser.allow_unknown=allow_unknown
156		(options,leftover_args)=self.parser.parse_args(args=_args)
157		envvars=[]
158		commands=[]
159		for arg in leftover_args:
160			if'='in arg:
161				envvars.append(arg)
162			elif arg!='options':
163				commands.append(arg)
164		for name in'top out destdir prefix bindir libdir'.split():
165			if getattr(options,name,None):
166				path=self.sanitize_path(getattr(options,name),cwd)
167				setattr(options,name,path)
168		return options,commands,envvars
169	def init_module_vars(self,arg_options,arg_commands,arg_envvars):
170		options.__dict__.clear()
171		del commands[:]
172		del envvars[:]
173		options.__dict__.update(arg_options.__dict__)
174		commands.extend(arg_commands)
175		envvars.extend(arg_envvars)
176		for var in envvars:
177			(name,value)=var.split('=',1)
178			os.environ[name.strip()]=value
179	def init_logs(self,options,commands,envvars):
180		Logs.verbose=options.verbose
181		if options.verbose>=1:
182			self.load('errcheck')
183		colors={'yes':2,'auto':1,'no':0}[options.colors]
184		Logs.enable_colors(colors)
185		if options.zones:
186			Logs.zones=options.zones.split(',')
187			if not Logs.verbose:
188				Logs.verbose=1
189		elif Logs.verbose>0:
190			Logs.zones=['runner']
191		if Logs.verbose>2:
192			Logs.zones=['*']
193	def parse_args(self,_args=None):
194		options,commands,envvars=self.parse_cmd_args()
195		self.init_logs(options,commands,envvars)
196		self.init_module_vars(options,commands,envvars)
197	def execute(self):
198		super(OptionsContext,self).execute()
199		self.parse_args()
200		Utils.alloc_process_pool(options.jobs)
201