<!--
  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>1.5.8-SNAPSHOT</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>

  <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>

          <!-- Targets for Solaris .pkg installer package -->
          <!-- <solarisPkgTargets>
            <solarisPkgTarget>
              <id>apacheds-solaris-x86</id>
              <finalName>apacheds-${project.version}-solaris-x86.pkg</finalName>
              <osName>solaris</osName>
              <osArch>x86</osArch>
            </solarisPkgTarget>
            <solarisPkgTarget>
              <id>apacheds-solaris-sparc</id>
              <finalName>apacheds-${project.version}-solaris-sparc.pkg</finalName>
              <osName>solaris</osName>
              <osArch>sparc</osArch>
            </solarisPkgTarget>
          </solarisPkgTargets> -->
          
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <!-- 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>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>${project.groupId}</groupId>
          <artifactId>apacheds-installers-maven-plugin</artifactId>
          <version>${project.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  
</project>
