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,shutil 6from waflib import Task,Utils,Errors,Node 7from waflib.Configure import conf 8from waflib.TaskGen import feature,before_method,after_method 9from waflib.Tools import ccroot 10ccroot.USELIB_VARS['javac']=set(['CLASSPATH','JAVACFLAGS']) 11SOURCE_RE='**/*.java' 12JAR_RE='**/*' 13class_check_source=''' 14public class Test { 15 public static void main(String[] argv) { 16 Class lib; 17 if (argv.length < 1) { 18 System.err.println("Missing argument"); 19 System.exit(77); 20 } 21 try { 22 lib = Class.forName(argv[0]); 23 } catch (ClassNotFoundException e) { 24 System.err.println("ClassNotFoundException"); 25 System.exit(1); 26 } 27 lib = null; 28 System.exit(0); 29 } 30} 31''' 32@feature('javac') 33@before_method('process_source') 34def apply_java(self): 35 Utils.def_attrs(self,jarname='',classpath='',sourcepath='.',srcdir='.',jar_mf_attributes={},jar_mf_classpath=[]) 36 outdir=getattr(self,'outdir',None) 37 if outdir: 38 if not isinstance(outdir,Node.Node): 39 outdir=self.path.get_bld().make_node(self.outdir) 40 else: 41 outdir=self.path.get_bld() 42 outdir.mkdir() 43 self.outdir=outdir 44 self.env.OUTDIR=outdir.abspath() 45 self.javac_task=tsk=self.create_task('javac') 46 tmp=[] 47 srcdir=getattr(self,'srcdir','') 48 if isinstance(srcdir,Node.Node): 49 srcdir=[srcdir] 50 for x in Utils.to_list(srcdir): 51 if isinstance(x,Node.Node): 52 y=x 53 else: 54 y=self.path.find_dir(x) 55 if not y: 56 self.bld.fatal('Could not find the folder %s from %s'%(x,self.path)) 57 tmp.append(y) 58 tsk.srcdir=tmp 59 if getattr(self,'compat',None): 60 tsk.env.append_value('JAVACFLAGS',['-source',self.compat]) 61 if hasattr(self,'sourcepath'): 62 fold=[isinstance(x,Node.Node)and x or self.path.find_dir(x)for x in self.to_list(self.sourcepath)] 63 names=os.pathsep.join([x.srcpath()for x in fold]) 64 else: 65 names=[x.srcpath()for x in tsk.srcdir] 66 if names: 67 tsk.env.append_value('JAVACFLAGS',['-sourcepath',names]) 68@feature('javac') 69@after_method('apply_java') 70def use_javac_files(self): 71 lst=[] 72 self.uselib=self.to_list(getattr(self,'uselib',[])) 73 names=self.to_list(getattr(self,'use',[])) 74 get=self.bld.get_tgen_by_name 75 for x in names: 76 try: 77 y=get(x) 78 except Errors.WafError: 79 self.uselib.append(x) 80 else: 81 y.post() 82 if hasattr(y,'jar_task'): 83 lst.append(y.jar_task.outputs[0].abspath()) 84 self.javac_task.set_run_after(y.jar_task) 85 else: 86 for tsk in y.tasks: 87 self.javac_task.set_run_after(tsk) 88 self.env.append_value('CLASSPATH',lst) 89@feature('javac') 90@after_method('apply_java','propagate_uselib_vars','use_javac_files') 91def set_classpath(self): 92 self.env.append_value('CLASSPATH',getattr(self,'classpath',[])) 93 for x in self.tasks: 94 x.env.CLASSPATH=os.pathsep.join(self.env.CLASSPATH)+os.pathsep 95@feature('jar') 96@after_method('apply_java','use_javac_files') 97@before_method('process_source') 98def jar_files(self): 99 destfile=getattr(self,'destfile','test.jar') 100 jaropts=getattr(self,'jaropts',[]) 101 manifest=getattr(self,'manifest',None) 102 basedir=getattr(self,'basedir',None) 103 if basedir: 104 if not isinstance(self.basedir,Node.Node): 105 basedir=self.path.get_bld().make_node(basedir) 106 else: 107 basedir=self.path.get_bld() 108 if not basedir: 109 self.bld.fatal('Could not find the basedir %r for %r'%(self.basedir,self)) 110 self.jar_task=tsk=self.create_task('jar_create') 111 if manifest: 112 jarcreate=getattr(self,'jarcreate','cfm') 113 if not isinstance(manifest,Node.Node): 114 node=self.path.find_or_declare(manifest) 115 else: 116 node=manifest 117 tsk.dep_nodes.append(node) 118 jaropts.insert(0,node.abspath()) 119 else: 120 jarcreate=getattr(self,'jarcreate','cf') 121 if not isinstance(destfile,Node.Node): 122 destfile=self.path.find_or_declare(destfile) 123 if not destfile: 124 self.bld.fatal('invalid destfile %r for %r'%(destfile,self)) 125 tsk.set_outputs(destfile) 126 tsk.basedir=basedir 127 jaropts.append('-C') 128 jaropts.append(basedir.bldpath()) 129 jaropts.append('.') 130 tsk.env.JAROPTS=jaropts 131 tsk.env.JARCREATE=jarcreate 132 if getattr(self,'javac_task',None): 133 tsk.set_run_after(self.javac_task) 134@feature('jar') 135@after_method('jar_files') 136def use_jar_files(self): 137 self.uselib=self.to_list(getattr(self,'uselib',[])) 138 names=self.to_list(getattr(self,'use',[])) 139 get=self.bld.get_tgen_by_name 140 for x in names: 141 try: 142 y=get(x) 143 except Errors.WafError: 144 self.uselib.append(x) 145 else: 146 y.post() 147 self.jar_task.run_after.update(y.tasks) 148class JTask(Task.Task): 149 def split_argfile(self,cmd): 150 inline=[cmd[0]] 151 infile=[] 152 for x in cmd[1:]: 153 if x.startswith('-J'): 154 inline.append(x) 155 else: 156 infile.append(self.quote_flag(x)) 157 return(inline,infile) 158class jar_create(JTask): 159 color='GREEN' 160 run_str='${JAR} ${JARCREATE} ${TGT} ${JAROPTS}' 161 def runnable_status(self): 162 for t in self.run_after: 163 if not t.hasrun: 164 return Task.ASK_LATER 165 if not self.inputs: 166 global JAR_RE 167 try: 168 self.inputs=[x for x in self.basedir.ant_glob(JAR_RE,remove=False)if id(x)!=id(self.outputs[0])] 169 except Exception: 170 raise Errors.WafError('Could not find the basedir %r for %r'%(self.basedir,self)) 171 return super(jar_create,self).runnable_status() 172class javac(JTask): 173 color='BLUE' 174 run_str='${JAVAC} -classpath ${CLASSPATH} -d ${OUTDIR} ${JAVACFLAGS} ${SRC}' 175 vars=['CLASSPATH','JAVACFLAGS','JAVAC','OUTDIR'] 176 def uid(self): 177 lst=[self.__class__.__name__,self.generator.outdir.abspath()] 178 for x in self.srcdir: 179 lst.append(x.abspath()) 180 return Utils.h_list(lst) 181 def runnable_status(self): 182 for t in self.run_after: 183 if not t.hasrun: 184 return Task.ASK_LATER 185 if not self.inputs: 186 global SOURCE_RE 187 self.inputs=[] 188 for x in self.srcdir: 189 self.inputs.extend(x.ant_glob(SOURCE_RE,remove=False)) 190 return super(javac,self).runnable_status() 191 def post_run(self): 192 for node in self.generator.outdir.ant_glob('**/*.class'): 193 self.generator.bld.node_sigs[node]=self.uid() 194 self.generator.bld.task_sigs[self.uid()]=self.cache_sig 195@feature('javadoc') 196@after_method('process_rule') 197def create_javadoc(self): 198 tsk=self.create_task('javadoc') 199 tsk.classpath=getattr(self,'classpath',[]) 200 self.javadoc_package=Utils.to_list(self.javadoc_package) 201 if not isinstance(self.javadoc_output,Node.Node): 202 self.javadoc_output=self.bld.path.find_or_declare(self.javadoc_output) 203class javadoc(Task.Task): 204 color='BLUE' 205 def __str__(self): 206 return'%s: %s -> %s\n'%(self.__class__.__name__,self.generator.srcdir,self.generator.javadoc_output) 207 def run(self): 208 env=self.env 209 bld=self.generator.bld 210 wd=bld.bldnode 211 srcpath=self.generator.path.abspath()+os.sep+self.generator.srcdir 212 srcpath+=os.pathsep 213 srcpath+=self.generator.path.get_bld().abspath()+os.sep+self.generator.srcdir 214 classpath=env.CLASSPATH 215 classpath+=os.pathsep 216 classpath+=os.pathsep.join(self.classpath) 217 classpath="".join(classpath) 218 self.last_cmd=lst=[] 219 lst.extend(Utils.to_list(env.JAVADOC)) 220 lst.extend(['-d',self.generator.javadoc_output.abspath()]) 221 lst.extend(['-sourcepath',srcpath]) 222 lst.extend(['-classpath',classpath]) 223 lst.extend(['-subpackages']) 224 lst.extend(self.generator.javadoc_package) 225 lst=[x for x in lst if x] 226 self.generator.bld.cmd_and_log(lst,cwd=wd,env=env.env or None,quiet=0) 227 def post_run(self): 228 nodes=self.generator.javadoc_output.ant_glob('**') 229 for node in nodes: 230 self.generator.bld.node_sigs[node]=self.uid() 231 self.generator.bld.task_sigs[self.uid()]=self.cache_sig 232def configure(self): 233 java_path=self.environ['PATH'].split(os.pathsep) 234 v=self.env 235 if'JAVA_HOME'in self.environ: 236 java_path=[os.path.join(self.environ['JAVA_HOME'],'bin')]+java_path 237 self.env.JAVA_HOME=[self.environ['JAVA_HOME']] 238 for x in'javac java jar javadoc'.split(): 239 self.find_program(x,var=x.upper(),path_list=java_path) 240 if'CLASSPATH'in self.environ: 241 v.CLASSPATH=self.environ['CLASSPATH'] 242 if not v.JAR: 243 self.fatal('jar is required for making java packages') 244 if not v.JAVAC: 245 self.fatal('javac is required for compiling java classes') 246 v.JARCREATE='cf' 247 v.JAVACFLAGS=[] 248@conf 249def check_java_class(self,classname,with_classpath=None): 250 javatestdir='.waf-javatest' 251 classpath=javatestdir 252 if self.env.CLASSPATH: 253 classpath+=os.pathsep+self.env.CLASSPATH 254 if isinstance(with_classpath,str): 255 classpath+=os.pathsep+with_classpath 256 shutil.rmtree(javatestdir,True) 257 os.mkdir(javatestdir) 258 Utils.writef(os.path.join(javatestdir,'Test.java'),class_check_source) 259 self.exec_command(self.env.JAVAC+[os.path.join(javatestdir,'Test.java')],shell=False) 260 cmd=self.env.JAVA+['-cp',classpath,'Test',classname] 261 self.to_log("%s\n"%str(cmd)) 262 found=self.exec_command(cmd,shell=False) 263 self.msg('Checking for java class %s'%classname,not found) 264 shutil.rmtree(javatestdir,True) 265 return found 266@conf 267def check_jni_headers(conf): 268 if not conf.env.CC_NAME and not conf.env.CXX_NAME: 269 conf.fatal('load a compiler first (gcc, g++, ..)') 270 if not conf.env.JAVA_HOME: 271 conf.fatal('set JAVA_HOME in the system environment') 272 javaHome=conf.env.JAVA_HOME[0] 273 dir=conf.root.find_dir(conf.env.JAVA_HOME[0]+'/include') 274 if dir is None: 275 dir=conf.root.find_dir(conf.env.JAVA_HOME[0]+'/../Headers') 276 if dir is None: 277 conf.fatal('JAVA_HOME does not seem to be set properly') 278 f=dir.ant_glob('**/(jni|jni_md).h') 279 incDirs=[x.parent.abspath()for x in f] 280 dir=conf.root.find_dir(conf.env.JAVA_HOME[0]) 281 f=dir.ant_glob('**/*jvm.(so|dll|dylib)') 282 libDirs=[x.parent.abspath()for x in f]or[javaHome] 283 f=dir.ant_glob('**/*jvm.(lib)') 284 if f: 285 libDirs=[[x,y.parent.abspath()]for x in libDirs for y in f] 286 if conf.env.DEST_OS=='freebsd': 287 conf.env.append_unique('LINKFLAGS_JAVA','-pthread') 288 if conf.env.DEST_OS=='dragonfly': 289 conf.env.append_unique('LINKFLAGS_JAVA','-pthread') 290 for d in libDirs: 291 try: 292 conf.check(header_name='jni.h',define_name='HAVE_JNI_H',lib='jvm',libpath=d,includes=incDirs,uselib_store='JAVA',uselib='JAVA') 293 except Exception: 294 pass 295 else: 296 break 297 else: 298 conf.fatal('could not find lib jvm in %r (see config.log)'%libDirs) 299