<!--
 * 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.
-->
<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
	<!-- Assembly file for the "distributed" SystemML release for running on a cluster with Spark or Hadoop. -->
	<id>distrib</id>

	<formats>
		<format>tar.gz</format>
		<format>zip</format>
	</formats>

	<includeBaseDirectory>true</includeBaseDirectory>
	<baseDirectory>${artifactId}-${version}</baseDirectory>

	<fileSets>
		<fileSet>
			<directory>${basedir}/src/test/config</directory>
			<includes>
				<include>SystemML-config.xml</include>
			</includes>
			<outputDirectory>.</outputDirectory>
		</fileSet>

		<fileSet>
			<directory>${basedir}/scripts</directory>
			<excludes>
				<exclude>algorithms/obsolete/*</exclude>
				<exclude>algorithms/obsolete</exclude>
				<exclude>perftest/*</exclude>
				<exclude>perftest</exclude>
				<exclude>staging/**/*</exclude>
				<exclude>staging</exclude>
				<!-- <exclude>*.sh</exclude> --> <!-- applies to sparkDML.sh -->
			</excludes>
			<outputDirectory>scripts</outputDirectory>
		</fileSet>

		<fileSet>
			<directory>${basedir}/src/assembly/distrib</directory>
			<includes>
				<include>LICENSE</include>
				<include>NOTICE</include>
			</includes>
			<outputDirectory>.</outputDirectory>
		</fileSet>

		<fileSet>
			<directory>${basedir}</directory>
			<includes>
				<include>DISCLAIMER</include>
			</includes>
			<outputDirectory>.</outputDirectory>
		</fileSet>
	</fileSets>

	<files>
		<file>
			<source>target/${artifactId}-${project.version}.jar</source>
			<outputDirectory>.</outputDirectory>
			<destName>SystemML.jar</destName>
		</file>
	</files>
</assembly>
