This is an automated email from the ASF dual-hosted git repository.
lanking pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push:
new b242b0c [MXNET-1224]: improve scala maven jni build and packing.
(#13493)
b242b0c is described below
commit b242b0c1fb71da43fba8d6208ee8ca282e735474
Author: Frank Liu <[email protected]>
AuthorDate: Tue Dec 11 15:21:05 2018 -0800
[MXNET-1224]: improve scala maven jni build and packing. (#13493)
Major JNI feature changes. Please find more info here:
https://cwiki.apache.org/confluence/display/MXNET/Scala+maven+build+improvement
---
scala-package/assembly/linux-x86_64-cpu/pom.xml | 4 ++
.../src/main/assembly/assembly.xml | 6 +++
scala-package/assembly/linux-x86_64-gpu/pom.xml | 4 ++
.../src/main/assembly/assembly.xml | 6 +++
.../osx-x86_64-cpu/main/assembly/assembly.xml | 30 -----------
scala-package/assembly/osx-x86_64-cpu/pom.xml | 4 ++
.../osx-x86_64-cpu/src/main/assembly/assembly.xml | 6 +++
scala-package/core/pom.xml | 8 +++
.../apache/mxnet/util/NativeLibraryLoader.scala | 55 ++++++++++++-------
scala-package/examples/pom.xml | 4 ++
scala-package/infer/pom.xml | 4 ++
scala-package/init-native/linux-x86_64/pom.xml | 42 +++++++++++----
scala-package/init-native/osx-x86_64/pom.xml | 49 ++++++++++++++---
scala-package/native/README.md | 63 ++++++++++++++++++++++
scala-package/native/linux-x86_64-cpu/pom.xml | 25 ++++-----
scala-package/native/linux-x86_64-gpu/pom.xml | 25 ++++-----
scala-package/native/osx-x86_64-cpu/pom.xml | 50 ++++++++++++++---
scala-package/pom.xml | 2 +
18 files changed, 291 insertions(+), 96 deletions(-)
diff --git a/scala-package/assembly/linux-x86_64-cpu/pom.xml
b/scala-package/assembly/linux-x86_64-cpu/pom.xml
index abefead..1658f36 100644
--- a/scala-package/assembly/linux-x86_64-cpu/pom.xml
+++ b/scala-package/assembly/linux-x86_64-cpu/pom.xml
@@ -14,6 +14,10 @@
<name>MXNet Scala Package - Full Linux-x86_64 CPU-only</name>
<packaging>jar</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
diff --git
a/scala-package/assembly/linux-x86_64-cpu/src/main/assembly/assembly.xml
b/scala-package/assembly/linux-x86_64-cpu/src/main/assembly/assembly.xml
index a574f8a..f4c2017 100644
--- a/scala-package/assembly/linux-x86_64-cpu/src/main/assembly/assembly.xml
+++ b/scala-package/assembly/linux-x86_64-cpu/src/main/assembly/assembly.xml
@@ -25,4 +25,10 @@
</includes>
</dependencySet>
</dependencySets>
+ <files>
+ <file>
+ <source>${MXNET_DIR}/lib/libmxnet.so</source>
+ <outputDirectory>lib/native</outputDirectory>
+ </file>
+ </files>
</assembly>
diff --git a/scala-package/assembly/linux-x86_64-gpu/pom.xml
b/scala-package/assembly/linux-x86_64-gpu/pom.xml
index 96ffa38..c80515e 100644
--- a/scala-package/assembly/linux-x86_64-gpu/pom.xml
+++ b/scala-package/assembly/linux-x86_64-gpu/pom.xml
@@ -14,6 +14,10 @@
<name>MXNet Scala Package - Full Linux-x86_64 GPU</name>
<packaging>jar</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
diff --git
a/scala-package/assembly/linux-x86_64-gpu/src/main/assembly/assembly.xml
b/scala-package/assembly/linux-x86_64-gpu/src/main/assembly/assembly.xml
index 3a064bf..2aca64b 100644
--- a/scala-package/assembly/linux-x86_64-gpu/src/main/assembly/assembly.xml
+++ b/scala-package/assembly/linux-x86_64-gpu/src/main/assembly/assembly.xml
@@ -25,4 +25,10 @@
</includes>
</dependencySet>
</dependencySets>
+ <files>
+ <file>
+ <source>${MXNET_DIR}/lib/libmxnet.so</source>
+ <outputDirectory>lib/native</outputDirectory>
+ </file>
+ </files>
</assembly>
diff --git a/scala-package/assembly/osx-x86_64-cpu/main/assembly/assembly.xml
b/scala-package/assembly/osx-x86_64-cpu/main/assembly/assembly.xml
deleted file mode 100644
index fecafec..0000000
--- a/scala-package/assembly/osx-x86_64-cpu/main/assembly/assembly.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<assembly>
- <id>full</id>
- <formats>
- <format>jar</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <dependencySets>
- <dependencySet>
- <includes>
- <include>*:*:jar</include>
- </includes>
- <outputDirectory>/</outputDirectory>
- <useProjectArtifact>true</useProjectArtifact>
- <unpack>true</unpack>
- <scope>runtime</scope>
- </dependencySet>
- <dependencySet>
- <outputDirectory>lib/native</outputDirectory>
-
<outputFileNameMapping>${artifact.artifactId}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
- <unpack>false</unpack>
- <useProjectArtifact>false</useProjectArtifact>
- <useStrictFiltering>false</useStrictFiltering>
- <includes>
- <include>*:*:dll:*</include>
- <include>*:*:so:*</include>
- <include>*:*:jnilib:*</include>
- </includes>
- </dependencySet>
- </dependencySets>
-</assembly>
diff --git a/scala-package/assembly/osx-x86_64-cpu/pom.xml
b/scala-package/assembly/osx-x86_64-cpu/pom.xml
index 5c5733a..62979a1 100644
--- a/scala-package/assembly/osx-x86_64-cpu/pom.xml
+++ b/scala-package/assembly/osx-x86_64-cpu/pom.xml
@@ -14,6 +14,10 @@
<name>MXNet Scala Package - Full OSX-x86_64 CPU-only</name>
<packaging>jar</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
diff --git
a/scala-package/assembly/osx-x86_64-cpu/src/main/assembly/assembly.xml
b/scala-package/assembly/osx-x86_64-cpu/src/main/assembly/assembly.xml
index bdbd09f..e9bc372 100644
--- a/scala-package/assembly/osx-x86_64-cpu/src/main/assembly/assembly.xml
+++ b/scala-package/assembly/osx-x86_64-cpu/src/main/assembly/assembly.xml
@@ -25,4 +25,10 @@
</includes>
</dependencySet>
</dependencySets>
+ <files>
+ <file>
+ <source>${MXNET_DIR}/lib/libmxnet.so</source>
+ <outputDirectory>lib/native</outputDirectory>
+ </file>
+ </files>
</assembly>
diff --git a/scala-package/core/pom.xml b/scala-package/core/pom.xml
index 484fbbd..976383f 100644
--- a/scala-package/core/pom.xml
+++ b/scala-package/core/pom.xml
@@ -12,6 +12,7 @@
<properties>
<skipTests>true</skipTests>
+ <MXNET_DIR>${project.parent.basedir}/..</MXNET_DIR>
</properties>
<artifactId>mxnet-core_2.11</artifactId>
@@ -77,6 +78,9 @@
-Djava.library.path=${project.parent.basedir}/native/${platform}/target \
-Dlog4j.configuration=file://${project.basedir}/src/test/resources/log4j.properties
</argLine>
+ <environmentVariables>
+ <LD_LIBRARY_PATH>${MXNET_DIR}/lib</LD_LIBRARY_PATH>
+ </environmentVariables>
</configuration>
</plugin>
<plugin>
@@ -88,6 +92,10 @@
-Djava.library.path=${project.parent.basedir}/native/${platform}/target
</argLine>
<skipTests>${skipTests}</skipTests>
+ <forkMode>always</forkMode>
+ <environmentVariables>
+ <LD_LIBRARY_PATH>${MXNET_DIR}/lib</LD_LIBRARY_PATH>
+ </environmentVariables>
</configuration>
</plugin>
<plugin>
diff --git
a/scala-package/core/src/main/scala/org/apache/mxnet/util/NativeLibraryLoader.scala
b/scala-package/core/src/main/scala/org/apache/mxnet/util/NativeLibraryLoader.scala
index e94d320..2ce893b 100644
---
a/scala-package/core/src/main/scala/org/apache/mxnet/util/NativeLibraryLoader.scala
+++
b/scala-package/core/src/main/scala/org/apache/mxnet/util/NativeLibraryLoader.scala
@@ -85,12 +85,10 @@ private[mxnet] object NativeLibraryLoader {
}
logger.debug(s"Attempting to load $loadLibname")
val libFileInJar = libPathInJar + loadLibname
- val is: InputStream = getClass.getResourceAsStream(libFileInJar)
- if (is == null) {
- throw new UnsatisfiedLinkError(s"Couldn't find the resource
$loadLibname")
- }
- logger.info(s"Loading $loadLibname from $libPathInJar copying to $libname")
- loadLibraryFromStream(libname, is)
+ saveLibraryToTemp("libmxnet.so", "/lib/native/libmxnet.so")
+ val tempfile: File = saveLibraryToTemp(libname, libFileInJar)
+
+ loadLibraryFromFile(libname, tempfile)
}
/**
@@ -109,7 +107,7 @@ private[mxnet] object NativeLibraryLoader {
@throws(classOf[IOException])
private def createTempFile(name: String): File = {
- new File(_tempDir + File.separator + name)
+ new File(_tempDir, name)
}
/**
@@ -117,11 +115,34 @@ private[mxnet] object NativeLibraryLoader {
* and loads from there.
*
* @param libname name of the library (just used in constructing the library
name)
- * @param is InputStream pointing to the library
+ * @param tempfile File pointing to the library
*/
- private def loadLibraryFromStream(libname: String, is: InputStream) {
+ private def loadLibraryFromFile(libname: String, tempfile: File) {
+ try {
+ logger.debug("Loading library from {}", tempfile.getPath)
+ System.load(tempfile.getPath)
+ } catch {
+ case ule: UnsatisfiedLinkError =>
+ logger.error("Couldn't load copied link file: {}", ule.toString)
+ throw ule
+ }
+ }
+
+ /**
+ * Load a system library from a stream. Copies the library to a temp file
+ * and loads from there.
+ *
+ * @param libname name of the library (just used in constructing the
library name)
+ * @param resource String resource path in the jar file
+ */
+ private def saveLibraryToTemp(libname: String, resource: String): File = {
try {
- val tempfile: File = createTempFile(libname)
+ val is: InputStream = getClass.getResourceAsStream(resource)
+ if (is == null) {
+ throw new UnsatisfiedLinkError(s"Couldn't find the resource $resource")
+ }
+
+ val tempfile: File = new File(_tempDir, libname)
val os: OutputStream = new FileOutputStream(tempfile)
logger.debug("tempfile.getPath() = {}", tempfile.getPath)
val savedTime: Long = System.currentTimeMillis
@@ -131,20 +152,14 @@ private[mxnet] object NativeLibraryLoader {
os.write(buf, 0, len)
len = is.read(buf)
}
- os.flush()
- val lock: InputStream = new FileInputStream(tempfile)
os.close()
+ is.close()
val seconds: Double = (System.currentTimeMillis - savedTime).toDouble /
1e3
- logger.debug(s"Copying took $seconds seconds.")
- logger.debug("Loading library from {}", tempfile.getPath)
- System.load(tempfile.getPath)
- lock.close()
+ logger.debug(s"Copying $libname took $seconds seconds.")
+ tempfile
} catch {
case io: IOException =>
- logger.error("Could not create the temp file: {}", io.toString)
- case ule: UnsatisfiedLinkError =>
- logger.error("Couldn't load copied link file: {}", ule.toString)
- throw ule
+ throw new UnsatisfiedLinkError(s"Could not create temp file for
$libname")
}
}
}
diff --git a/scala-package/examples/pom.xml b/scala-package/examples/pom.xml
index bc53339..3ebb39b 100644
--- a/scala-package/examples/pom.xml
+++ b/scala-package/examples/pom.xml
@@ -15,6 +15,7 @@
<properties>
<skipTests>true</skipTests>
+ <MXNET_DIR>${project.parent.basedir}/..</MXNET_DIR>
</properties>
<profiles>
@@ -151,6 +152,9 @@
-Djava.library.path=${project.parent.basedir}/native/${platform}/target \
-Dlog4j.configuration=file://${project.basedir}/src/test/resources/log4j.properties
</argLine>
+ <environmentVariables>
+ <LD_LIBRARY_PATH>${MXNET_DIR}/lib</LD_LIBRARY_PATH>
+ </environmentVariables>
</configuration>
</plugin>
<plugin>
diff --git a/scala-package/infer/pom.xml b/scala-package/infer/pom.xml
index ac76cdd..fb5cf37 100644
--- a/scala-package/infer/pom.xml
+++ b/scala-package/infer/pom.xml
@@ -15,6 +15,7 @@
<properties>
<skipTests>true</skipTests>
+ <MXNET_DIR>${project.parent.basedir}/..</MXNET_DIR>
</properties>
<profiles>
@@ -77,6 +78,9 @@
-Djava.library.path=${project.parent.basedir}/native/${platform}/target \
-Dlog4j.configuration=file://${project.basedir}/src/test/resources/log4j.properties
</argLine>
+ <environmentVariables>
+ <LD_LIBRARY_PATH>${MXNET_DIR}/lib</LD_LIBRARY_PATH>
+ </environmentVariables>
</configuration>
</plugin>
<plugin>
diff --git a/scala-package/init-native/linux-x86_64/pom.xml
b/scala-package/init-native/linux-x86_64/pom.xml
index b71d7cf..242f2f3 100644
--- a/scala-package/init-native/linux-x86_64/pom.xml
+++ b/scala-package/init-native/linux-x86_64/pom.xml
@@ -16,6 +16,10 @@
<packaging>so</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
@@ -62,22 +66,24 @@
<compilerStartOption>-std=c++0x</compilerStartOption>
</compilerStartOptions>
<compilerEndOptions>
-
<compilerEndOption>-I${project.basedir}/../../../include</compilerEndOption>
- <compilerEndOption>${all_includes}</compilerEndOption>
- <compilerEndOption>${cflags}</compilerEndOption>
+ <compilerEndOption>-I${MXNET_DIR}/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dmlc-core/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/mshadow</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dlpack/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/tvm/nnvm/include</compilerEndOption>
+ <compilerEndOption>-DMSHADOW_USE_MKL=0
-DMSHADOW_USE_CUDA=0</compilerEndOption>
+ <compilerEndOption>-O3 -DNDEBUG=1 -fPIC -msse3
-mf16c</compilerEndOption>
+ <compilerEndOption>-Wall -Wsign-compare -Wno-unused-parameter
-Wno-unknown-pragmas -Wno-unused-local-typedefs</compilerEndOption>
</compilerEndOptions>
<linkerStartOptions>
<linkerStartOption>-shared</linkerStartOption>
</linkerStartOptions>
<linkerMiddleOptions>
- <linkerMiddleOption>${all_ldpaths}</linkerMiddleOption>
<linkerMiddleOption>-Wl,--whole-archive</linkerMiddleOption>
- <linkerMiddleOption>${lddeps}</linkerMiddleOption>
- <linkerMiddleOption>-Wl,--no-whole-archive</linkerMiddleOption>
+ <linkerMiddleOption>-Wl,--no-whole-archive -pthread -lm -fopenmp
-lrt</linkerMiddleOption>
</linkerMiddleOptions>
<linkerEndOptions>
- <linkerEndOption>${ldflags}</linkerEndOption>
- <linkerEndOption>-fopenmp</linkerEndOption>
+ <linkerEndOption>-Wl,-rpath=${dollar}ORIGIN -lmxnet
-L${MXNET_DIR}/lib</linkerEndOption>
</linkerEndOptions>
</configuration>
@@ -86,7 +92,6 @@
<id>javah</id>
<phase>generate-sources</phase>
<configuration>
- <javahOS>linux</javahOS>
<javahProvider>default</javahProvider>
<javahOutputDirectory>${project.build.directory}/custom-javah</javahOutputDirectory>
<workingDirectory>${basedir}</workingDirectory>
@@ -101,6 +106,25 @@
</execution>
</executions>
</plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.6.0</version>
+ <executions>
+ <execution>
+ <id>link-native-lib</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <executable>ln</executable>
+ <commandlineArgs>-sf ${MXNET_DIR}/lib/libmxnet.so
${project.build.directory}/libmxnet.so</commandlineArgs>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
</project>
diff --git a/scala-package/init-native/osx-x86_64/pom.xml
b/scala-package/init-native/osx-x86_64/pom.xml
index b4a0b1d..12f4d80 100644
--- a/scala-package/init-native/osx-x86_64/pom.xml
+++ b/scala-package/init-native/osx-x86_64/pom.xml
@@ -16,6 +16,10 @@
<packaging>jnilib</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
@@ -62,8 +66,14 @@
<compilerStartOption>-std=c++0x</compilerStartOption>
</compilerStartOptions>
<compilerEndOptions>
-
<compilerEndOption>-I${project.basedir}/../../../include</compilerEndOption>
- <compilerEndOption>${cflags}</compilerEndOption>
+ <compilerEndOption>-I${MXNET_DIR}/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dmlc-core/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/mshadow</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dlpack/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/tvm/nnvm/include</compilerEndOption>
+ <compilerEndOption>-DMSHADOW_USE_MKL=0
-DMSHADOW_USE_CUDA=0</compilerEndOption>
+ <compilerEndOption>-g -O0 -fPIC -msse3 -mf16c</compilerEndOption>
+ <compilerEndOption>-Wall -Wsign-compare -Wno-unused-parameter
-Wno-unknown-pragmas -Wno-unused-local-typedefs</compilerEndOption>
</compilerEndOptions>
<linkerStartOptions>
<linkerStartOption>-shared</linkerStartOption>
@@ -72,11 +82,9 @@
<linkerMiddleOption>-framework JavaVM</linkerMiddleOption>
<linkerMiddleOption>-Wl,-exported_symbol,_Java_*</linkerMiddleOption>
<linkerMiddleOption>-Wl,-x</linkerMiddleOption>
- <linkerMiddleOption>${lddeps}</linkerMiddleOption>
- <linkerMiddleOption>-force_load
${project.basedir}/../../../lib/libmxnet.a</linkerMiddleOption>
</linkerMiddleOptions>
<linkerEndOptions>
- <linkerEndOption>${ldflags}</linkerEndOption>
+ <linkerEndOption>-lmxnet -L${MXNET_DIR}/lib</linkerEndOption>
</linkerEndOptions>
</configuration>
@@ -85,7 +93,6 @@
<id>javah</id>
<phase>generate-sources</phase>
<configuration>
- <javahOS>darwin</javahOS>
<javahProvider>default</javahProvider>
<javahOutputDirectory>${project.build.directory}/custom-javah</javahOutputDirectory>
<workingDirectory>${basedir}</workingDirectory>
@@ -100,6 +107,36 @@
</execution>
</executions>
</plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.6.0</version>
+ <executions>
+ <execution>
+ <id>post-native-build</id>
+ <phase>package</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <executable>install_name_tool</executable>
+ <commandlineArgs>-change lib/libmxnet.so
@loader_path/libmxnet.so
${project.build.directory}/${artifactId}.jnilib</commandlineArgs>
+ </configuration>
+ </execution>
+ <execution>
+ <id>link-native-lib</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <executable>ln</executable>
+ <commandlineArgs>-sf ${MXNET_DIR}/lib/libmxnet.so
${project.build.directory}/libmxnet.so</commandlineArgs>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
</project>
diff --git a/scala-package/native/README.md b/scala-package/native/README.md
new file mode 100644
index 0000000..cb6dd38
--- /dev/null
+++ b/scala-package/native/README.md
@@ -0,0 +1,63 @@
+# MXNet Scala JNI
+
+MXNet Scala JNI is a thin wrapper layer of underlying libmxnet.so.
+
+## javah
+JNI native code requires a header file that matches the java/scala interface,
+this file is usually generated with javah.
+
+In our case, jni_helper_func.h is generated and will be used to compile native
code.
+
+
+## Linker options
+
+Scala JNI (libmxnet-scala.so/libmxnet-scala.jnilib) is dynamically linked to
libmxnet.so.
+MXNet Scala will trying to load libmxnet.so from system LD_LIBRARY_PATH first.
+If it failed, the try to resolve libmxnet.so in the same location as
libmxnet-scala.so file.
+
+### Linux
+```
+-Wl,-rpath=$ORIGIN -lmxnet
+```
+Above option will tell system to looking for libmxnet.so from the same
location.
+
+
+### Mac OSX
+On Mac, we have to execute install_name_tool command to change library loading
path:
+```bash
+install_name_tool -change lib/libmxnet.so @loader_path/libmxnet.so
libmxnet-scala.jnilib
+```
+
+Other linker options:
+* -shared : link as shared library
+* -Wl,-install_name,libmxnet-scala.jnilib : avoid use build machine's absolute
path
+* -framework JavaVM : Stand jni options for mac
+* -Wl,-exported_symbol,_Java_* : Stand jni options for mac
+* -Wl,-x : Do not put non-global symbols in the output file's symbol table.
+
+
+## Compiler flags
+
+Scala JNI code technically doesn't need on any of MXNet make flags,
+however c_api.h header links to many other dependencies header file,
+which requires us to add DMSHADOW_USE_MKL and DMSHADOW_USE_CUDA to compile the
JNI code.
+These flags are not actually used by JNI and won't impact Scala's behavior.
+
+
+### Linux
+
+```
+-DMSHADOW_USE_MKL=0
+-DMSHADOW_USE_CUDA=0
+-O3 -DNDEBUG=1 -fPIC -msse3 -mf16c
+-Wall -Wsign-compare -Wno-unused-parameter -Wno-unknown-pragmas
-Wno-unused-local-typedefs
+```
+
+### Mac OSX
+
+```
+-DMSHADOW_USE_MKL=0
+-DMSHADOW_USE_CUDA=0
+-g -O0 -fPIC -msse3 -mf16c
+-Wall -Wsign-compare -Wno-unused-parameter -Wno-unknown-pragmas
-Wno-unused-local-typedefs
+```
diff --git a/scala-package/native/linux-x86_64-cpu/pom.xml
b/scala-package/native/linux-x86_64-cpu/pom.xml
index 2415cf7..7cfd01a 100644
--- a/scala-package/native/linux-x86_64-cpu/pom.xml
+++ b/scala-package/native/linux-x86_64-cpu/pom.xml
@@ -16,6 +16,10 @@
<packaging>so</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
@@ -62,22 +66,20 @@
<compilerStartOption>-std=c++0x</compilerStartOption>
</compilerStartOptions>
<compilerEndOptions>
-
<compilerEndOption>-I${project.basedir}/../../../include</compilerEndOption>
- <compilerEndOption>${all_includes}</compilerEndOption>
- <compilerEndOption>${cflags}</compilerEndOption>
+ <compilerEndOption>-I${MXNET_DIR}/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dmlc-core/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/mshadow</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dlpack/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/tvm/nnvm/include</compilerEndOption>
+ <compilerEndOption>-DMSHADOW_USE_MKL=0
-DMSHADOW_USE_CUDA=0</compilerEndOption>
+ <compilerEndOption>-O3 -DNDEBUG=1 -fPIC -msse3
-mf16c</compilerEndOption>
+ <compilerEndOption>-Wall -Wsign-compare -Wno-unused-parameter
-Wno-unknown-pragmas -Wno-unused-local-typedefs</compilerEndOption>
</compilerEndOptions>
<linkerStartOptions>
<linkerStartOption>-shared</linkerStartOption>
</linkerStartOptions>
- <linkerMiddleOptions>
- <linkerMiddleOption>${all_ldpaths}</linkerMiddleOption>
- <linkerMiddleOption>-Wl,--whole-archive</linkerMiddleOption>
- <linkerMiddleOption>${lddeps}</linkerMiddleOption>
- <linkerMiddleOption>-Wl,--no-whole-archive</linkerMiddleOption>
- </linkerMiddleOptions>
<linkerEndOptions>
- <linkerEndOption>${ldflags}</linkerEndOption>
- <linkerEndOption>-fopenmp</linkerEndOption>
+ <linkerEndOption>-Wl,-rpath=${dollar}ORIGIN -lmxnet
-L${MXNET_DIR}/lib</linkerEndOption>
</linkerEndOptions>
</configuration>
@@ -86,7 +88,6 @@
<id>javah</id>
<phase>generate-sources</phase>
<configuration>
- <javahOS>linux</javahOS>
<javahProvider>default</javahProvider>
<javahOutputDirectory>${project.build.directory}/custom-javah</javahOutputDirectory>
<workingDirectory>${basedir}</workingDirectory>
diff --git a/scala-package/native/linux-x86_64-gpu/pom.xml
b/scala-package/native/linux-x86_64-gpu/pom.xml
index 0186217..668f330 100644
--- a/scala-package/native/linux-x86_64-gpu/pom.xml
+++ b/scala-package/native/linux-x86_64-gpu/pom.xml
@@ -16,6 +16,10 @@
<packaging>so</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
@@ -62,22 +66,20 @@
<compilerStartOption>-std=c++0x</compilerStartOption>
</compilerStartOptions>
<compilerEndOptions>
-
<compilerEndOption>-I${project.basedir}/../../../include</compilerEndOption>
- <compilerEndOption>${all_includes}</compilerEndOption>
- <compilerEndOption>${cflags}</compilerEndOption>
+ <compilerEndOption>-I${MXNET_DIR}/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dmlc-core/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/mshadow</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dlpack/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/tvm/nnvm/include</compilerEndOption>
+ <compilerEndOption>-DMSHADOW_USE_MKL=0
-DMSHADOW_USE_CUDA=0</compilerEndOption>
+ <compilerEndOption>-O3 -DNDEBUG=1 -fPIC -msse3
-mf16c</compilerEndOption>
+ <compilerEndOption>-Wall -Wsign-compare -Wno-unused-parameter
-Wno-unknown-pragmas -Wno-unused-local-typedefs</compilerEndOption>
</compilerEndOptions>
<linkerStartOptions>
<linkerStartOption>-shared</linkerStartOption>
</linkerStartOptions>
- <linkerMiddleOptions>
- <linkerMiddleOption>${all_ldpaths}</linkerMiddleOption>
- <linkerMiddleOption>-Wl,--whole-archive</linkerMiddleOption>
- <linkerMiddleOption>${lddeps}</linkerMiddleOption>
- <linkerMiddleOption>-Wl,--no-whole-archive</linkerMiddleOption>
- </linkerMiddleOptions>
<linkerEndOptions>
- <linkerEndOption>${ldflags}</linkerEndOption>
- <linkerEndOption>-fopenmp</linkerEndOption>
+ <linkerEndOption>-Wl,-rpath=${dollar}ORIGIN -lmxnet
-L${MXNET_DIR}/lib</linkerEndOption>
</linkerEndOptions>
</configuration>
@@ -86,7 +88,6 @@
<id>javah</id>
<phase>generate-sources</phase>
<configuration>
- <javahOS>linux</javahOS>
<javahProvider>default</javahProvider>
<javahOutputDirectory>${project.build.directory}/custom-javah</javahOutputDirectory>
<workingDirectory>${basedir}</workingDirectory>
diff --git a/scala-package/native/osx-x86_64-cpu/pom.xml
b/scala-package/native/osx-x86_64-cpu/pom.xml
index 0ab7ca1..425ca96 100644
--- a/scala-package/native/osx-x86_64-cpu/pom.xml
+++ b/scala-package/native/osx-x86_64-cpu/pom.xml
@@ -16,6 +16,10 @@
<packaging>jnilib</packaging>
+ <properties>
+ <MXNET_DIR>${project.parent.parent.basedir}/..</MXNET_DIR>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.mxnet</groupId>
@@ -62,8 +66,14 @@
<compilerStartOption>-std=c++0x</compilerStartOption>
</compilerStartOptions>
<compilerEndOptions>
- <compilerEndOption>-I../../../include</compilerEndOption>
- <compilerEndOption>${cflags}</compilerEndOption>
+ <compilerEndOption>-I${MXNET_DIR}/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dmlc-core/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/mshadow</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/dlpack/include</compilerEndOption>
+
<compilerEndOption>-I${MXNET_DIR}/3rdparty/tvm/nnvm/include</compilerEndOption>
+ <compilerEndOption>-DMSHADOW_USE_MKL=0
-DMSHADOW_USE_CUDA=0</compilerEndOption>
+ <compilerEndOption>-g -O0 -fPIC -msse3 -mf16c</compilerEndOption>
+ <compilerEndOption>-Wall -Wsign-compare -Wno-unused-parameter
-Wno-unknown-pragmas -Wno-unused-local-typedefs</compilerEndOption>
</compilerEndOptions>
<linkerStartOptions>
<linkerStartOption>-shared</linkerStartOption>
@@ -72,12 +82,9 @@
<linkerMiddleOption>-framework JavaVM</linkerMiddleOption>
<linkerMiddleOption>-Wl,-exported_symbol,_Java_*</linkerMiddleOption>
<linkerMiddleOption>-Wl,-x</linkerMiddleOption>
- <linkerMiddleOption>${lddeps}</linkerMiddleOption>
- <linkerMiddleOption>-force_load
${project.basedir}/../../../lib/libmxnet.a</linkerMiddleOption>
- <linkerMiddleOption>-force_load
${project.basedir}/../../../3rdparty/tvm/nnvm/lib/libnnvm.a</linkerMiddleOption>
</linkerMiddleOptions>
<linkerEndOptions>
- <linkerEndOption>${ldflags}</linkerEndOption>
+ <linkerEndOption>-Wl,-install_name,libmxnet-scala.jnilib -lmxnet
-L${MXNET_DIR}/lib</linkerEndOption>
</linkerEndOptions>
</configuration>
@@ -86,7 +93,6 @@
<id>javah</id>
<phase>generate-sources</phase>
<configuration>
- <javahOS>darwin</javahOS>
<javahProvider>default</javahProvider>
<javahOutputDirectory>${project.build.directory}/custom-javah</javahOutputDirectory>
<workingDirectory>${basedir}</workingDirectory>
@@ -101,6 +107,36 @@
</execution>
</executions>
</plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.6.0</version>
+ <executions>
+ <execution>
+ <id>post-native-build</id>
+ <phase>package</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <executable>install_name_tool</executable>
+ <commandlineArgs>-change lib/libmxnet.so
@loader_path/libmxnet.so
${project.build.directory}/${artifactId}.jnilib</commandlineArgs>
+ </configuration>
+ </execution>
+ <execution>
+ <id>link-native-lib</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <executable>ln</executable>
+ <commandlineArgs>-sf ${MXNET_DIR}/lib/libmxnet.so
${project.build.directory}/libmxnet.so</commandlineArgs>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
</project>
diff --git a/scala-package/pom.xml b/scala-package/pom.xml
index 151462c..6eb573b 100644
--- a/scala-package/pom.xml
+++ b/scala-package/pom.xml
@@ -39,6 +39,8 @@
<scala.version>2.11.8</scala.version>
<scala.binary.version>2.11</scala.binary.version>
<build.platform />
+ <cxx>g++</cxx>
+ <dollar>$</dollar>
</properties>
<packaging>pom</packaging>