📄 sotask.java
字号:
* we are compiling for.
*/
public void setExtension(String s ) {
soExt=s;
}
/** Directory where intermediary objects will be
* generated
*/
public void setBuildDir( File s ) {
buildDir=s;
}
public void setCflags(String s ) {
cflags=s;
}
/** Directory where the .so file will be generated
*/
public void setSoDir( String s ) {
}
public void addJniConfig( JniConfig jniCfg ) {
}
public void addApacheConfig( ApacheConfig apacheCfg ) {
}
/**
* Source files ( .c )
*
* @return a nested src element.
*/
public void addSrc(FileSet fl) {
if( src==null ) src=new Vector();
src.addElement(fl);
}
/**
* Include files
*/
public PatternSet createIncludes() {
includes=new PatternSet(); //Path(project);
return includes;
}
/**
* General dependencies. If any of the files is modified
* ( i.e. is newer than the oldest .o ) we'll recompile everything.
*
* This can be used for headers ( until we add support for makedepend)
* or any important file that could invalidate the build.
* Another example is checking httpd or apxs ( if a new version
* was installed, maybe some flags or symbols changed )
*/
public Path createDepends() {
depends=new Path(project);
return depends;
}
/**
* Libraries ( .a, .so or .dll ) files to link to.
*/
public Path createLibs() {
libs=new Path(project);
return libs;
}
/**
* The name of the target file.
* (XXX including extension - this should be automatically added )
*/
public void setModule(String modName) {
this.module = modName; // Should be this ?
}
// XXX Add specific code for Netware, Windows and platforms where libtool
// is problematic
// XXX Add specific code for Linux and platforms where things are
// clean, libtool should be just a fallback.
public void execute() throws BuildException {
compiler=findCompilerAdapter();
// co_mapper=compiler.getOMapper();
LinkerAdapter linker=findLinkerAdapter();
if( soFile==null )
throw new BuildException("No target ( " + soExt + " file )");
if (src == null)
throw new BuildException("No source files");
// XXX makedepend-type dependencies - how ??
// We could generate a dummy Makefile and parse the content...
findSourceFiles();
// Copy all settings into compiler
this.duplicateTo(compiler);
compiler.compile( srcList );
// XXX move this checking to linker
File soTarget=new File( buildDir, soFile + soExt );
if( compiler.getCompiledFiles().size() == 0 && soTarget.exists()) {
// No dependency, no need to relink
return;
}
this.duplicateTo(linker);
linker.link(srcList);
}
public CompilerAdapter findCompilerAdapter() {
CompilerAdapter compilerAdapter;
String cc;
cc=project.getProperty("build.compiler.cc");
if( cc!=null ) {
if( "cc".equals( cc ) ) {
compilerAdapter=new CcCompiler();
compilerAdapter.setSoTask( this );
return compilerAdapter;
}
if( "gcj".equals( cc ) ) {
compilerAdapter=new GcjCompiler();
compilerAdapter.setSoTask( this );
return compilerAdapter;
}
if( cc.indexOf("mwccnlm") != -1 ) {
compilerAdapter=new MwccCompiler();
compilerAdapter.setSoTask( this );
return compilerAdapter;
}
if( cc.indexOf("cl") != -1 ) {
compilerAdapter=new MsvcCompiler();
compilerAdapter.setSoTask( this );
return compilerAdapter;
}
}
compilerAdapter=new LibtoolCompiler();
compilerAdapter.setSoTask( this );
return compilerAdapter;
}
public LinkerAdapter findLinkerAdapter() {
LinkerAdapter linkerAdapter;
String ld=project.getProperty("build.compiler.ld");
if( ld!=null ) {
if( ld.indexOf("mwldnlm") != -1 ) {
linkerAdapter=new MwldLinker();
linkerAdapter.setSoTask( this );
return linkerAdapter;
}
if( ld.indexOf("link") != -1 ) {
linkerAdapter=new MsvcLinker();
linkerAdapter.setSoTask( this );
return linkerAdapter;
}
// if( "ld".equals( cc ) ) {
// linkerAdapter=new LdLinker();
// linkerAdapter.setSoTask( this );
// return cc;
// }
}
String cc=project.getProperty("build.compiler.cc");
if( "gcj".equals( cc ) ) {
linkerAdapter=new GcjLinker();
linkerAdapter.setSoTask( this );
return linkerAdapter;
}
linkerAdapter=new LibtoolLinker();
linkerAdapter.setSoTask( this );
return linkerAdapter;
}
/** Find all source files declared with <src> elements
*/
public void findSourceFiles() {
if (buildDir == null) buildDir = project.getBaseDir();
Enumeration e=src.elements();
while( e.hasMoreElements() ) {
FileSet fs=(FileSet)e.nextElement();
DirectoryScanner ds=fs.getDirectoryScanner( project );
String localList[]= ds.getIncludedFiles();
if (localList.length == 0)
throw new BuildException("No source files ");
for( int i=0; i<localList.length; i++ ) {
srcList.addElement( new Source( fs.getDir(project), localList[i]));
}
}
}
/** If any file declared in <depend> element has changed, we'll do
a full rebuild.
*/
public boolean checkDepend(long oldestO, File oldestOFile) {
if( depends==null )
return false;
String dependsA[]=depends.list();
for( int i=0; i< dependsA.length; i++ ) {
File f=new File( dependsA[i] );
if( ! f.exists() ) {
log("Depend not found " + f );
return true;
}
if( f.lastModified() > oldestO ) {
log( "Depend " + f + " newer than " + oldestOFile );
return true;
}
}
return false;
}
// ==================== Execution utils ====================
protected ExecuteStreamHandler streamhandler = null;
protected ByteArrayOutputStream outputstream = null;
protected ByteArrayOutputStream errorstream = null;
public int execute( Commandline cmd ) throws BuildException
{
createStreamHandler();
Execute exe = new Execute(streamhandler, null);
exe.setAntRun(project);
exe.setWorkingDirectory(buildDir);
exe.setCommandline(cmd.getCommandline());
int result=0;
try {
result=exe.execute();
} catch (IOException e) {
throw new BuildException(e, location);
}
return result;
}
public void createStreamHandler() throws BuildException {
// try {
outputstream= new ByteArrayOutputStream();
errorstream = new ByteArrayOutputStream();
streamhandler =
new PumpStreamHandler(new PrintStream(outputstream),
new PrintStream(errorstream));
// } catch (IOException e) {
// throw new BuildException(e,location);
// }
}
public void closeStreamHandler() {
try {
if (outputstream != null)
outputstream.close();
if (errorstream != null)
errorstream.close();
outputstream=null;
errorstream=null;
} catch (IOException e) {}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -