<!--
  ~ 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/maven-4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.singa</groupId>
  <artifactId>junit-tests</artifactId>
  <packaging>jar</packaging>
  <version>1.1-SNAPSHOT</version>
  <name>junit-tests</name>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.5</version>
      <scope>compile</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
	<dependency>
	    <groupId>com.google.protobuf</groupId>
	    <artifactId>protobuf-java</artifactId>
	    <version>2.6.1</version>
	    <scope>compile</scope>
	</dependency>
  </dependencies>
  <profiles>
		<profile>
			<id>check-licence</id>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.rat</groupId>
						<artifactId>apache-rat-plugin</artifactId>
                        <version>0.13</version>
                        <configuration>
                        <excludes combine.children="append">
                            <exclude>rafiki/**</exclude>
                            <exclude>test/gtest/**</exclude>
                            <exclude>examples/onnx/bert/inputs.json</exclude>
                            <exclude>examples/onnx/test_onnx_backend.py</exclude>
                            <exclude>examples/onnx/gpt2/requirements.txt</exclude>
			    <exclude>examples/onnx/ro_bert_a/requirements.txt</exclude>
                            <exclude>include/singa/utils/tinydir.h</exclude>
                            <exclude>include/singa/utils/cuda_utils.h</exclude>
                            <exclude>src/core/tensor/distribution.cl</exclude>
                            <exclude>src/model/layer/im2col.cl</exclude>
                            <exclude>src/model/layer/pooling.cl</exclude>
                            <exclude>src/proto/caffe.proto</exclude>
                            <exclude>cmake/Thirdparty/FindViennaCL.cmake</exclude>
                            <exclude>cmake/Thirdparty/FindOpenCL.cmake</exclude>
                            <exclude>cmake/Thirdparty/GetGitRevisionDescription.cmake.in</exclude>
                            <exclude>cmake/Thirdparty/GetGitRevisionDescription.cmake</exclude>
                            <exclude>src/api/numpy.i</exclude>
                            <exclude>tool/cpplint.py</exclude>
                            <exclude>tool/docker/devel/centos6/cuda10/cuda.repo</exclude>
                            <exclude>travis*.log</exclude>
                            <exclude>.gitmodules</exclude>
                            <exclude>java/target/*</exclude>
                            <exclude>miniconda.sh</exclude>
                            <exclude>**/*.json</exclude>
                        </excludes>
                        <consoleOutput>True</consoleOutput>
                    </configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>
</project>
