<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.opennlp</groupId>
    <artifactId>opennlp-sandbox</artifactId>
    <version>2.3.4-SNAPSHOT</version>
  </parent>

  <artifactId>opennlp-dl</artifactId>
  <version>2.3.4-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>Apache OpenNLP DL4J</name>

  <properties>
    <nd4j.version>1.0.0-M2.1</nd4j.version>
    <nd4j.native.version>1.0.0-M2.1</nd4j.native.version>
    <javacpp.version>1.5.7</javacpp.version>
    <openblas.version>0.3.19-1.5.7</openblas.version>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.apache.opennlp</groupId>
        <artifactId>opennlp-tools</artifactId>
    </dependency>

    <dependency>
      <groupId>org.deeplearning4j</groupId>
      <artifactId>deeplearning4j-core</artifactId>
      <version>${nd4j.version}</version>
      <exclusions>
        <!-- Excluded to avoid irrelevant platforms dependencies, see profiles -->
        <exclusion>
          <groupId>org.bytedeco</groupId>
          <artifactId>openblas-platform</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.bytedeco</groupId>
          <artifactId>hdf5-platform</artifactId>
        </exclusion>
        <!-- Not required for NLP applications -->
        <exclusion>
          <groupId>org.datavec</groupId>
          <artifactId>datavec-data-image</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.deeplearning4j</groupId>
      <artifactId>deeplearning4j-nlp</artifactId>
      <version>${nd4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.nd4j</groupId>
      <artifactId>nd4j-native-api</artifactId>
      <version>${nd4j.native.version}</version>
    </dependency>
    <dependency>
      <groupId>org.nd4j</groupId>
      <artifactId>nd4j-native</artifactId>
      <version>${nd4j.native.version}</version>
    </dependency>
    <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>openblas</artifactId>
      <version>${openblas.version}</version>
    </dependency>
    <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>javacpp</artifactId>
      <version>${javacpp.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.36</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>args4j</groupId>
      <artifactId>args4j</artifactId>
      <version>2.33</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
    </dependency>
  </dependencies>

  <profiles>
    <profile>
      <id>platform-win-x64</id>
      <activation>
        <os>
          <family>Windows</family>
          <arch>x64</arch>
        </os>
      </activation>
      <dependencies>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>javacpp</artifactId>
          <version>${javacpp.version}</version>
          <classifier>windows-x86_64</classifier>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>openblas</artifactId>
          <version>${openblas.version}</version>
          <classifier>windows-x86_64</classifier>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>platform-win-x86</id>
      <activation>
        <os>
          <family>Windows</family>
          <arch>x86</arch>
        </os>
      </activation>
      <dependencies>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>javacpp</artifactId>
          <version>${javacpp.version}</version>
          <classifier>windows-x86</classifier>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>openblas</artifactId>
          <version>${openblas.version}</version>
          <classifier>windows-x86</classifier>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>platform-linux-x64</id>
      <activation>
        <os>
          <family>unix</family>
          <name>Linux</name>
          <arch>amd64</arch>
        </os>
      </activation>
      <dependencies>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>javacpp</artifactId>
          <version>${javacpp.version}</version>
          <classifier>linux-x86_64</classifier>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>openblas</artifactId>
          <version>${openblas.version}</version>
          <classifier>linux-x86_64</classifier>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>platform-macosx-x64</id>
      <activation>
        <os>
          <family>Mac</family>
          <arch>x64</arch>
        </os>
      </activation>
      <dependencies>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>javacpp</artifactId>
          <version>${javacpp.version}</version>
          <classifier>macosx-x86_64</classifier>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>openblas</artifactId>
          <version>${openblas.version}</version>
          <classifier>macosx-x86_64</classifier>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>platform-macosx-aarch64</id>
      <activation>
        <os>
          <family>mac</family>
          <arch>aarch64</arch>
        </os>
      </activation>
      <dependencies>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>javacpp</artifactId>
          <version>${javacpp.version}</version>
          <classifier>macosx-arm64</classifier>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.bytedeco</groupId>
          <artifactId>openblas</artifactId>
          <version>${openblas.version}</version>
          <classifier>macosx-arm64</classifier>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>
  </profiles>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>${maven.compiler.source}</source>
          <target>${maven.compiler.target}</target>
          <encoding>UTF-8</encoding>
          <compilerArgument>-Xlint</compilerArgument>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>