1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
#! /usr/bin/env python
# encoding: utf-8
import sys
if sys.hexversion < 0x020400f0: from sets import Set as set
import os,re
from Configure import conf
import TaskGen,Task,Utils,Options,Build
from TaskGen import feature,before,taskgen
class_check_source='''
public class Test {
public static void main(String[] argv) {
Class lib;
if (argv.length < 1) {
System.err.println("Missing argument");
System.exit(77);
}
try {
lib = Class.forName(argv[0]);
} catch (ClassNotFoundException e) {
System.err.println("ClassNotFoundException");
System.exit(1);
}
lib = null;
System.exit(0);
}
}
'''
def jar_files(self):
basedir=getattr(self,'basedir','.')
destfile=getattr(self,'destfile','test.jar')
jaropts=getattr(self,'jaropts',[])
jarcreate=getattr(self,'jarcreate','cf')
dir=self.path.find_dir(basedir)
if not dir:raise
jaropts.append('-C')
jaropts.append(dir.abspath(self.env))
jaropts.append('.')
out=self.path.find_or_declare(destfile)
tsk=self.create_task('jar_create')
tsk.set_outputs(out)
tsk.inputs=[x for x in dir.find_iter(src=0,bld=1)if x.id!=out.id]
tsk.env['JAROPTS']=jaropts
tsk.env['JARCREATE']=jarcreate
def apply_java(self):
Utils.def_attrs(self,jarname='',jaropts='',classpath='',sourcepath='.',srcdir='.',source_re='**/*.java',jar_mf_attributes={},jar_mf_classpath=[])
if getattr(self,'source_root',None):
self.srcdir=self.source_root
nodes_lst=[]
if not self.classpath:
if not self.env['CLASSPATH']:
self.env['CLASSPATH']='..'+os.pathsep+'.'
else:
self.env['CLASSPATH']=self.classpath
srcdir_node=self.path.find_dir(self.srcdir)
if not srcdir_node:
raise Utils.WafError('could not find srcdir %r'%self.srcdir)
src_nodes=[x for x in srcdir_node.ant_glob(self.source_re,flat=False)]
bld_nodes=[x.change_ext('.class')for x in src_nodes]
self.env['OUTDIR']=[srcdir_node.abspath(self.env)]
tsk=self.create_task('javac')
tsk.set_inputs(src_nodes)
tsk.set_outputs(bld_nodes)
if getattr(self,'compat',None):
tsk.env.append_value('JAVACFLAGS',['-source',self.compat])
if hasattr(self,'sourcepath'):
fold=[self.path.find_dir(x)for x in self.to_list(self.sourcepath)]
names=os.pathsep.join([x.srcpath()for x in fold])
else:
names=srcdir_node.srcpath()
if names:
tsk.env.append_value('JAVACFLAGS',['-sourcepath',names])
if self.jarname:
jtsk=self.create_task('jar_create',bld_nodes,self.path.find_or_declare(self.jarname))
jtsk.set_run_after(tsk)
if not self.env.JAROPTS:
if self.jaropts:
self.env.JAROPTS=self.jaropts
else:
dirs='.'
self.env.JAROPTS=['-C',''.join(self.env['OUTDIR']),dirs]
Task.simple_task_type('jar_create','${JAR} ${JARCREATE} ${TGT} ${JAROPTS}',color='GREEN')
cls=Task.simple_task_type('javac','${JAVAC} -classpath ${CLASSPATH} -d ${OUTDIR} ${JAVACFLAGS} ${SRC}')
cls.color='BLUE'
def post_run_javac(self):
par={}
for x in self.inputs:
par[x.parent.id]=x.parent
inner={}
for k in par.values():
path=k.abspath(self.env)
lst=os.listdir(path)
for u in lst:
if u.find('$')>=0:
inner_class_node=k.find_or_declare(u)
inner[inner_class_node.id]=inner_class_node
to_add=set(inner.keys())-set([x.id for x in self.outputs])
for x in to_add:
self.outputs.append(inner[x])
return Task.Task.post_run(self)
cls.post_run=post_run_javac
def detect(conf):
java_path=conf.environ['PATH'].split(os.pathsep)
v=conf.env
if'JAVA_HOME'in conf.environ:
java_path=[os.path.join(conf.environ['JAVA_HOME'],'bin')]+java_path
conf.env['JAVA_HOME']=[conf.environ['JAVA_HOME']]
for x in'javac java jar'.split():
conf.find_program(x,var=x.upper(),path_list=java_path)
conf.env[x.upper()]=conf.cmd_to_list(conf.env[x.upper()])
v['JAVA_EXT']=['.java']
if'CLASSPATH'in conf.environ:
v['CLASSPATH']=conf.environ['CLASSPATH']
if not v['JAR']:conf.fatal('jar is required for making java packages')
if not v['JAVAC']:conf.fatal('javac is required for compiling java classes')
v['JARCREATE']='cf'
def check_java_class(self,classname,with_classpath=None):
import shutil
javatestdir='.waf-javatest'
classpath=javatestdir
if self.env['CLASSPATH']:
classpath+=os.pathsep+self.env['CLASSPATH']
if isinstance(with_classpath,str):
classpath+=os.pathsep+with_classpath
shutil.rmtree(javatestdir,True)
os.mkdir(javatestdir)
java_file=open(os.path.join(javatestdir,'Test.java'),'w')
java_file.write(class_check_source)
java_file.close()
Utils.exec_command(self.env['JAVAC']+[os.path.join(javatestdir,'Test.java')],shell=False)
cmd=self.env['JAVA']+['-cp',classpath,'Test',classname]
self.log.write("%s\n"%str(cmd))
found=Utils.exec_command(cmd,shell=False,log=self.log)
self.check_message('Java class %s'%classname,"",not found)
shutil.rmtree(javatestdir,True)
return found
def check_jni_headers(conf):
if not conf.env.CC_NAME and not conf.env.CXX_NAME:
conf.fatal('load a compiler first (gcc, g++, ..)')
if not conf.env.JAVA_HOME:
conf.fatal('set JAVA_HOME in the system environment')
javaHome=conf.env['JAVA_HOME'][0]
b=Build.BuildContext()
b.load_dirs(conf.srcdir,conf.blddir)
dir=b.root.find_dir(conf.env.JAVA_HOME[0]+'/include')
f=dir.ant_glob('**/(jni|jni_md).h',flat=False)
incDirs=[x.parent.abspath()for x in f]
dir=b.root.find_dir(conf.env.JAVA_HOME[0])
f=dir.ant_glob('**/*jvm.(so|dll)',flat=False)
libDirs=[x.parent.abspath()for x in f]or[javaHome]
for i,d in enumerate(libDirs):
if conf.check(header_name='jni.h',define_name='HAVE_JNI_H',lib='jvm',libpath=d,includes=incDirs,uselib_store='JAVA',uselib='JAVA'):
break
else:
conf.fatal('could not find lib jvm in %r (see config.log)'%libDirs)
feature('jar')(jar_files)
before('apply_core')(jar_files)
feature('javac')(apply_java)
before('apply_core')(apply_java)
conf(check_java_class)
conf(check_jni_headers)
|