3 # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
5 import os,re,tempfile,shutil
6 from waflib import TaskGen,Task,Utils,Options,Build,Errors,Node,Logs
7 from waflib.Configure import conf
8 from waflib.TaskGen import feature,before_method,after_method
9 from waflib.Tools import ccroot
10 ccroot.USELIB_VARS['javac']=set(['CLASSPATH','JAVACFLAGS'])
13 class_check_source='''
15 public static void main(String[] argv) {
17 if (argv.length < 1) {
18 System.err.println("Missing argument");
22 lib = Class.forName(argv[0]);
23 } catch (ClassNotFoundException e) {
24 System.err.println("ClassNotFoundException");
33 @before_method('process_source')
35 Utils.def_attrs(self,jarname='',classpath='',sourcepath='.',srcdir='.',jar_mf_attributes={},jar_mf_classpath=[])
37 outdir=getattr(self,'outdir',None)
39 if not isinstance(outdir,Node.Node):
40 outdir=self.path.get_bld().make_node(self.outdir)
42 outdir=self.path.get_bld()
45 self.env['OUTDIR']=outdir.abspath()
46 self.javac_task=tsk=self.create_task('javac')
48 srcdir=getattr(self,'srcdir','')
49 if isinstance(srcdir,Node.Node):
51 for x in Utils.to_list(srcdir):
52 if isinstance(x,Node.Node):
55 y=self.path.find_dir(x)
57 self.bld.fatal('Could not find the folder %s from %s'%(x,self.path))
60 if getattr(self,'compat',None):
61 tsk.env.append_value('JAVACFLAGS',['-source',self.compat])
62 if hasattr(self,'sourcepath'):
63 fold=[isinstance(x,Node.Node)and x or self.path.find_dir(x)for x in self.to_list(self.sourcepath)]
64 names=os.pathsep.join([x.srcpath()for x in fold])
66 names=[x.srcpath()for x in tsk.srcdir]
68 tsk.env.append_value('JAVACFLAGS',['-sourcepath',names])
70 @after_method('apply_java')
71 def use_javac_files(self):
73 self.uselib=self.to_list(getattr(self,'uselib',[]))
74 names=self.to_list(getattr(self,'use',[]))
75 get=self.bld.get_tgen_by_name
83 lst.append(y.jar_task.outputs[0].abspath())
84 self.javac_task.set_run_after(y.jar_task)
86 self.env.append_value('CLASSPATH',lst)
88 @after_method('apply_java','propagate_uselib_vars','use_javac_files')
89 def set_classpath(self):
90 self.env.append_value('CLASSPATH',getattr(self,'classpath',[]))
92 x.env.CLASSPATH=os.pathsep.join(self.env.CLASSPATH)+os.pathsep
94 @after_method('apply_java','use_javac_files')
95 @before_method('process_source')
97 destfile=getattr(self,'destfile','test.jar')
98 jaropts=getattr(self,'jaropts',[])
99 manifest=getattr(self,'manifest',None)
100 basedir=getattr(self,'basedir',None)
102 if not isinstance(self.basedir,Node.Node):
103 basedir=self.path.get_bld().make_node(basedir)
105 basedir=self.path.get_bld()
107 self.bld.fatal('Could not find the basedir %r for %r'%(self.basedir,self))
108 self.jar_task=tsk=self.create_task('jar_create')
110 jarcreate=getattr(self,'jarcreate','cfm')
111 node=self.path.find_node(manifest)
112 tsk.dep_nodes.append(node)
113 jaropts.insert(0,node.abspath())
115 jarcreate=getattr(self,'jarcreate','cf')
116 if not isinstance(destfile,Node.Node):
117 destfile=self.path.find_or_declare(destfile)
119 self.bld.fatal('invalid destfile %r for %r'%(destfile,self))
120 tsk.set_outputs(destfile)
123 jaropts.append(basedir.bldpath())
125 tsk.env['JAROPTS']=jaropts
126 tsk.env['JARCREATE']=jarcreate
127 if getattr(self,'javac_task',None):
128 tsk.set_run_after(self.javac_task)
130 @after_method('jar_files')
131 def use_jar_files(self):
133 self.uselib=self.to_list(getattr(self,'uselib',[]))
134 names=self.to_list(getattr(self,'use',[]))
135 get=self.bld.get_tgen_by_name
140 self.uselib.append(x)
143 self.jar_task.run_after.update(y.tasks)
144 class jar_create(Task.Task):
146 run_str='${JAR} ${JARCREATE} ${TGT} ${JAROPTS}'
147 def runnable_status(self):
148 for t in self.run_after:
150 return Task.ASK_LATER
154 self.inputs=[x for x in self.basedir.ant_glob(JAR_RE,remove=False)if id(x)!=id(self.outputs[0])]
156 raise Errors.WafError('Could not find the basedir %r for %r'%(self.basedir,self))
157 return super(jar_create,self).runnable_status()
158 class javac(Task.Task):
160 vars=['CLASSPATH','JAVACFLAGS','JAVAC','OUTDIR']
161 def runnable_status(self):
162 for t in self.run_after:
164 return Task.ASK_LATER
168 for x in self.srcdir:
169 self.inputs.extend(x.ant_glob(SOURCE_RE,remove=False))
170 return super(javac,self).runnable_status()
175 wd=bld.bldnode.abspath()
177 if isinstance(xx,str):return[xx]
180 cmd.extend(to_list(env['JAVAC']))
181 cmd.extend(['-classpath'])
182 cmd.extend(to_list(env['CLASSPATH']))
184 cmd.extend(to_list(env['OUTDIR']))
185 cmd.extend(to_list(env['JAVACFLAGS']))
186 files=[a.path_from(bld.bldnode)for a in self.inputs]
189 if len(str(files))+len(str(cmd))>8192:
190 (fd,tmp)=tempfile.mkstemp(dir=bld.bldnode.abspath())
192 os.write(fd,'\n'.join(files))
197 Logs.debug('runner: %r'%(cmd+files))
201 ret=self.exec_command(cmd,cwd=wd,env=env.env or None)
207 for n in self.generator.outdir.ant_glob('**/*.class'):
208 n.sig=Utils.h_file(n.abspath())
209 self.generator.bld.task_sigs[self.uid()]=self.cache_sig
211 @after_method('process_rule')
212 def create_javadoc(self):
213 tsk=self.create_task('javadoc')
214 tsk.classpath=getattr(self,'classpath',[])
215 self.javadoc_package=Utils.to_list(self.javadoc_package)
216 if not isinstance(self.javadoc_output,Node.Node):
217 self.javadoc_output=self.bld.path.find_or_declare(self.javadoc_output)
218 class javadoc(Task.Task):
221 return'%s: %s -> %s\n'%(self.__class__.__name__,self.generator.srcdir,self.generator.javadoc_output)
224 bld=self.generator.bld
225 wd=bld.bldnode.abspath()
226 srcpath=self.generator.path.abspath()+os.sep+self.generator.srcdir
228 srcpath+=self.generator.path.get_bld().abspath()+os.sep+self.generator.srcdir
229 classpath=env.CLASSPATH
230 classpath+=os.pathsep
231 classpath+=os.pathsep.join(self.classpath)
232 classpath="".join(classpath)
234 lst.extend(Utils.to_list(env['JAVADOC']))
235 lst.extend(['-d',self.generator.javadoc_output.abspath()])
236 lst.extend(['-sourcepath',srcpath])
237 lst.extend(['-classpath',classpath])
238 lst.extend(['-subpackages'])
239 lst.extend(self.generator.javadoc_package)
240 lst=[x for x in lst if x]
241 self.generator.bld.cmd_and_log(lst,cwd=wd,env=env.env or None,quiet=0)
243 nodes=self.generator.javadoc_output.ant_glob('**')
245 x.sig=Utils.h_file(x.abspath())
246 self.generator.bld.task_sigs[self.uid()]=self.cache_sig
248 java_path=self.environ['PATH'].split(os.pathsep)
250 if'JAVA_HOME'in self.environ:
251 java_path=[os.path.join(self.environ['JAVA_HOME'],'bin')]+java_path
252 self.env['JAVA_HOME']=[self.environ['JAVA_HOME']]
253 for x in'javac java jar javadoc'.split():
254 self.find_program(x,var=x.upper(),path_list=java_path)
255 if'CLASSPATH'in self.environ:
256 v['CLASSPATH']=self.environ['CLASSPATH']
257 if not v['JAR']:self.fatal('jar is required for making java packages')
258 if not v['JAVAC']:self.fatal('javac is required for compiling java classes')
262 def check_java_class(self,classname,with_classpath=None):
263 javatestdir='.waf-javatest'
264 classpath=javatestdir
265 if self.env['CLASSPATH']:
266 classpath+=os.pathsep+self.env['CLASSPATH']
267 if isinstance(with_classpath,str):
268 classpath+=os.pathsep+with_classpath
269 shutil.rmtree(javatestdir,True)
270 os.mkdir(javatestdir)
271 Utils.writef(os.path.join(javatestdir,'Test.java'),class_check_source)
272 self.exec_command(self.env['JAVAC']+[os.path.join(javatestdir,'Test.java')],shell=False)
273 cmd=self.env['JAVA']+['-cp',classpath,'Test',classname]
274 self.to_log("%s\n"%str(cmd))
275 found=self.exec_command(cmd,shell=False)
276 self.msg('Checking for java class %s'%classname,not found)
277 shutil.rmtree(javatestdir,True)
280 def check_jni_headers(conf):
281 if not conf.env.CC_NAME and not conf.env.CXX_NAME:
282 conf.fatal('load a compiler first (gcc, g++, ..)')
283 if not conf.env.JAVA_HOME:
284 conf.fatal('set JAVA_HOME in the system environment')
285 javaHome=conf.env['JAVA_HOME'][0]
286 dir=conf.root.find_dir(conf.env.JAVA_HOME[0]+'/include')
288 dir=conf.root.find_dir(conf.env.JAVA_HOME[0]+'/../Headers')
290 conf.fatal('JAVA_HOME does not seem to be set properly')
291 f=dir.ant_glob('**/(jni|jni_md).h')
292 incDirs=[x.parent.abspath()for x in f]
293 dir=conf.root.find_dir(conf.env.JAVA_HOME[0])
294 f=dir.ant_glob('**/*jvm.(so|dll|dylib)')
295 libDirs=[x.parent.abspath()for x in f]or[javaHome]
296 f=dir.ant_glob('**/*jvm.(lib)')
298 libDirs=[[x,y.parent.abspath()]for x in libDirs for y in f]
301 conf.check(header_name='jni.h',define_name='HAVE_JNI_H',lib='jvm',libpath=d,includes=incDirs,uselib_store='JAVA',uselib='JAVA')
307 conf.fatal('could not find lib jvm in %r (see config.log)'%libDirs)