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

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