<!--
  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">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.directory.server</groupId>
    <artifactId>apacheds-parent</artifactId>
    <version>2.0.0-M14</version>
  </parent>
  
  <artifactId>apacheds-installers</artifactId>
  <name>ApacheDS Installers</name>
  <packaging>pom</packaging>

  <description>Generates installers for ApacheDS</description>
  
  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>apacheds-service</artifactId>
    </dependency>  
    
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>apacheds-wrapper</artifactId>
    </dependency>
    
    <!--
      Forcing the scope of this dependency as 'provided' to avoid
      it being bundled in the final installers, as it is already 
      bundled in the 'apacheds-service' artifact.
    -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <profiles>
    <profile>
      <id>installers</id>
      <build>
        <plugins>
          <!-- Generating installers -->
          <plugin>
            <groupId>${project.groupId}</groupId>
            <artifactId>apacheds-installers-maven-plugin</artifactId>
            <configuration>
              
              <!-- Targets for Mac OS X .pkg installer packages -->
              <macOsXPkgTargets>
                <macOsXPkgTarget>
                 <id>apacheds-macosx-32bit</id>
                  <finalName>apacheds-${project.version}-32bit.dmg</finalName>
                  <osArch>x86</osArch>
                </macOsXPkgTarget>
                <macOsXPkgTarget>
                 <id>apacheds-macosx-64bit</id>
                  <finalName>apacheds-${project.version}-64bit.dmg</finalName>
                  <osArch>x86_64</osArch>
                </macOsXPkgTarget>
              </macOsXPkgTargets>
    
              <!-- Target for Windows installer package -->
              <nsisTargets>
                <nsisTarget>
                  <id>apacheds-win32</id>
                  <finalName>apacheds-${project.version}.exe</finalName>
                </nsisTarget>
              </nsisTargets>
    
              <!-- Targets for Archive installer -->
              <archiveTargets>
                <archiveTarget>
                  <id>apacheds-archive-zip</id>
                  <finalName>apacheds-${project.version}.zip</finalName>
                  <archiveType>zip</archiveType>
                </archiveTarget>
                <archiveTarget>
                  <id>apacheds-archive-tar.gz</id>
                  <finalName>apacheds-${project.version}.tar.gz</finalName>
                  <archiveType>tar.gz</archiveType>
                </archiveTarget>
              </archiveTargets>
              
              <!-- Targets for Linux .bin installer -->
              <binTargets>
                <binTarget>
                 <id>apacheds-bin-installer-32bit</id>
                  <finalName>apacheds-${project.version}-32bit.bin</finalName>
                  <osName>Linux</osName>
                  <osArch>x86</osArch>
                </binTarget>
                 <binTarget>
                 <id>apacheds-bin-installer-64bit</id>
                  <finalName>apacheds-${project.version}-64bit.bin</finalName>
                  <osName>Linux</osName>
                  <osArch>x86_64</osArch>
                </binTarget>
              </binTargets>
              
              <!-- Targets for Linux .deb installer package -->
              <debTargets>
                <debTarget>
                 <id>apacheds-debian-i386</id>
                  <finalName>apacheds-${project.version}-i386.deb</finalName>
                  <osName>Linux</osName>
                  <osArch>i386</osArch>
                </debTarget>
                <debTarget>
                 <id>apacheds-debian-amd64</id>
                  <finalName>apacheds-${project.version}-amd64.deb</finalName>
                  <osName>Linux</osName>
                  <osArch>amd64</osArch>
                </debTarget>
              </debTargets>
              
              <!-- Targets for Linux .rpm installer package -->
              <rpmTargets>
                <rpmTarget>
                  <id>apacheds-rpm-i386</id>
                  <finalName>apacheds-${project.version}-i386.rpm</finalName>
                  <osName>Linux</osName>
                  <osArch>i386</osArch>
                </rpmTarget>
                <rpmTarget>
                  <id>apacheds-rpm-x86_64</id>
                  <finalName>apacheds-${project.version}-x86_64.rpm</finalName>
                  <osName>Linux</osName>
                  <osArch>x86_64</osArch>
                </rpmTarget>
              </rpmTargets>
              
            </configuration>
            <executions>
              <execution>
                <goals>
                  <goal>generate</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
        <pluginManagement>
          <plugins>
            <plugin>
              <groupId>${project.groupId}</groupId>
              <artifactId>apacheds-installers-maven-plugin</artifactId>
              <version>${project.version}</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </profile>
  </profiles>
  
  <build>
    <plugins>
      <!-- Forcing the creation of Eclipse project files -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <!-- Workaround for http://jira.codehaus.org/browse/MECLIPSE-94 -->
          <eclipseProjectDir>.</eclipseProjectDir>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
</project>
