<!--
 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-v4_0_0.xsd">
    
    <parent>
      <groupId>org.apache.hama</groupId>
      <artifactId>hama-parent</artifactId>
      <version>0.6.3-SNAPSHOT</version>
    </parent>
    
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.apache.hama</groupId>
    <artifactId>hama-pipes</artifactId>
    <version>0.6.3-SNAPSHOT</version>
    <name>pipes</name>
    <description>Apache Hama Pipes</description>
    <packaging>pom</packaging>

    <profiles>
      <profile>
        <id>native</id>
        <activation>
          <activeByDefault>true</activeByDefault>
        </activation>
        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-antrun-plugin</artifactId>
              <executions>
                <execution>
                  <id>make</id>
                  <phase>compile</phase>
                  <goals><goal>run</goal></goals>
                  <configuration>
                    <target>
                      <mkdir dir="${project.build.directory}/native"/>
                      <exec executable="cmake" dir="${project.build.directory}/native"
                          failonerror="true">
                        <arg line="${basedir}/src/ -DJVM_ARCH_DATA_MODEL=${sun.arch.data.model}"/>
                      </exec>
                      <exec executable="make" dir="${project.build.directory}/native" failonerror="true">
                        <arg line="VERBOSE=1"/>
                      </exec>
                      <!-- The second make is a workaround for HADOOP-9215.  It can
                           be removed when version 2.6 of cmake is no longer supported . -->
                      <exec executable="make" dir="${project.build.directory}/native" failonerror="true"></exec>
                    </target>
                  </configuration>
                </execution>
                <!-- TODO wire here native testcases
                <execution>
                  <id>test</id>
                  <phase>test</phase>
                  <goals>
                    <goal>test</goal>
                  </goals>
                  <configuration>
                    <destDir>${project.build.directory}/native/target</destDir>
                  </configuration>
                </execution>
                -->
              </executions>
            </plugin>
          </plugins>
        </build>
      </profile>
    </profiles>
<!--
    <build>
      <plugins>
       <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <executions>
            <execution>
              <id>compile</id>
              <phase>generate-sources</phase>
              <goals>
                <goal>run</goal>
              </goals>
              <configuration>
                <target>
                  <mkdir dir="${basedir}/../target/native"/>
                  <copy toDir="${basedir}/../target/native">
                    <fileset dir="${basedir}/src/main/native"/>
                  </copy>
                </target>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
-->
</project>
