From e8c35d105cf227a9a781ac4aac79dcd0c5024a6b Mon Sep 17 00:00:00 2001 From: Vikas Rangarajan Date: Mon, 22 Mar 2010 15:48:57 -0700 Subject: Initial merge of local changes with master, main changes : - New mojo for vcproj generation - Fixed aol to be url-friendly for maven deployments (g++->gpp) - Fail build early if specified include paths do not exist - Only add "include" subdirs of sourcedirs if they exist, to the include path - Removed duplication of source dirs in source path --- src/main/java/org/apache/maven/plugin/nar/AOL.java | 38 ++- .../java/org/apache/maven/plugin/nar/Compiler.java | 28 +- src/main/java/org/apache/maven/plugin/nar/Lib.java | 108 +++---- .../apache/maven/plugin/nar/NarCompileMojo.java | 133 +++++---- .../maven/plugin/nar/NarGnuConfigureMojo.java | 2 +- .../org/apache/maven/plugin/nar/NarManager.java | 322 ++++++++++----------- .../org/apache/maven/plugin/nar/NarSystemMojo.java | 15 +- .../java/org/apache/maven/plugin/nar/NarUtil.java | 20 ++ src/main/resources/META-INF/plexus/components.xml | 3 +- .../org/apache/maven/plugin/nar/aol.properties | 116 ++++---- 10 files changed, 423 insertions(+), 362 deletions(-) diff --git a/src/main/java/org/apache/maven/plugin/nar/AOL.java b/src/main/java/org/apache/maven/plugin/nar/AOL.java index e519026..b1edb10 100644 --- a/src/main/java/org/apache/maven/plugin/nar/AOL.java +++ b/src/main/java/org/apache/maven/plugin/nar/AOL.java @@ -48,9 +48,9 @@ public class AOL os = aolString[osIndex]; case architectureIndex+1: architecture = aolString[architectureIndex]; - break; + break; - default: + default: throw new IllegalArgumentException( "AOL '" + aol + "' cannot be parsed." ); } } @@ -68,24 +68,46 @@ public class AOL */ public final String toString() { - return architecture + ( ( os == null ) ? "" : "-" + os + ( ( linkerName == null ) ? "" : "-" + linkerName ) ); + String tempLinkerName = null; + if ( linkerName == null ) { + tempLinkerName = ""; + } else if ( linkerName.equals("g++") ) { + tempLinkerName = "-gpp"; + } else { + tempLinkerName = "-" + linkerName; + } + + return architecture + + ((os == null) ? "" : "-" + os + + tempLinkerName); } // FIXME, maybe change to something like isCompatible (AOL). public final boolean hasLinker( String linker ) { - return linkerName.equals( linker ); + return linkerName.equals(linker); } /** * Returns an AOL key (arch.os.linker) to search in the properties files. * @return dot separated AOL */ - public final String getKey() + public final String getKey() { - return architecture + ( ( os == null ) ? "" : "." + os + ( ( linkerName == null ) ? "" : "." + linkerName ) ); - } - + String tempLinkerName = null; + if ( linkerName == null ) { + tempLinkerName = ""; + } else if ( linkerName.equals("g++") ) { + tempLinkerName = ".gpp"; + } else { + tempLinkerName = "." + linkerName; + } + + return architecture + + ((os == null) ? "" : "." + os + + tempLinkerName); + } + final String getOS() { return os; } diff --git a/src/main/java/org/apache/maven/plugin/nar/Compiler.java b/src/main/java/org/apache/maven/plugin/nar/Compiler.java index 33c0a8f..59cdee2 100644 --- a/src/main/java/org/apache/maven/plugin/nar/Compiler.java +++ b/src/main/java/org/apache/maven/plugin/nar/Compiler.java @@ -326,7 +326,11 @@ public abstract class Compiler includeList = new ArrayList(); for ( Iterator i = getSourceDirectories( type ).iterator(); i.hasNext(); ) { - includeList.add( new File( (File) i.next(), "include" ).getPath() ); + //VR 20100318 only add include directories that exist - we now fail the build fast if an include directory does not exist + File includePath = new File( (File) i.next(), "include" ); + if(includePath.isDirectory()) { + includeList.add( includePath.getPath() ); + } } } return includeList; @@ -555,6 +559,10 @@ public abstract class Compiler for ( Iterator i = getIncludePaths( type ).iterator(); i.hasNext(); ) { String path = (String) i.next(); + // Darren Sargent, 30Jan2008 - fail build if invalid include path(s) specified. + if ( ! new File(path).exists() ) { + throw new MojoFailureException("NAR: Include path not found: " + path); + } compiler.createIncludePath().setPath( path ); } @@ -603,24 +611,6 @@ public abstract class Compiler } } - // add other sources, FIXME seems - if ( !type.equals( TEST ) ) - { - for ( Iterator i = mojo.getMavenProject().getCompileSourceRoots().iterator(); i.hasNext(); ) - { - File dir = new File( (String) i.next() ); - mojo.getLog().debug( "Checking for existence of " + getLanguage() + " sourceCompileRoot: " + dir ); - if ( dir.exists() ) - { - ConditionalFileSet otherFileSet = new ConditionalFileSet(); - otherFileSet.setProject( mojo.getAntProject() ); - otherFileSet.setIncludes( StringUtils.join( includeSet.iterator(), "," ) ); - otherFileSet.setExcludes( StringUtils.join( excludeSet.iterator(), "," ) ); - otherFileSet.setDir( dir ); - compiler.addFileset( otherFileSet ); - } - } - } return compiler; } diff --git a/src/main/java/org/apache/maven/plugin/nar/Lib.java b/src/main/java/org/apache/maven/plugin/nar/Lib.java index e970a69..db879dc 100644 --- a/src/main/java/org/apache/maven/plugin/nar/Lib.java +++ b/src/main/java/org/apache/maven/plugin/nar/Lib.java @@ -41,43 +41,43 @@ import org.apache.tools.ant.Project; public class Lib { - /** + /** * Name of the library, or a dependency groupId:artifactId if this library contains sublibraries - * - * @parameter expression="" - * @required - */ - private String name; + * + * @parameter expression="" + * @required + */ + private String name; - /** - * Type of linking for this library - * - * @parameter expression="" default-value="shared" - * @required - */ - private String type = Library.SHARED; + /** + * Type of linking for this library + * + * @parameter expression="" default-value="shared" + * @required + */ + private String type = Library.SHARED; - /** - * Location for this library - * - * @parameter expression="" - * @required - */ - private File directory; + /** + * Location for this library + * + * @parameter expression="" + * @required + */ + private File directory; - /** - * Sub libraries for this library - * - * @parameter expression="" - */ - private List/* */libs; + /** + * Sub libraries for this library + * + * @parameter expression="" + */ + private List/* */libs; public final void addLibSet( AbstractDependencyMojo mojo, LinkerDef linker, Project antProject ) throws MojoFailureException, MojoExecutionException { if ( name == null ) { - throw new MojoFailureException( "NAR: Please specify as part of " ); + throw new MojoFailureException( "NAR: Please specify as part of for library \"" + name + "\""); } addLibSet( mojo, linker, antProject, name, directory ); } @@ -97,47 +97,47 @@ public class Lib private void addSingleLibSet( LinkerDef linker, Project antProject, String name, File dir ) throws MojoFailureException, MojoExecutionException - { - if ( !type.equals( "framework" ) && ( dir == null ) ) + { + if (!type.equals("framework") && (dir == null)) { - throw new MojoFailureException( "NAR: Please specify as part of " ); - } - LibrarySet libSet = new LibrarySet(); - libSet.setProject( antProject ); - libSet.setLibs( new CUtil.StringArrayBuilder( name ) ); - LibraryTypeEnum libType = new LibraryTypeEnum(); - libType.setValue( type ); - libSet.setType( libType ); - libSet.setDir( dir ); - linker.addLibset( libSet ); - } + throw new MojoFailureException("NAR: Please specify as part of for library \"" + name + "\""); + } + LibrarySet libSet = new LibrarySet(); + libSet.setProject(antProject); + libSet.setLibs(new CUtil.StringArrayBuilder(name)); + LibraryTypeEnum libType = new LibraryTypeEnum(); + libType.setValue(type); + libSet.setType(libType); + libSet.setDir(dir); + linker.addLibset(libSet); + } private void addMultipleLibSets( AbstractDependencyMojo mojo, LinkerDef linker, Project antProject, String name ) throws MojoFailureException, MojoExecutionException { - List dependencies = mojo.getNarManager().getNarDependencies( "compile" ); + List dependencies = mojo.getNarManager().getNarDependencies("compile"); for ( Iterator i = libs.iterator(); i.hasNext(); ) { - Lib lib = (Lib) i.next(); - String[] ids = name.split( ":", 2 ); + Lib lib = (Lib) i.next(); + String[] ids = name.split(":", 2); if ( ids.length != 2 ) { - throw new MojoFailureException( - "NAR: Please specify as part of in format 'groupId:artifactId'" ); - } + throw new MojoFailureException( + "NAR: Please specify as part of in format 'groupId:artifactId'"); + } for ( Iterator j = dependencies.iterator(); j.hasNext(); ) { - Artifact dependency = (Artifact) j.next(); + Artifact dependency = (Artifact) j.next(); if ( dependency.getGroupId().equals( ids[0] ) && dependency.getArtifactId().equals( ids[1] ) ) { - // FIXME NAR-90 + // FIXME NAR-90 File narDir = new File( dependency.getFile().getParentFile(), "nar/lib/" - + mojo.getAOL() + "/" + lib.type ); + + mojo.getAOL() + "/" + lib.type); String narName = dependency.getArtifactId() + "-" + lib.name + "-" + dependency.getVersion(); - lib.addLibSet( mojo, linker, antProject, narName, narDir ); - } - } - } - } + lib.addLibSet(mojo, linker, antProject, narName, narDir); + } + } + } + } } diff --git a/src/main/java/org/apache/maven/plugin/nar/NarCompileMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarCompileMojo.java index 811ce70..42e5a33 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarCompileMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarCompileMojo.java @@ -79,15 +79,15 @@ public class NarCompileMojo // check for source files int noOfSources = 0; - noOfSources += getSourcesFor( getCpp() ).size(); - noOfSources += getSourcesFor( getC() ).size(); - noOfSources += getSourcesFor( getFortran() ).size(); + noOfSources += getSourcesFor(getCpp()).size(); + noOfSources += getSourcesFor(getC()).size(); + noOfSources += getSourcesFor(getFortran()).size(); if ( noOfSources > 0 ) { getLog().info( "Compiling " + noOfSources + " native files" ); for ( Iterator i = getLibraries().iterator(); i.hasNext(); ) { - createLibrary( getAntProject(), (Library) i.next() ); + createLibrary(getAntProject(), (Library) i.next()); } } else @@ -134,33 +134,33 @@ public class NarCompileMojo } } - private void createLibrary( Project antProject, Library library ) - throws MojoExecutionException, MojoFailureException + private void createLibrary(Project antProject, Library library) + throws MojoExecutionException, MojoFailureException { getLog().debug( "Creating Library " + library ); // configure task CCTask task = new CCTask(); - task.setProject( antProject ); - + task.setProject(antProject); + // subsystem SubsystemEnum subSystem = new SubsystemEnum(); subSystem.setValue( library.getSubSystem() ); task.setSubsystem( subSystem ); // set max cores - task.setMaxCores( getMaxCores( getAOL() ) ); + task.setMaxCores(getMaxCores(getAOL())); // outtype OutputTypeEnum outTypeEnum = new OutputTypeEnum(); String type = library.getType(); - outTypeEnum.setValue( type ); - task.setOuttype( outTypeEnum ); + outTypeEnum.setValue(type); + task.setOuttype(outTypeEnum); // stdc++ - task.setLinkCPP( library.linkCPP() ); + task.setLinkCPP(library.linkCPP()); // fortran - task.setLinkFortran( library.linkFortran() ); + task.setLinkFortran(library.linkFortran()); task.setLinkFortranMain( library.linkFortranMain() ); // outDir @@ -185,69 +185,72 @@ public class NarCompileMojo if ( type.equals( Library.EXECUTABLE ) ) { // executable has no version number - outFile = new File( outDir, getMavenProject().getArtifactId() ); + outFile = new File(outDir, getMavenProject().getArtifactId()); } else { - outFile = new File( outDir, getOutput( getAOL() ) ); + outFile = new File(outDir, getOutput(getAOL())); } - getLog().debug( "NAR - output: '" + outFile + "'" ); - task.setOutfile( outFile ); + getLog().debug("NAR - output: '" + outFile + "'"); + task.setOutfile(outFile); // object directory - File objDir = new File( getTargetDirectory(), "obj" ); - objDir = new File( objDir, getAOL().toString() ); + File objDir = new File(getTargetDirectory(), "obj"); + objDir = new File(objDir, getAOL().toString()); objDir.mkdirs(); - task.setObjdir( objDir ); + task.setObjdir(objDir); // failOnError, libtool - task.setFailonerror( failOnError( getAOL() ) ); - task.setLibtool( useLibtool( getAOL() ) ); + task.setFailonerror(failOnError(getAOL())); + task.setLibtool(useLibtool(getAOL())); // runtime RuntimeType runtimeType = new RuntimeType(); - runtimeType.setValue( getRuntime( getAOL() ) ); - task.setRuntime( runtimeType ); + runtimeType.setValue(getRuntime(getAOL())); + task.setRuntime(runtimeType); + // Darren Sargent Feb 11 2010: Use Compiler.MAIN for "type"...appears the wrong "type" variable was being used + // since getCompiler() expects "main" or "test", whereas the "type" variable here is "executable", "shared" etc. // add C++ compiler - CompilerDef cpp = getCpp().getCompiler( type, getOutput( getAOL() ) ); + CompilerDef cpp = getCpp().getCompiler( Compiler.MAIN, getOutput( getAOL() ) ); if ( cpp != null ) { task.addConfiguredCompiler( cpp ); } // add C compiler - CompilerDef c = getC().getCompiler( type, getOutput( getAOL() ) ); + CompilerDef c = getC().getCompiler( Compiler.MAIN, getOutput( getAOL() ) ); if ( c != null ) { task.addConfiguredCompiler( c ); } // add Fortran compiler - CompilerDef fortran = getFortran().getCompiler( type, getOutput( getAOL() ) ); + CompilerDef fortran = getFortran().getCompiler( Compiler.MAIN, getOutput( getAOL() ) ); if ( fortran != null ) { task.addConfiguredCompiler( fortran ); } + // end Darren // add javah include path File jniDirectory = getJavah().getJniDirectory(); - if ( jniDirectory.exists() ) + if (jniDirectory.exists()) { - task.createIncludePath().setPath( jniDirectory.getPath() ); + task.createIncludePath().setPath(jniDirectory.getPath()); } // add java include paths - getJava().addIncludePaths( task, type ); + getJava().addIncludePaths(task, type); // add dependency include paths for ( Iterator i = getNarManager().getNarDependencies( "compile" ).iterator(); i.hasNext(); ) { // FIXME, handle multiple includes from one NAR NarArtifact narDependency = (NarArtifact) i.next(); - String binding = narDependency.getNarInfo().getBinding( getAOL(), Library.STATIC ); - getLog().debug( "Looking for " + narDependency + " found binding " + binding ); - if ( !binding.equals( Library.JNI ) ) + String binding = narDependency.getNarInfo().getBinding(getAOL(), Library.STATIC); + getLog().debug( "Looking for " + narDependency + " found binding " + binding); + if ( !binding.equals(Library.JNI ) ) { File unpackDirectory = getUnpackDirectory(); File include = @@ -256,7 +259,10 @@ public class NarCompileMojo getLog().debug( "Looking for include directory: " + include ); if ( include.exists() ) { - task.createIncludePath().setPath( include.getPath() ); + task.createIncludePath().setPath(include.getPath()); + } else { + throw new MojoExecutionException( + "NAR: unable to locate include path: " + include); } } } @@ -264,7 +270,7 @@ public class NarCompileMojo // add linker LinkerDef linkerDefinition = getLinker().getLinker( this, antProject, getOS(), getAOL().getKey() + ".linker.", type ); - task.addConfiguredLinker( linkerDefinition ); + task.addConfiguredLinker(linkerDefinition); // add dependency libraries // FIXME: what about PLUGIN and STATIC, depending on STATIC, should we @@ -273,7 +279,7 @@ public class NarCompileMojo { List depLibOrder = getDependencyLibOrder(); - List depLibs = getNarManager().getNarDependencies( "compile" ); + List depLibs = getNarManager().getNarDependencies("compile"); // reorder the libraries that come from the nar dependencies // to comply with the order specified by the user @@ -290,15 +296,15 @@ public class NarCompileMojo NarArtifact dep = (NarArtifact) j.next(); String depName = dep.getGroupId() + ":" + dep.getArtifactId(); - if ( depName.equals( depToOrderName ) ) + if (depName.equals(depToOrderName)) { - tmp.add( dep ); + tmp.add(dep); j.remove(); } } } - tmp.addAll( depLibs ); + tmp.addAll(depLibs); depLibs = tmp; } @@ -310,12 +316,12 @@ public class NarCompileMojo // FIXME, no way to override this at this stage String binding = dependency.getNarInfo().getBinding( getAOL(), Library.NONE ); - getLog().debug( "Using Binding: " + binding ); + getLog().debug("Using Binding: " + binding); AOL aol = getAOL(); - aol = dependency.getNarInfo().getAOL( getAOL() ); - getLog().debug( "Using Library AOL: " + aol.toString() ); + aol = dependency.getNarInfo().getAOL(getAOL()); + getLog().debug("Using Library AOL: " + aol.toString()); - if ( !binding.equals( Library.JNI ) && !binding.equals( Library.NONE ) ) + if ( !binding.equals( Library.JNI ) && !binding.equals( Library.NONE ) && !binding.equals( Library.EXECUTABLE) ) { File unpackDirectory = getUnpackDirectory(); @@ -323,20 +329,20 @@ public class NarCompileMojo getLayout().getLibDirectory( unpackDirectory, dependency.getArtifactId(), dependency.getVersion(), aol.toString(), binding ); - getLog().debug( "Looking for Library Directory: " + dir ); + getLog().debug("Looking for Library Directory: " + dir); if ( dir.exists() ) { LibrarySet libSet = new LibrarySet(); - libSet.setProject( antProject ); + libSet.setProject(antProject); // FIXME, no way to override - String libs = dependency.getNarInfo().getLibs( getAOL() ); + String libs = dependency.getNarInfo().getLibs(getAOL()); if ( ( libs != null ) && !libs.equals( "" ) ) { - getLog().debug( "Using LIBS = " + libs ); - libSet.setLibs( new CUtil.StringArrayBuilder( libs ) ); - libSet.setDir( dir ); - task.addLibset( libSet ); + getLog().debug("Using LIBS = " + libs); + libSet.setLibs(new CUtil.StringArrayBuilder(libs)); + libSet.setDir(dir); + task.addLibset(libSet); } } else @@ -348,21 +354,21 @@ public class NarCompileMojo String options = dependency.getNarInfo().getOptions( getAOL() ); if ( ( options != null ) && !options.equals( "" ) ) { - getLog().debug( "Using OPTIONS = " + options ); + getLog().debug("Using OPTIONS = " + options); LinkerArgument arg = new LinkerArgument(); - arg.setValue( options ); - linkerDefinition.addConfiguredLinkerArg( arg ); + arg.setValue(options); + linkerDefinition.addConfiguredLinkerArg(arg); } String sysLibs = dependency.getNarInfo().getSysLibs( getAOL() ); if ( ( sysLibs != null ) && !sysLibs.equals( "" ) ) { - getLog().debug( "Using SYSLIBS = " + sysLibs ); + getLog().debug("Using SYSLIBS = " + sysLibs); SystemLibrarySet sysLibSet = new SystemLibrarySet(); - sysLibSet.setProject( antProject ); + sysLibSet.setProject(antProject); sysLibSet.setLibs( new CUtil.StringArrayBuilder( sysLibs ) ); - task.addSyslibset( sysLibSet ); + task.addSyslibset(sysLibSet); } } } @@ -378,7 +384,7 @@ public class NarCompileMojo } catch ( BuildException e ) { - throw new MojoExecutionException( "NAR: Compile failed", e ); + throw new MojoExecutionException("NAR: Compile failed", e); } // FIXME, this should be done in CPPTasks at some point @@ -393,10 +399,19 @@ public class NarCompileMojo int result = NarUtil.runCommand( "mt.exe", new String[] { "/manifest", manifest, "/outputresource:" + dll + ";#2" }, null, null, getLog() ); - if ( result != 0 ) + if (result != 0) { - throw new MojoFailureException( "MT.EXE failed with exit code: " + result ); + throw new MojoFailureException("MT.EXE failed with exit code: " + result); } + } else if (libType.equals(Library.EXECUTABLE)) { + String exe = outFile.getPath() + ".exe"; + String manifest = exe + ".manifest"; + int result = NarUtil.runCommand("mt.exe", + new String[] { "/manifest", manifest, + "/outputresource:" + exe + ";#1" }, null, null, getLog()); + if (result != 0) + throw new MojoFailureException( + "MT.EXE failed with exit code: " + result); } } } diff --git a/src/main/java/org/apache/maven/plugin/nar/NarGnuConfigureMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarGnuConfigureMojo.java index 924bda3..4e15f48 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarGnuConfigureMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarGnuConfigureMojo.java @@ -104,7 +104,7 @@ public class NarGnuConfigureMojo getLog().info( "Running GNU " + CONFIGURE ); NarUtil.makeExecutable( configure, getLog() ); int result = - NarUtil.runCommand( "./" + configure.getName(), new String[] { + NarUtil.runCommand( "./" + configure.getName(), new String[] { "--disable-ccache", "--prefix=" + getGnuAOLTargetDirectory().getAbsolutePath() }, targetDir, null, getLog() ); if ( result != 0 ) { diff --git a/src/main/java/org/apache/maven/plugin/nar/NarManager.java b/src/main/java/org/apache/maven/plugin/nar/NarManager.java index 5cbcd10..fd77645 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarManager.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarManager.java @@ -47,15 +47,15 @@ import org.codehaus.plexus.archiver.manager.ArchiverManager; public class NarManager { - private Log log; + private Log log; - private MavenProject project; + private MavenProject project; - private ArtifactRepository repository; + private ArtifactRepository repository; - private AOL defaultAOL; + private AOL defaultAOL; - private String linkerName; + private String linkerName; private String[] narTypes = { NarConstants.NAR_NO_ARCH, Library.STATIC, Library.SHARED, Library.JNI, Library.PLUGIN }; @@ -64,99 +64,99 @@ public class NarManager Linker linker ) throws MojoFailureException, MojoExecutionException { - this.log = log; - this.repository = repository; - this.project = project; - this.defaultAOL = NarUtil.getAOL( architecture, os, linker, null ); - this.linkerName = NarUtil.getLinkerName( architecture, os, linker ); - } - - /** + this.log = log; + this.repository = repository; + this.project = project; + this.defaultAOL = NarUtil.getAOL(architecture, os, linker, null); + this.linkerName = NarUtil.getLinkerName(architecture, os, linker); + } + + /** * Returns dependencies which are dependent on NAR files (i.e. contain NarInfo) - */ - public final List/* */getNarDependencies( String scope ) + */ + public final List/* */getNarDependencies(String scope) throws MojoExecutionException { - List narDependencies = new LinkedList(); + List narDependencies = new LinkedList(); for ( Iterator i = getDependencies( scope ).iterator(); i.hasNext(); ) { - Artifact dependency = (Artifact) i.next(); - log.debug( "Examining artifact for NarInfo: " + dependency ); + Artifact dependency = (Artifact) i.next(); + log.debug("Examining artifact for NarInfo: " + dependency); - NarInfo narInfo = getNarInfo( dependency ); + NarInfo narInfo = getNarInfo(dependency); if ( narInfo != null ) { - log.debug( " - added as NarDependency" ); - narDependencies.add( new NarArtifact( dependency, narInfo ) ); - } - } - return narDependencies; - } - - /** + log.debug(" - added as NarDependency"); + narDependencies.add(new NarArtifact(dependency, narInfo)); + } + } + return narDependencies; + } + + /** * Returns all NAR dependencies by type: noarch, static, dynamic, jni, plugin. - * - * @throws MojoFailureException - */ + * + * @throws MojoFailureException + */ public final Map/* > */getAttachedNarDependencyMap( String scope ) throws MojoExecutionException, MojoFailureException { - Map attachedNarDependencies = new HashMap(); + Map attachedNarDependencies = new HashMap(); for ( Iterator i = getNarDependencies( scope ).iterator(); i.hasNext(); ) { - Artifact dependency = (Artifact) i.next(); + Artifact dependency = (Artifact) i.next(); for ( int j = 0; j < narTypes.length; j++ ) { List artifactList = getAttachedNarDependencies( dependency, defaultAOL, narTypes[j] ); if ( artifactList != null ) { - attachedNarDependencies.put( narTypes[j], artifactList ); - } - } - } - return attachedNarDependencies; - } + attachedNarDependencies.put(narTypes[j], artifactList); + } + } + } + return attachedNarDependencies; + } public final List/* */getAttachedNarDependencies( List/* */narArtifacts ) throws MojoExecutionException, MojoFailureException { - return getAttachedNarDependencies( narArtifacts, ( String )null ); - } + return getAttachedNarDependencies(narArtifacts, (String) null); + } public final List/* */getAttachedNarDependencies( List/* */narArtifacts, String classifier ) throws MojoExecutionException, MojoFailureException { - AOL aol = null; - String type = null; + AOL aol = null; + String type = null; if ( classifier != null ) { - int dash = classifier.lastIndexOf( '-' ); + int dash = classifier.lastIndexOf('-'); if ( dash < 0 ) { - aol = new AOL( classifier ); - type = null; + aol = new AOL(classifier); + type = null; } else { - aol = new AOL( classifier.substring( 0, dash ) ); - type = classifier.substring( dash + 1 ); - } - } - return getAttachedNarDependencies( narArtifacts, aol, type ); - } - - public final List/* */getAttachedNarDependencies( - List/* */narArtifacts, List classifiers) + aol = new AOL(classifier.substring(0, dash)); + type = classifier.substring(dash + 1); + } + } + return getAttachedNarDependencies(narArtifacts, aol, type); + } + + public final List/* */getAttachedNarDependencies( + List/* */narArtifacts, List classifiers) throws MojoExecutionException, MojoFailureException { - String[] types; - - List artifactList = new ArrayList(); + String[] types; + + List artifactList = new ArrayList(); if( classifiers != null && !classifiers.isEmpty() ) { - types = (String[]) classifiers.toArray(); + types = (String[]) classifiers.toArray(); for ( int j = 0; j < types.length; j++ ) { @@ -169,92 +169,92 @@ public class NarManager else { artifactList.addAll( getAttachedNarDependencies( narArtifacts, ( String )null )); - } + } - return artifactList; - } + return artifactList; + } - /** + /** * Returns a list of all attached nar dependencies for a specific binding and "noarch", but not where "local" is * specified - * + * * @param scope compile, test, runtime, .... * @param aol either a valid aol, noarch or null. In case of null both the default getAOL() and noarch dependencies * are returned. * @param type noarch, static, shared, jni, or null. In case of null the default binding found in narInfo is used. - * @return - * @throws MojoExecutionException - * @throws MojoFailureException - */ + * @return + * @throws MojoExecutionException + * @throws MojoFailureException + */ public final List/* */getAttachedNarDependencies( List/* */narArtifacts, AOL archOsLinker, String type ) throws MojoExecutionException, MojoFailureException { - boolean noarch = false; - AOL aol = archOsLinker; + boolean noarch = false; + AOL aol = archOsLinker; if ( aol == null ) { - noarch = true; - aol = defaultAOL; - } + noarch = true; + aol = defaultAOL; + } - List artifactList = new ArrayList(); + List artifactList = new ArrayList(); for ( Iterator i = narArtifacts.iterator(); i.hasNext(); ) { - Artifact dependency = (Artifact) i.next(); - NarInfo narInfo = getNarInfo( dependency ); + Artifact dependency = (Artifact) i.next(); + NarInfo narInfo = getNarInfo(dependency); if ( noarch ) { artifactList.addAll( getAttachedNarDependencies( dependency, null, NarConstants.NAR_NO_ARCH ) ); - } + } - // use preferred binding, unless non existing. + // use preferred binding, unless non existing. String binding = narInfo.getBinding( aol, type != null ? type : Library.STATIC ); - // FIXME kludge, but does not work anymore since AOL is now a class + // FIXME kludge, but does not work anymore since AOL is now a class if ( aol.equals( NarConstants.NAR_NO_ARCH ) ) { - // FIXME no handling of local + // FIXME no handling of local artifactList.addAll( getAttachedNarDependencies( dependency, null, NarConstants.NAR_NO_ARCH ) ); } else { artifactList.addAll( getAttachedNarDependencies( dependency, aol, binding ) ); - } - } - return artifactList; - } + } + } + return artifactList; + } private List/* */getAttachedNarDependencies( Artifact dependency, AOL archOsLinker, String type ) throws MojoExecutionException, MojoFailureException { - AOL aol = archOsLinker; + AOL aol = archOsLinker; log.debug( "GetNarDependencies for " + dependency + ", aol: " + aol + ", type: " + type ); - List artifactList = new ArrayList(); - NarInfo narInfo = getNarInfo( dependency ); - String[] nars = narInfo.getAttachedNars( aol, type ); - // FIXME Move this to NarInfo.... + List artifactList = new ArrayList(); + NarInfo narInfo = getNarInfo(dependency); + String[] nars = narInfo.getAttachedNars(aol, type); + // FIXME Move this to NarInfo.... if ( nars != null ) { for ( int j = 0; j < nars.length; j++ ) { - log.debug( " Checking: " + nars[j] ); + log.debug(" Checking: " + nars[j]); if ( nars[j].equals( "" ) ) { - continue; - } - String[] nar = nars[j].split( ":", 5 ); + continue; + } + String[] nar = nars[j].split(":", 5); if ( nar.length >= 4 ) { try { - String groupId = nar[0].trim(); - String artifactId = nar[1].trim(); - String ext = nar[2].trim(); - String classifier = nar[3].trim(); - // translate for instance g++ to gcc... - aol = narInfo.getAOL( aol ); + String groupId = nar[0].trim(); + String artifactId = nar[1].trim(); + String ext = nar[2].trim(); + String classifier = nar[3].trim(); + // translate for instance g++ to gcc... + aol = narInfo.getAOL(aol); if ( aol != null ) { classifier = NarUtil.replace( "${aol}", aol.toString(), classifier ); @@ -272,42 +272,42 @@ public class NarManager else { log.warn( "nars property in " + dependency.getArtifactId() + " contains invalid field: '" + nars[j] - + "' for type: " + type ); - } - } - } - return artifactList; - } - - public final NarInfo getNarInfo( Artifact dependency ) + + "' for type: " + type); + } + } + } + return artifactList; + } + + public final NarInfo getNarInfo(Artifact dependency) throws MojoExecutionException { - // FIXME reported to maven developer list, isSnapshot changes behaviour - // of getBaseVersion, called in pathOf. - dependency.isSnapshot(); + // FIXME reported to maven developer list, isSnapshot changes behaviour + // of getBaseVersion, called in pathOf. + dependency.isSnapshot(); File file = new File( repository.getBasedir(), repository.pathOf( dependency ) ); if ( !file.exists() ) { - return null; - } + return null; + } - JarFile jar = null; + JarFile jar = null; try { - jar = new JarFile( file ); + jar = new JarFile(file); NarInfo info = new NarInfo( dependency.getGroupId(), dependency.getArtifactId(), dependency.getBaseVersion(), log ); if ( !info.exists( jar ) ) { - return null; - } - info.read( jar ); - return info; + return null; + } + info.read(jar); + return info; } catch ( IOException e ) { - throw new MojoExecutionException( "Error while reading " + file, e ); + throw new MojoExecutionException("Error while reading " + file, e); } finally { @@ -315,74 +315,74 @@ public class NarManager { try { - jar.close(); + jar.close(); } catch ( IOException e ) { - // ignore - } - } - } - } + // ignore + } + } + } + } - public final File getNarFile( Artifact dependency ) + public final File getNarFile(Artifact dependency) throws MojoFailureException { - // FIXME reported to maven developer list, isSnapshot changes behaviour - // of getBaseVersion, called in pathOf. - dependency.isSnapshot(); + // FIXME reported to maven developer list, isSnapshot changes behaviour + // of getBaseVersion, called in pathOf. + dependency.isSnapshot(); return new File( repository.getBasedir(), NarUtil.replace( "${aol}", defaultAOL.toString(), repository.pathOf( dependency ) ) ); - } + } private List getDependencies( String scope ) { if ( scope.equals( Artifact.SCOPE_TEST ) ) { - return project.getTestArtifacts(); + return project.getTestArtifacts(); } else if ( scope.equals( Artifact.SCOPE_RUNTIME ) ) { - return project.getRuntimeArtifacts(); - } - return project.getCompileArtifacts(); - } + return project.getRuntimeArtifacts(); + } + return project.getCompileArtifacts(); + } public final void downloadAttachedNars( List/* */narArtifacts, List remoteRepositories, - ArtifactResolver resolver, String classifier ) + ArtifactResolver resolver, String classifier) throws MojoExecutionException, MojoFailureException { - // FIXME this may not be the right way to do this.... -U ignored and - // also SNAPSHOT not used - List dependencies = getAttachedNarDependencies( narArtifacts, classifier ); + // FIXME this may not be the right way to do this.... -U ignored and + // also SNAPSHOT not used + List dependencies = getAttachedNarDependencies(narArtifacts, classifier); log.debug( "Download called with classifier: " + classifier + " for NarDependencies {" ); for ( Iterator i = dependencies.iterator(); i.hasNext(); ) { - log.debug( " - " + ( i.next() ) ); - } - log.debug( "}" ); + log.debug(" - " + (i.next())); + } + log.debug("}"); for ( Iterator i = dependencies.iterator(); i.hasNext(); ) { - Artifact dependency = (Artifact) i.next(); + Artifact dependency = (Artifact) i.next(); try { - log.debug( "Resolving " + dependency ); - resolver.resolve( dependency, remoteRepositories, repository ); + log.debug("Resolving " + dependency); + resolver.resolve(dependency, remoteRepositories, repository); } catch ( ArtifactNotFoundException e ) { - String message = "nar not found " + dependency.getId(); - throw new MojoExecutionException( message, e ); + String message = "nar not found " + dependency.getId(); + throw new MojoExecutionException(message, e); } catch ( ArtifactResolutionException e ) { - String message = "nar cannot resolve " + dependency.getId(); - throw new MojoExecutionException( message, e ); - } - } - } + String message = "nar cannot resolve " + dependency.getId(); + throw new MojoExecutionException(message, e); + } + } + } public final void unpackAttachedNars( List/* */narArtifacts, ArchiverManager archiverManager, String classifier, String os, NarLayout layout, File unpackDir ) @@ -391,18 +391,18 @@ public class NarManager log.debug( "Unpack called for OS: " + os + ", classifier: " + classifier + " for NarArtifacts {" ); for ( Iterator i = narArtifacts.iterator(); i.hasNext(); ) { - log.debug( " - " + ( i.next() ) ); - } - log.debug( "}" ); - // FIXME, kludge to get to download the -noarch, based on classifier - List dependencies = getAttachedNarDependencies( narArtifacts, classifier ); + log.debug(" - " + (i.next())); + } + log.debug("}"); + // FIXME, kludge to get to download the -noarch, based on classifier + List dependencies = getAttachedNarDependencies(narArtifacts, classifier); for ( Iterator i = dependencies.iterator(); i.hasNext(); ) { - Artifact dependency = (Artifact) i.next(); - log.debug( "Unpack " + dependency ); - File file = getNarFile( dependency ); + Artifact dependency = (Artifact) i.next(); + log.debug("Unpack " + dependency + " to " + unpackDir); + File file = getNarFile(dependency); layout.unpackNar(unpackDir, archiverManager, file, os, linkerName, defaultAOL); - } - } + } + } } diff --git a/src/main/java/org/apache/maven/plugin/nar/NarSystemMojo.java b/src/main/java/org/apache/maven/plugin/nar/NarSystemMojo.java index 24443c3..758eb74 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarSystemMojo.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarSystemMojo.java @@ -53,7 +53,8 @@ public class NarSystemMojo for ( Iterator i = getLibraries().iterator(); !jniFound && i.hasNext(); ) { Library library = (Library) i.next(); - if ( library.getType().equals( Library.JNI ) ) + if ( library.getType().equals( Library.JNI ) + || library.getType().equals( Library.SHARED )) { packageName = library.getNarSystemPackage(); narSystemName = library.getNarSystemName(); @@ -64,6 +65,12 @@ public class NarSystemMojo if ( !jniFound || packageName == null) { + if ( !jniFound ) { + getLog().debug("NAR: not building a shared or JNI library, so not generating NarSystem class."); + } else { + getLog().warn( + "NAR: no system package specified; unable to generate NarSystem class."); + } return; } @@ -108,6 +115,12 @@ public class NarSystemMojo p.println( " System.loadLibrary(\"" + artifactId + "-" + version + "\");" ); p.println( " }" ); + p.println(""); + p.println(" public static int runUnitTests() {"); + p.println(" return new NarSystem().runUnitTestsNative();"); + p.println("}"); + p.println(""); + p.println(" public native int runUnitTestsNative();"); p.println( "}" ); p.close(); fos.close(); diff --git a/src/main/java/org/apache/maven/plugin/nar/NarUtil.java b/src/main/java/org/apache/maven/plugin/nar/NarUtil.java index 751cce0..cb77355 100644 --- a/src/main/java/org/apache/maven/plugin/nar/NarUtil.java +++ b/src/main/java/org/apache/maven/plugin/nar/NarUtil.java @@ -39,6 +39,7 @@ import org.apache.bcel.classfile.JavaClass; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; +import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.PropertyUtils; import org.codehaus.plexus.util.cli.Commandline; @@ -714,4 +715,23 @@ public final class NarUtil } } + + /** + * (Darren) this code lifted from mvn help:active-profiles plugin Recurses + * into the project's parent poms to find the active profiles of the + * specified project and all its parents. + * + * @param project + * The project to start with + * @return A list of active profiles + */ + static List collectActiveProfiles(MavenProject project) { + List profiles = project.getActiveProfiles(); + + if (project.hasParent()) { + profiles.addAll(collectActiveProfiles(project.getParent())); + } + + return profiles; + } } diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml index aa6d8b2..80850e4 100644 --- a/src/main/resources/META-INF/plexus/components.xml +++ b/src/main/resources/META-INF/plexus/components.xml @@ -35,7 +35,8 @@ org.apache.maven.plugins:maven-resources-plugin:resources, org.apache.maven.plugins:maven-nar-plugin:nar-resources, - org.apache.maven.plugins:maven-nar-plugin:nar-gnu-resources + org.apache.maven.plugins:maven-nar-plugin:nar-gnu-resources, + org.apache.maven.plugins:maven-nar-plugin:nar-vcproj org.apache.maven.plugins:maven-compiler-plugin:compile, org.apache.maven.plugins:maven-nar-plugin:nar-javah, diff --git a/src/main/resources/org/apache/maven/plugin/nar/aol.properties b/src/main/resources/org/apache/maven/plugin/nar/aol.properties index 08d23c4..85a5cb7 100644 --- a/src/main/resources/org/apache/maven/plugin/nar/aol.properties +++ b/src/main/resources/org/apache/maven/plugin/nar/aol.properties @@ -31,13 +31,13 @@ x86.Windows.linker=msvc x86.Windows.msvc.cpp.compiler=msvc x86.Windows.msvc.cpp.defines=Windows WIN32 x86.Windows.msvc.cpp.options= -x86.Windows.msvc.cpp.includes=**/*.cc **/*.cpp **/*.cxx +x86.Windows.msvc.cpp.includes=**/*.cc **/*.cpp **/*.cxx **/*.h x86.Windows.msvc.cpp.excludes= x86.Windows.msvc.c.compiler=msvc x86.Windows.msvc.c.defines=Windows WIN32 x86.Windows.msvc.c.options= -x86.Windows.msvc.c.includes=**/*.c +x86.Windows.msvc.c.includes=**/*.c **/*.h x86.Windows.msvc.c.excludes= x86.Windows.msvc.fortran.compiler=df @@ -206,34 +206,34 @@ x86.Windows.gcc.jni.extension=dll # i386.Linux.linker=g++ -i386.Linux.g++.cpp.compiler=g++ -i386.Linux.g++.cpp.defines=Linux GNU_GCC -i386.Linux.g++.cpp.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion -i386.Linux.g++.cpp.includes=**/*.cc **/*.cpp **/*.cxx -i386.Linux.g++.cpp.excludes= - -i386.Linux.g++.c.compiler=gcc -i386.Linux.g++.c.defines=Linux GNU_GCC -i386.Linux.g++.c.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion -i386.Linux.g++.c.includes=**/*.c -i386.Linux.g++.c.excludes= - -i386.Linux.g++.fortran.compiler=gfortran -i386.Linux.g++.fortran.defines=Linux GNU_GCC -i386.Linux.g++.fortran.options=-Wall -i386.Linux.g++.fortran.includes=**/*.f **/*.for **/*.f90 -i386.Linux.g++.fortran.excludes= - -i386.Linux.g++.java.include=include;include/linux -i386.Linux.g++.java.runtimeDirectory=jre/lib/i386/client - -i386.Linux.g++.lib.prefix=lib -i386.Linux.g++.shared.prefix=lib -i386.Linux.g++.static.extension=a -i386.Linux.g++.shared.extension=so* -i386.Linux.g++.plugin.extension=so -i386.Linux.g++.jni.extension=so -i386.Linux.g++.executable.extension= +i386.Linux.gpp.cpp.compiler=g++ +i386.Linux.gpp.cpp.defines=Linux GNU_GCC +i386.Linux.gpp.cpp.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion +i386.Linux.gpp.cpp.includes=**/*.cc **/*.cpp **/*.cxx +i386.Linux.gpp.cpp.excludes= + +i386.Linux.gpp.c.compiler=gcc +i386.Linux.gpp.c.defines=Linux GNU_GCC +i386.Linux.gpp.c.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion +i386.Linux.gpp.c.includes=**/*.c +i386.Linux.gpp.c.excludes= + +i386.Linux.gpp.fortran.compiler=gfortran +i386.Linux.gpp.fortran.defines=Linux GNU_GCC +i386.Linux.gpp.fortran.options=-Wall +i386.Linux.gpp.fortran.includes=**/*.f **/*.for **/*.f90 +i386.Linux.gpp.fortran.excludes= + +i386.Linux.gpp.java.include=include;include/linux +i386.Linux.gpp.java.runtimeDirectory=jre/lib/i386/client + +i386.Linux.gpp.lib.prefix=lib +i386.Linux.gpp.shared.prefix=lib +i386.Linux.gpp.static.extension=a +i386.Linux.gpp.shared.extension=so* +i386.Linux.gpp.plugin.extension=so +i386.Linux.gpp.jni.extension=so +i386.Linux.gpp.executable.extension= # FIXME to be removed when NAR-6 i386.Linux.gcc.static.extension=a @@ -410,34 +410,34 @@ i386.Linux.ecpc.executable.extension= # amd64.Linux.linker=g++ -amd64.Linux.g++.cpp.compiler=g++ -amd64.Linux.g++.cpp.defines=Linux GNU_GCC -amd64.Linux.g++.cpp.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion -fPIC -amd64.Linux.g++.cpp.includes=**/*.cc **/*.cpp **/*.cxx -amd64.Linux.g++.cpp.excludes= - -amd64.Linux.g++.c.compiler=gcc -amd64.Linux.g++.c.defines=Linux GNU_GCC -amd64.Linux.g++.c.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion -fPIC -amd64.Linux.g++.c.includes=**/*.c -amd64.Linux.g++.c.excludes= - -amd64.Linux.g++.fortran.compiler=gfortran -amd64.Linux.g++.fortran.defines=Linux GNU_GCC -amd64.Linux.g++.fortran.options=-Wall -amd64.Linux.g++.fortran.includes=**/*.f **/*.for **/*.f90 -amd64.Linux.g++.fortran.excludes= - -amd64.Linux.g++.java.include=include;include/linux -amd64.Linux.g++.java.runtimeDirectory=jre/lib/amd64/server - -amd64.Linux.g++.lib.prefix=lib -amd64.Linux.g++.shared.prefix=lib -amd64.Linux.g++.static.extension=a -amd64.Linux.g++.shared.extension=so* -amd64.Linux.g++.plugin.extension=so -amd64.Linux.g++.jni.extension=so -amd64.Linux.g++.executable.extension= +amd64.Linux.gpp.cpp.compiler=g++ +amd64.Linux.gpp.cpp.defines=Linux GNU_GCC +amd64.Linux.gpp.cpp.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion -fPIC +amd64.Linux.gpp.cpp.includes=**/*.cc **/*.cpp **/*.cxx +amd64.Linux.gpp.cpp.excludes= + +amd64.Linux.gpp.c.compiler=gcc +amd64.Linux.gpp.c.defines=Linux GNU_GCC +amd64.Linux.gpp.c.options=-Wall -Wno-long-long -Wpointer-arith -Wconversion -fPIC +amd64.Linux.gpp.c.includes=**/*.c +amd64.Linux.gpp.c.excludes= + +amd64.Linux.gpp.fortran.compiler=gfortran +amd64.Linux.gpp.fortran.defines=Linux GNU_GCC +amd64.Linux.gpp.fortran.options=-Wall +amd64.Linux.gpp.fortran.includes=**/*.f **/*.for **/*.f90 +amd64.Linux.gpp.fortran.excludes= + +amd64.Linux.gpp.java.include=include;include/linux +amd64.Linux.gpp.java.runtimeDirectory=jre/lib/amd64/server + +amd64.Linux.gpp.lib.prefix=lib +amd64.Linux.gpp.shared.prefix=lib +amd64.Linux.gpp.static.extension=a +amd64.Linux.gpp.shared.extension=so +amd64.Linux.gpp.plugin.extension=so +amd64.Linux.gpp.jni.extension=so +amd64.Linux.gpp.executable.extension= # FIXME to be removed when NAR-6 amd64.Linux.gcc.static.extension=a -- cgit v1.2.3