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