From 1c89512ec0e08e1b86c075e09c1da47a970d10e5 Mon Sep 17 00:00:00 2001
From: Samuel Audet <samuel.audet@gmail.com>
Date: Wed, 4 Mar 2020 17:11:01 +0900
Subject: [PATCH] Add Maven profiles for ARM builds to pom.xml files (#265)

* Add Maven profiles for ARM builds to pom.xml files

Signed-off-by: Samuel Audet <samuel.audet@gmail.com>

* Remove mkl from dependencies when running on non intel/amd platforms

* Downgrade openblas for now

* Change back to 0.3.8

Co-authored-by: Adam Gibson <1144306+agibsonccc@users.noreply.github.com>
---
 .../nd4j-backend-impls/nd4j-native/pom.xml    |  34 +-
 nd4j/nd4j-backends/nd4j-backend-impls/pom.xml | 385 +++++++++++++++---
 pom.xml                                       |  47 ++-
 3 files changed, 378 insertions(+), 88 deletions(-)

diff --git a/nd4j/nd4j-backends/nd4j-backend-impls/nd4j-native/pom.xml b/nd4j/nd4j-backends/nd4j-backend-impls/nd4j-native/pom.xml
index f3418657e..379f69563 100644
--- a/nd4j/nd4j-backends/nd4j-backend-impls/nd4j-native/pom.xml
+++ b/nd4j/nd4j-backends/nd4j-backend-impls/nd4j-native/pom.xml
@@ -50,17 +50,7 @@
             <version>${openblas.version}-${javacpp-presets.version}</version>
             <classifier>${dependency.platform}</classifier>
         </dependency>
-        <dependency>
-            <groupId>org.bytedeco</groupId>
-            <artifactId>mkl</artifactId>
-            <version>${mkl.version}-${javacpp-presets.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.bytedeco</groupId>
-            <artifactId>mkl</artifactId>
-            <version>${mkl.version}-${javacpp-presets.version}</version>
-            <classifier>${dependency.platform2}</classifier>
-        </dependency>
+
         <!--
         <dependency>
             <groupId>org.nd4j</groupId>
@@ -258,6 +248,28 @@
     </build>
 
     <profiles>
+        <profile>
+            <id>mkl</id>
+            <activation>
+                <property>
+                    <name>os.arch</name>
+                    <value>x86_64</value>
+                </property>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.bytedeco</groupId>
+                    <artifactId>mkl</artifactId>
+                    <version>${mkl.version}-${javacpp-presets.version}</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.bytedeco</groupId>
+                    <artifactId>mkl</artifactId>
+                    <version>${mkl.version}-${javacpp-presets.version}</version>
+                    <classifier>${dependency.platform2}</classifier>
+                </dependency>
+            </dependencies>
+        </profile>
         <profile>
             <id>testresources</id>
         </profile>
diff --git a/nd4j/nd4j-backends/nd4j-backend-impls/pom.xml b/nd4j/nd4j-backends/nd4j-backend-impls/pom.xml
index c6da5e6f0..c355bf0a5 100644
--- a/nd4j/nd4j-backends/nd4j-backend-impls/pom.xml
+++ b/nd4j/nd4j-backends/nd4j-backend-impls/pom.xml
@@ -36,22 +36,22 @@
         <dependency.classifier>${javacpp.platform}${javacpp.platform.extension}</dependency.classifier>
         <dependency.platform></dependency.platform>   <!-- Same as ${javacpp.platform} but without breaking Gradle, sbt, etc -->
         <dependency.platform2></dependency.platform2> <!-- Same as ${dependency.platform} minus Android, iOS, etc -->
-        <javacpp.platform.android-arm>android-arm</javacpp.platform.android-arm>
-        <javacpp.platform.android-arm64>android-arm64</javacpp.platform.android-arm64>
-        <javacpp.platform.android-x86>android-x86</javacpp.platform.android-x86>
-        <javacpp.platform.android-x86_64>android-x86_64</javacpp.platform.android-x86_64>
-        <javacpp.platform.ios-arm>ios-arm</javacpp.platform.ios-arm>
-        <javacpp.platform.ios-arm64>ios-arm64</javacpp.platform.ios-arm64>
-        <javacpp.platform.ios-x86>ios-x86</javacpp.platform.ios-x86>
-        <javacpp.platform.ios-x86_64>ios-x86_64</javacpp.platform.ios-x86_64>
-        <javacpp.platform.linux-armhf>linux-armhf</javacpp.platform.linux-armhf>
-        <javacpp.platform.linux-arm64>linux-arm64</javacpp.platform.linux-arm64>
-        <javacpp.platform.linux-ppc64le>linux-ppc64le</javacpp.platform.linux-ppc64le>
-        <javacpp.platform.linux-x86>linux-x86</javacpp.platform.linux-x86>
-        <javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64>
-        <javacpp.platform.macosx-x86_64>macosx-x86_64</javacpp.platform.macosx-x86_64>
-        <javacpp.platform.windows-x86>windows-x86</javacpp.platform.windows-x86>
-        <javacpp.platform.windows-x86_64>windows-x86_64</javacpp.platform.windows-x86_64>
+        <javacpp.platform.android-arm>android-arm${javacpp.platform.extension}</javacpp.platform.android-arm>
+        <javacpp.platform.android-arm64>android-arm64${javacpp.platform.extension}</javacpp.platform.android-arm64>
+        <javacpp.platform.android-x86>android-x86${javacpp.platform.extension}</javacpp.platform.android-x86>
+        <javacpp.platform.android-x86_64>android-x86_64${javacpp.platform.extension}</javacpp.platform.android-x86_64>
+        <javacpp.platform.ios-arm>ios-arm${javacpp.platform.extension}</javacpp.platform.ios-arm>
+        <javacpp.platform.ios-arm64>ios-arm64${javacpp.platform.extension}</javacpp.platform.ios-arm64>
+        <javacpp.platform.ios-x86>ios-x86${javacpp.platform.extension}</javacpp.platform.ios-x86>
+        <javacpp.platform.ios-x86_64>ios-x86_64${javacpp.platform.extension}</javacpp.platform.ios-x86_64>
+        <javacpp.platform.linux-armhf>linux-armhf${javacpp.platform.extension}</javacpp.platform.linux-armhf>
+        <javacpp.platform.linux-arm64>linux-arm64${javacpp.platform.extension}</javacpp.platform.linux-arm64>
+        <javacpp.platform.linux-ppc64le>linux-ppc64le${javacpp.platform.extension}</javacpp.platform.linux-ppc64le>
+        <javacpp.platform.linux-x86>linux-x86${javacpp.platform.extension}</javacpp.platform.linux-x86>
+        <javacpp.platform.linux-x86_64>linux-x86_64${javacpp.platform.extension}</javacpp.platform.linux-x86_64>
+        <javacpp.platform.macosx-x86_64>macosx-x86_64${javacpp.platform.extension}</javacpp.platform.macosx-x86_64>
+        <javacpp.platform.windows-x86>windows-x86${javacpp.platform.extension}</javacpp.platform.windows-x86>
+        <javacpp.platform.windows-x86_64>windows-x86_64${javacpp.platform.extension}</javacpp.platform.windows-x86_64>
     </properties>
 
 
@@ -234,22 +234,22 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.android-arm>${javacpp.platform}</javacpp.platform.android-arm>
-                <javacpp.platform.android-arm64>${javacpp.platform}</javacpp.platform.android-arm64>
-                <javacpp.platform.android-x86>${javacpp.platform}</javacpp.platform.android-x86>
-                <javacpp.platform.android-x86_64>${javacpp.platform}</javacpp.platform.android-x86_64>
-                <javacpp.platform.ios-arm>${javacpp.platform}</javacpp.platform.ios-arm>
-                <javacpp.platform.ios-arm64>${javacpp.platform}</javacpp.platform.ios-arm64>
-                <javacpp.platform.ios-x86>${javacpp.platform}</javacpp.platform.ios-x86>
-                <javacpp.platform.ios-x86_64>${javacpp.platform}</javacpp.platform.ios-x86_64>
-                <javacpp.platform.linux-armhf>${javacpp.platform}</javacpp.platform.linux-armhf>
-                <javacpp.platform.linux-arm64>${javacpp.platform}</javacpp.platform.linux-arm64>
-                <javacpp.platform.linux-ppc64le>${javacpp.platform}</javacpp.platform.linux-ppc64le>
-                <javacpp.platform.linux-x86>${javacpp.platform}</javacpp.platform.linux-x86>
-                <javacpp.platform.linux-x86_64>${javacpp.platform}</javacpp.platform.linux-x86_64>
-                <javacpp.platform.macosx-x86_64>${javacpp.platform}</javacpp.platform.macosx-x86_64>
-                <javacpp.platform.windows-x86>${javacpp.platform}</javacpp.platform.windows-x86>
-                <javacpp.platform.windows-x86_64>${javacpp.platform}</javacpp.platform.windows-x86_64>
+                <javacpp.platform.android-arm>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.android-arm>
+                <javacpp.platform.android-arm64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.android-arm64>
+                <javacpp.platform.android-x86>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.android-x86>
+                <javacpp.platform.android-x86_64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.android-x86_64>
+                <javacpp.platform.ios-arm>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.ios-arm>
+                <javacpp.platform.ios-arm64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.ios-arm64>
+                <javacpp.platform.ios-x86>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.ios-x86>
+                <javacpp.platform.ios-x86_64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.ios-x86_64>
+                <javacpp.platform.linux-armhf>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.linux-armhf>
+                <javacpp.platform.linux-arm64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.linux-arm64>
+                <javacpp.platform.linux-ppc64le>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.linux-ppc64le>
+                <javacpp.platform.linux-x86>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.linux-x86>
+                <javacpp.platform.linux-x86_64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.linux-x86_64>
+                <javacpp.platform.macosx-x86_64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.macosx-x86_64>
+                <javacpp.platform.windows-x86>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.windows-x86>
+                <javacpp.platform.windows-x86_64>${javacpp.platform}${javacpp.platform.extension}</javacpp.platform.windows-x86_64>
                 <dependency.classifier>${javacpp.platform}${javacpp.platform.extension}</dependency.classifier>
                 <dependency.platform>${javacpp.platform}</dependency.platform>
                 <dependency.platform2>${javacpp.platform}</dependency.platform2>
@@ -264,29 +264,60 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform>${os.name}-${os.arch}</javacpp.platform>
-                <javacpp.platform.android-arm>${os.name}-${os.arch}</javacpp.platform.android-arm>
-                <javacpp.platform.android-arm64>${os.name}-${os.arch}</javacpp.platform.android-arm64>
-                <javacpp.platform.android-x86>${os.name}-${os.arch}</javacpp.platform.android-x86>
-                <javacpp.platform.android-x86_64>${os.name}-${os.arch}</javacpp.platform.android-x86_64>
-                <javacpp.platform.ios-arm>${os.name}-${os.arch}</javacpp.platform.ios-arm>
-                <javacpp.platform.ios-arm64>${os.name}-${os.arch}</javacpp.platform.ios-arm64>
-                <javacpp.platform.ios-x86>${os.name}-${os.arch}</javacpp.platform.ios-x86>
-                <javacpp.platform.ios-x86_64>${os.name}-${os.arch}</javacpp.platform.ios-x86_64>
-                <javacpp.platform.linux-armhf>${os.name}-${os.arch}</javacpp.platform.linux-armhf>
-                <javacpp.platform.linux-arm64>${os.name}-${os.arch}</javacpp.platform.linux-arm64>
-                <javacpp.platform.linux-ppc64le>${os.name}-${os.arch}</javacpp.platform.linux-ppc64le>
-                <javacpp.platform.linux-x86>${os.name}-${os.arch}</javacpp.platform.linux-x86>
-                <javacpp.platform.linux-x86_64>${os.name}-${os.arch}</javacpp.platform.linux-x86_64>
-                <javacpp.platform.macosx-x86_64>${os.name}-${os.arch}</javacpp.platform.macosx-x86_64>
-                <javacpp.platform.windows-x86>${os.name}-${os.arch}</javacpp.platform.windows-x86>
-                <javacpp.platform.windows-x86_64>${os.name}-${os.arch}</javacpp.platform.windows-x86_64>
+                <javacpp.platform>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform>
+                <javacpp.platform.android-arm>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.android-arm>
+                <javacpp.platform.android-arm64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.android-arm64>
+                <javacpp.platform.android-x86>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.android-x86>
+                <javacpp.platform.android-x86_64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.android-x86_64>
+                <javacpp.platform.ios-arm>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.ios-arm>
+                <javacpp.platform.ios-arm64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.ios-arm64>
+                <javacpp.platform.ios-x86>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.ios-x86>
+                <javacpp.platform.ios-x86_64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.ios-x86_64>
+                <javacpp.platform.linux-armhf>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.linux-armhf>
+                <javacpp.platform.linux-arm64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.linux-arm64>
+                <javacpp.platform.linux-ppc64le>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.linux-ppc64le>
+                <javacpp.platform.linux-x86>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.linux-x86>
+                <javacpp.platform.linux-x86_64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.linux-x86_64>
+                <javacpp.platform.macosx-x86_64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.macosx-x86_64>
+                <javacpp.platform.windows-x86>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.windows-x86>
+                <javacpp.platform.windows-x86_64>${os.name}-${os.arch}${javacpp.platform.extension}</javacpp.platform.windows-x86_64>
                 <dependency.classifier>${os.name}-${os.arch}${javacpp.platform.extension}</dependency.classifier>
                 <dependency.platform>${os.name}-${os.arch}</dependency.platform>
                 <dependency.platform2>${os.name}-${os.arch}</dependency.platform2>
             </properties>
         </profile>
 
+        <profile>
+            <id>javacpp.platform.custom-true</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.custom</name>
+                </property>
+            </activation>
+            <properties>
+                <javacpp.platform></javacpp.platform>
+                <javacpp.platform.android-arm></javacpp.platform.android-arm>
+                <javacpp.platform.android-arm64></javacpp.platform.android-arm64>
+                <javacpp.platform.android-x86></javacpp.platform.android-x86>
+                <javacpp.platform.android-x86_64></javacpp.platform.android-x86_64>
+                <javacpp.platform.ios-arm></javacpp.platform.ios-arm>
+                <javacpp.platform.ios-arm64></javacpp.platform.ios-arm64>
+                <javacpp.platform.ios-x86></javacpp.platform.ios-x86>
+                <javacpp.platform.ios-x86_64></javacpp.platform.ios-x86_64>
+                <javacpp.platform.linux-armhf></javacpp.platform.linux-armhf>
+                <javacpp.platform.linux-arm64></javacpp.platform.linux-arm64>
+                <javacpp.platform.linux-ppc64le></javacpp.platform.linux-ppc64le>
+                <javacpp.platform.linux-x86></javacpp.platform.linux-x86>
+                <javacpp.platform.linux-x86_64></javacpp.platform.linux-x86_64>
+                <javacpp.platform.macosx-x86_64></javacpp.platform.macosx-x86_64>
+                <javacpp.platform.windows-x86></javacpp.platform.windows-x86>
+                <javacpp.platform.windows-x86_64></javacpp.platform.windows-x86_64>
+                <dependency.classifier></dependency.classifier>
+                <dependency.platform></dependency.platform>
+                <dependency.platform2></dependency.platform2>
+            </properties>
+        </profile>
+
         <profile>
             <id>javacpp-platform-none</id>
             <activation>
@@ -487,7 +518,7 @@
         </profile>
 
         <!-- Profiles to modify the transitive dependencies when picked up from other pom.xml files, for example:
-                 mvn -Djavacpp.platform.none -Djavacpp.platform.linux-x86_64 -Djavacpp.platform.windows-x86_64 ... -->
+             mvn -Djavacpp.platform.custom -Djavacpp.platform.host -Djavacpp.platform.linux-x86_64 -Djavacpp.platform.windows-x86_64 ... -->
         <profile>
             <id>javacpp.platform.android-arm-true</id>
             <activation>
@@ -496,7 +527,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.android-arm>android-arm</javacpp.platform.android-arm>
+                <javacpp.platform.android-arm>android-arm${javacpp.platform.extension}</javacpp.platform.android-arm>
             </properties>
         </profile>
 
@@ -508,7 +539,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.android-arm64>android-arm64</javacpp.platform.android-arm64>
+                <javacpp.platform.android-arm64>android-arm64${javacpp.platform.extension}</javacpp.platform.android-arm64>
             </properties>
         </profile>
 
@@ -520,7 +551,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.android-x86>android-x86</javacpp.platform.android-x86>
+                <javacpp.platform.android-x86>android-x86${javacpp.platform.extension}</javacpp.platform.android-x86>
             </properties>
         </profile>
 
@@ -532,7 +563,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.android-x86_64>android-x86_64</javacpp.platform.android-x86_64>
+                <javacpp.platform.android-x86_64>android-x86_64${javacpp.platform.extension}</javacpp.platform.android-x86_64>
             </properties>
         </profile>
 
@@ -544,7 +575,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.ios-arm>ios-arm</javacpp.platform.ios-arm>
+                <javacpp.platform.ios-arm>ios-arm${javacpp.platform.extension}</javacpp.platform.ios-arm>
             </properties>
         </profile>
 
@@ -556,7 +587,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.ios-arm64>ios-arm64</javacpp.platform.ios-arm64>
+                <javacpp.platform.ios-arm64>ios-arm64${javacpp.platform.extension}</javacpp.platform.ios-arm64>
             </properties>
         </profile>
 
@@ -568,7 +599,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.ios-x86>ios-x86</javacpp.platform.ios-x86>
+                <javacpp.platform.ios-x86>ios-x86${javacpp.platform.extension}</javacpp.platform.ios-x86>
             </properties>
         </profile>
 
@@ -580,7 +611,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.ios-x86_64>ios-x86_64</javacpp.platform.ios-x86_64>
+                <javacpp.platform.ios-x86_64>ios-x86_64${javacpp.platform.extension}</javacpp.platform.ios-x86_64>
             </properties>
         </profile>
 
@@ -592,7 +623,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.linux-armhf>linux-armhf</javacpp.platform.linux-armhf>
+                <javacpp.platform.linux-armhf>linux-armhf${javacpp.platform.extension}</javacpp.platform.linux-armhf>
             </properties>
         </profile>
 
@@ -604,7 +635,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.linux-arm64>linux-arm64</javacpp.platform.linux-arm64>
+                <javacpp.platform.linux-arm64>linux-arm64${javacpp.platform.extension}</javacpp.platform.linux-arm64>
             </properties>
         </profile>
 
@@ -616,7 +647,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.linux-ppc64le>linux-ppc64le</javacpp.platform.linux-ppc64le>
+                <javacpp.platform.linux-ppc64le>linux-ppc64le${javacpp.platform.extension}</javacpp.platform.linux-ppc64le>
             </properties>
         </profile>
 
@@ -628,7 +659,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.linux-x86>linux-x86</javacpp.platform.linux-x86>
+                <javacpp.platform.linux-x86>linux-x86${javacpp.platform.extension}</javacpp.platform.linux-x86>
             </properties>
         </profile>
 
@@ -640,7 +671,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64>
+                <javacpp.platform.linux-x86_64>linux-x86_64${javacpp.platform.extension}</javacpp.platform.linux-x86_64>
             </properties>
         </profile>
 
@@ -652,7 +683,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.macosx-x86_64>macosx-x86_64</javacpp.platform.macosx-x86_64>
+                <javacpp.platform.macosx-x86_64>macosx-x86_64${javacpp.platform.extension}</javacpp.platform.macosx-x86_64>
             </properties>
         </profile>
 
@@ -664,7 +695,7 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.windows-x86>windows-x86</javacpp.platform.windows-x86>
+                <javacpp.platform.windows-x86>windows-x86${javacpp.platform.extension}</javacpp.platform.windows-x86>
             </properties>
         </profile>
 
@@ -676,7 +707,229 @@
                 </property>
             </activation>
             <properties>
-                <javacpp.platform.windows-x86_64>windows-x86_64</javacpp.platform.windows-x86_64>
+                <javacpp.platform.windows-x86_64>windows-x86_64${javacpp.platform.extension}</javacpp.platform.windows-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-arm</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>arm</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-armhf>linux-armhf${javacpp.platform.extension}</javacpp.platform.linux-armhf>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-armhf</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>armhf</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-armhf>linux-armhf${javacpp.platform.extension}</javacpp.platform.linux-armhf>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-aarch64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>aarch64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-arm64>linux-arm64${javacpp.platform.extension}</javacpp.platform.linux-arm64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-armv8</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>armv8</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-arm64>linux-arm64${javacpp.platform.extension}</javacpp.platform.linux-arm64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-arm64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>arm64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-arm64>linux-arm64${javacpp.platform.extension}</javacpp.platform.linux-arm64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-ppc64le</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>ppc64le</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-ppc64le>linux-ppc64le${javacpp.platform.extension}</javacpp.platform.linux-ppc64le>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-amd64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>amd64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-x86_64>linux-x86_64${javacpp.platform.extension}</javacpp.platform.linux-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-x86-64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>x86-64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-x86_64>linux-x86_64${javacpp.platform.extension}</javacpp.platform.linux-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-linux-x86_64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>linux</name><arch>x86_64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.linux-x86_64>linux-x86_64${javacpp.platform.extension}</javacpp.platform.linux-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-macosx-amd64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>mac os x</name><arch>amd64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.macosx-x86_64>macosx-x86_64${javacpp.platform.extension}</javacpp.platform.macosx-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-macosx-x86-64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>mac os x</name><arch>x86-64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.macosx-x86_64>macosx-x86_64${javacpp.platform.extension}</javacpp.platform.macosx-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-macosx-x86_64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os>
+                    <name>mac os x</name><arch>x86_64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.macosx-x86_64>macosx-x86_64${javacpp.platform.extension}</javacpp.platform.macosx-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-windows-amd64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os><family>windows</family><arch>amd64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.windows-x86_64>windows-x86_64${javacpp.platform.extension}</javacpp.platform.windows-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-windows-x86-64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os><family>windows</family><arch>x86-64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.windows-x86_64>windows-x86_64${javacpp.platform.extension}</javacpp.platform.windows-x86_64>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>javacpp.platform.custom-windows-x86_64</id>
+            <activation>
+                <property>
+                    <name>javacpp.platform.host</name>
+                </property>
+                <os><family>windows</family><arch>x86_64</arch>
+                </os>
+            </activation>
+            <properties>
+                <javacpp.platform.windows-x86_64>windows-x86_64${javacpp.platform.extension}</javacpp.platform.windows-x86_64>
             </properties>
         </profile>
     </profiles>
diff --git a/pom.xml b/pom.xml
index 50ab7af14..d4bf988af 100644
--- a/pom.xml
+++ b/pom.xml
@@ -743,6 +743,7 @@
                 </os>
             </activation>
             <properties>
+                <os.kernel>linux</os.kernel>
                 <os.name>linux</os.name>
             </properties>
         </profile>
@@ -754,6 +755,7 @@
                 </os>
             </activation>
             <properties>
+                <os.kernel>darwin</os.kernel>
                 <os.name>macosx</os.name>
             </properties>
         </profile>
@@ -765,9 +767,43 @@
                 </os>
             </activation>
             <properties>
+                <os.kernel>windows</os.kernel>
                 <os.name>windows</os.name>
             </properties>
         </profile>
+        <profile>
+            <id>arm</id>
+            <activation>
+                <os>
+                    <arch>arm</arch>
+                </os>
+            </activation>
+            <properties>
+                <os.arch>armhf</os.arch>
+            </properties>
+        </profile>
+        <profile>
+            <id>aarch64</id>
+            <activation>
+                <os>
+                    <arch>aarch64</arch>
+                </os>
+            </activation>
+            <properties>
+                <os.arch>arm64</os.arch>
+            </properties>
+        </profile>
+        <profile>
+            <id>armv8</id>
+            <activation>
+                <os>
+                    <arch>armv8</arch>
+                </os>
+            </activation>
+            <properties>
+                <os.arch>arm64</os.arch>
+            </properties>
+        </profile>
         <profile>
             <id>i386</id>
             <activation>
@@ -845,17 +881,6 @@
                 <os.arch>x86_64</os.arch>
             </properties>
         </profile>
-        <profile>
-            <id>arm</id>
-            <activation>
-                <os>
-                    <arch>arm</arch>
-                </os>
-            </activation>
-            <properties>
-                <os.arch>arm</os.arch>
-            </properties>
-        </profile>
 
         <!-- Integration Tests Profile. By default (when this profile is not enabled) unit tests are run only.
              Note also that some tests may run fewer/quicker cases for unit tests vs. integration tests