summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Schumacher <volker@antenna500.local>2010-01-12 00:34:06 +0800
committerMark Donszelmann <Mark.Donszelmann@gmail.com>2010-01-17 03:54:17 +0800
commite599175b2ebcd63796c1584772d6f531d89104b2 (patch)
treeaad6daebc10e0a337b644425ad5ecd31a4860c10
parentf627552a60d32aa15e5487b04263bcc755b2f430 (diff)
downloadmaven-nar-plugin-e599175b2ebcd63796c1584772d6f531d89104b2.tar.gz
maven-nar-plugin-e599175b2ebcd63796c1584772d6f531d89104b2.tar.bz2
maven-nar-plugin-e599175b2ebcd63796c1584772d6f531d89104b2.tar.xz
maven-nar-plugin-e599175b2ebcd63796c1584772d6f531d89104b2.zip
run install_name_tool after unpacking shared/jni libraries on mac.
-rw-r--r--src/main/java/org/apache/maven/plugin/nar/AbstractNarLayout.java8
-rw-r--r--src/main/java/org/apache/maven/plugin/nar/NarUtil.java92
2 files changed, 99 insertions, 1 deletions
diff --git a/src/main/java/org/apache/maven/plugin/nar/AbstractNarLayout.java b/src/main/java/org/apache/maven/plugin/nar/AbstractNarLayout.java
index 3f2cf17..d04c01e 100644
--- a/src/main/java/org/apache/maven/plugin/nar/AbstractNarLayout.java
+++ b/src/main/java/org/apache/maven/plugin/nar/AbstractNarLayout.java
@@ -139,6 +139,14 @@ public abstract class AbstractNarLayout
log );
}
}
+ if ( NarUtil.getOS( os ).equals( OS.MACOSX ) )
+ {
+ File[] dylibDirs = new File[2];
+ dylibDirs[0] = new File( narLocation, "lib/" + defaultAOL + "/" + Library.SHARED );
+ dylibDirs[1] = new File( narLocation, "lib/" + defaultAOL + "/" + Library.JNI );
+
+ NarUtil.runInstallNameTool( dylibDirs, log );
+ }
}
/**
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 fd0f6a1..2d4f221 100644
--- a/src/main/java/org/apache/maven/plugin/nar/NarUtil.java
+++ b/src/main/java/org/apache/maven/plugin/nar/NarUtil.java
@@ -26,10 +26,12 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import java.util.regex.Pattern;
import org.apache.bcel.classfile.ClassParser;
@@ -46,7 +48,6 @@ import org.codehaus.plexus.util.cli.Commandline;
*/
public final class NarUtil
{
-
private NarUtil()
{
// never instantiate
@@ -210,6 +211,95 @@ public final class NarUtil
}
}
+ static void runInstallNameTool( File[] files, final Log log )
+ throws MojoExecutionException, MojoFailureException
+ {
+ Set libs = findInstallNameToolCandidates( files, log );
+
+ for ( Iterator i = libs.iterator(); i.hasNext(); )
+ {
+ File subjectFile = ( File )i.next();
+ String subjectName = subjectFile.getName();
+ String subjectPath = subjectFile.getPath();
+
+ int idResult = runCommand(
+ "install_name_tool",
+ new String[] { "-id", subjectPath, subjectPath },
+ null, null, log );
+
+ if ( idResult != 0 )
+ {
+ throw new MojoExecutionException(
+ "Failed to execute 'install_name_tool -id "
+ + subjectPath
+ + " "
+ + subjectPath
+ + "'"
+ + " return code: \'"
+ + idResult
+ + "\'." );
+ }
+
+ for ( Iterator j = libs.iterator(); j.hasNext(); )
+ {
+ File dependentFile = ( File )j.next();
+ String dependentPath = dependentFile.getPath();
+
+ if (dependentPath == subjectPath) continue;
+
+ int changeResult = runCommand(
+ "install_name_tool",
+ new String[] { "-change", subjectName, subjectPath, dependentPath },
+ null, null, log );
+
+ if ( changeResult != 0 )
+ {
+ throw new MojoExecutionException(
+ "Failed to execute 'install_name_tool -change "
+ + subjectName
+ + " "
+ + subjectPath
+ + " "
+ + dependentPath
+ + "'"
+ + " return code: \'"
+ + changeResult
+ + "\'." );
+ }
+ }
+ }
+ }
+
+ static Set findInstallNameToolCandidates( File[] files, final Log log )
+ throws MojoExecutionException, MojoFailureException
+ {
+ HashSet candidates = new HashSet();
+
+ for (int i = 0; i < files.length; i++)
+ {
+ File file = files[i];
+
+ if ( !file.exists() )
+ {
+ continue;
+ }
+
+ if ( file.isDirectory() )
+ {
+ candidates.addAll(findInstallNameToolCandidates( file.listFiles(), log ));
+ }
+
+ String fileName = file.getName();
+ if ( file.isFile() && file.canWrite()
+ && ( fileName.endsWith( ".dylib" ) || (fileName.endsWith( ".jnilib" ))))
+ {
+ candidates.add(file);
+ }
+ }
+
+ return candidates;
+ }
+
public static void makeLink( File file, final Log log )
throws MojoExecutionException, MojoFailureException
{