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