<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright 2014 The Netty Project
  ~
  ~ The Netty Project 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>io.netty</groupId>
    <artifactId>netty-parent</artifactId>
    <version>4.0.18.Final</version>
  </parent>
  <artifactId>netty-tcnative-parent</artifactId>
  <version>2.0.14.Final</version>
  <packaging>pom</packaging>

  <name>Netty/TomcatNative [Parent]</name>
  <url>https://github.com/netty/netty-tcnative/</url>
  <description>
    A Mavenized fork of Tomcat Native which incorporates various patches
  </description>

  <scm>
    <url>https://github.com/netty/netty-tcnative</url>
    <connection>scm:git:git://github.com/netty/netty-tcnative.git</connection>
    <developerConnection>scm:git:ssh://git@github.com/netty/netty-tcnative.git</developerConnection>
    <tag>netty-tcnative-parent-2.0.14.Final</tag>
  </scm>

  <properties>
    <checkstyle.skip>true</checkstyle.skip>
    <animal.sniffer.skip>true</animal.sniffer.skip>
    <forceAutogen>false</forceAutogen>
    <forceConfigure>false</forceConfigure>
    <opensslDynamicDir>../openssl-dynamic</opensslDynamicDir>
    <vsStaticTemplateFile>../vs2010.vcxproj.static.template</vsStaticTemplateFile>
    <defaultJarFile>${project.build.directory}/${project.build.finalName}.jar</defaultJarFile>
    <nativeJarFile>${project.build.directory}/${project.build.finalName}-${os.detected.classifier}.jar</nativeJarFile>
    <nativeLibOnlyDir>${project.build.directory}/native-lib-only</nativeLibOnlyDir>
    <nativeJarWorkdir>${project.build.directory}/native-jar-work</nativeJarWorkdir>
    <aprVersion>1.6.3</aprVersion>
    <aprMd5>57c6cc26a31fe420c546ad2234f22db4</aprMd5>
    <boringsslBranch>chromium-stable</boringsslBranch>
    <libresslVersion>2.7.4</libresslVersion>
    <!--
        NB: libressl does not currently publish sha256 signatures and instead relies on signify
        to verify releases. The project does not have a securely published GPG key.

        Verifying a libressl release:
        - Download the new version and the SHA256.sig from http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/
        - Grab the signify public key from https://www.openbsd.org/libressl/signing.html if you
          don't already have it
        - Verify the release: signify -V -x SHA256.sig  -p libressl.pub -m libressl-{libresslVersion}.tar.gz -e
        - Record the sha256: sha1sum -a 256 libressl-{libresslVersion}.tar.gz (shasum on osx)
    -->
    <libresslSha256>1e3a9fada06c1c060011470ad0ff960de28f9a0515277d7336f7e09362517da6</libresslSha256>
    <opensslMinorVersion>1.1.0</opensslMinorVersion>
    <opensslPatchVersion>i</opensslPatchVersion>
    <opensslVersion>${opensslMinorVersion}${opensslPatchVersion}</opensslVersion>
    <opensslSha256>50a98e07b1a89eb8f6a99477f262df71c6fa7bef77df4dc83025a2845c827d00</opensslSha256>
    <aprHome>${project.build.directory}/apr</aprHome>
    <aprBuildDir>${project.build.directory}/apr-${aprVersion}</aprBuildDir>
    <archBits>64</archBits>
    <linkStatic>false</linkStatic>
    <sslHome>${project.build.directory}/ssl</sslHome>
    <msvcSslIncludeDirs>${sslHome}/include</msvcSslIncludeDirs>
    <msvcSslLibDirs>${sslHome}/lib</msvcSslLibDirs>
    <msvcSslLibs>libssl.lib;libcrypto.lib</msvcSslLibs>
    <strip.skip>false</strip.skip>
  </properties>

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>

    <extensions>
      <!-- Generate os.detected.classifier property -->
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.4.0.Final</version>
      </extension>
    </extensions>

    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.fusesource.hawtjni</groupId>
          <artifactId>maven-hawtjni-plugin</artifactId>
          <version>1.11</version>
        </plugin>
        <plugin>
          <artifactId>maven-scm-plugin</artifactId>
          <version>1.9.4</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>buildnumber-maven-plugin</artifactId>
          <version>1.4</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.10</version>
        </plugin>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <dependencies>
            <dependency>
              <groupId>org.apache.ant</groupId>
              <artifactId>ant</artifactId>
              <version>1.9.6</version>
            </dependency>
            <dependency>
              <groupId>org.apache.ant</groupId>
              <artifactId>ant-commons-net</artifactId>
              <version>1.9.6</version>
            </dependency>
            <dependency>
              <groupId>ant-contrib</groupId>
              <artifactId>ant-contrib</artifactId>
              <version>1.0b3</version>
            </dependency>
          </dependencies>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <!-- Recent tcnative requires JDK 1.7 to build -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <!-- Generate the source for a statically-linked modules by copying from the template -->
          <execution>
            <id>copy-src</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <target if="${linkStatic}">
                <!-- Copy all of the code from the dynamic module -->
                <delete dir="src" quiet="true" />
                <mkdir dir="src" />
                <copy todir="${basedir}/src" verbose="true">
                  <fileset dir="${opensslDynamicDir}/src" />
                </copy>

                <!-- Convert the paths to windows format -->
                <pathconvert property="aprHomeWindowsPath" targetos="windows">
                  <path location="${aprHome}" />
                </pathconvert>
                <pathconvert property="sslIncludeDirsWindowsPath" targetos="windows">
                  <path location="${msvcSslIncludeDirs}" />
                </pathconvert>
                <pathconvert property="sslLibDirsWindowsPath" targetos="windows">
                  <path location="${msvcSslLibDirs}" />
                </pathconvert>
                <property name="aprIncludeDir" value="${aprHomeWindowsPath}\include" />
                <property name="aprLibDir" value="${aprHomeWindowsPath}\lib" />

                <echo message="Setting APR_INCLUDE_DIR=${aprIncludeDir}" />
                <echo message="Setting APR_LIB_DIR=${aprLibDir}" />
                <echo message="Setting SSL_INCLUDE_DIRS=${sslIncludeDirsWindowsPath}" />
                <echo message="Setting SSL_LIB_DIRS=${sslLibDirsWindowsPath}" />
                <echo message="Setting SSL_LIBS=${msvcSslLibs}" />

                <!-- Copy and filter the template MSVC project -->
                <filter token="APR_INCLUDE_DIR" value="${aprIncludeDir}" />
                <filter token="APR_LIB_DIR" value="${aprLibDir}" />
                <filter token="SSL_INCLUDE_DIRS" value="${sslIncludeDirsWindowsPath}" />
                <filter token="SSL_LIB_DIR" value="${sslLibDirsWindowsPath}" />
                <filter token="SSL_LIBS" value="${msvcSslLibs}" />
                <copy file="${vsStaticTemplateFile}" tofile="src/main/native-package/vs2010.vcxproj" filtering="true" overwrite="true" verbose="true" />
              </target>
            </configuration>
          </execution>

          <!-- Generate bnd bundle manifest. -->
          <execution>
            <id>native-manifest</id>
            <phase>initialize</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <exportAntProperties>true</exportAntProperties>
              <target>
                <condition property="tcnative.snippet" value="libnetty_tcnative.so;osname=linux">
                  <equals arg1="${os.detected.name}" arg2="linux" />
                </condition>
                <!-- In OSGi specification, the alias of Windows family is win32, case insensitive -->
                <condition property="tcnative.snippet" value="netty_tcnative.dll;osname=win32">
                  <equals arg1="${os.detected.name}" arg2="windows" />
                </condition>
                <!-- In OSGi specification, the alias of OSX family is macos or macosx, case insensitive -->
                <condition property="tcnative.snippet" value="libnetty_tcnative.jnilib;osname=macosx;">
                  <equals arg1="${os.detected.name}" arg2="osx" />
                </condition>
                <property name="tcnativeManifest" value="META-INF/native/${tcnative.snippet};processor=${os.detected.arch}" />
                <echo message="Bundle-NativeCode: ${tcnativeManifest}" />
              </target>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <!-- This artifact exports the classes whose names are different from the artifactId. -->
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <executions>
          <execution>
            <id>generate-manifest</id>
            <phase>process-classes</phase>
            <goals>
              <goal>manifest</goal>
            </goals>
            <configuration>
              <supportedProjectTypes>
                <supportedProjectType>jar</supportedProjectType>
              </supportedProjectTypes>
              <instructions>
                <Export-Package>io.netty.internal.tcnative.*</Export-Package>
                <Bundle-NativeCode>${tcnativeManifest}</Bundle-NativeCode>
              </instructions>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <!-- Override the parent POM's configuration -->
      <plugin>
        <artifactId>maven-release-plugin</artifactId>
        <configuration>
          <!-- Specifying a profile here will disable the all profile, since it's activeByDefault -->
          <arguments>-Prestricted-release,sonatype-oss-release -DmoduleSelector=none</arguments>
          <tagNameFormat>@{project.artifactId}-@{project.version}</tagNameFormat>
          <autoVersionSubmodules>true</autoVersionSubmodules>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-enforcer-plugin</artifactId>
        <executions>
          <execution>
            <id>enforce-tools</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireMavenVersion>
                  <version>[3.1.1,)</version>
                </requireMavenVersion>
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>disable-autogen-windows</id>
      <activation>
        <os>
          <family>windows</family>
        </os>
      </activation>
    </profile>

    <!-- Build the static APR library -->
    <profile>
      <id>build-apr-windows</id>
      <activation>
        <os>
          <family>windows</family>
        </os>
      </activation>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <id>build-apr</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>run</goal>
                </goals>
                <configuration>
                  <target name="build-apr" if="${linkStatic}">
                    <property name="aprArchiveFile" value="apr-${aprVersion}-win32-src.zip" />
                    <get src="http://archive.apache.org/dist/apr/${aprArchiveFile}" dest="${project.build.directory}/${aprArchiveFile}" verbose="on" />
                    <unzip src="${project.build.directory}/${aprArchiveFile}" dest="${project.build.directory}" />
                    <condition property="windowsRelease" value="Win32 Release" else="x64 Release">
                      <equals arg1="${archBits}" arg2="32" />
                    </condition>
                    <echo message="archBits=${archBits}. Using windowsRelease=${windowsRelease}" />
                    <!-- On Windows, force building APR with /MT for static linking -->
                    <replace dir="${aprBuildDir}" token="/MD" value="/MT">
                      <include name="*.mak" />
                    </replace>
                    <retry retrycount="3">
                      <exec executable="nmake" failonerror="true" dir="${aprBuildDir}" resolveexecutable="true">
                        <arg line="/f Makefile.win ARCH=&quot;${windowsRelease}&quot; PREFIX=..\apr buildall install" />
                      </exec>
                    </retry>
                    <copy todir="${aprHome}/include">
                      <fileset dir="${aprBuildDir}/include/arch/win32" includes="*.h" />
                    </copy>
                    <copy todir="${aprHome}">
                      <fileset dir="${aprBuildDir}/include/arch" includes="*.h" />
                    </copy>
                  </target>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>build-apr-linux-mac</id>
      <activation>
        <os>
          <family>!windows</family>
        </os>
      </activation>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <id>build-apr-linux-mac</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>run</goal>
                </goals>
                <configuration>
                  <target if="${linkStatic}">
                    <property name="aprTarGzFile" value="apr-${aprVersion}.tar.gz" />
                    <property name="aprTarFile" value="apr-${aprVersion}.tar" />
                    <get src="http://archive.apache.org/dist/apr/${aprTarGzFile}" dest="${project.build.directory}/${aprTarGzFile}" verbose="on" />
                    <checksum file="${project.build.directory}/${aprTarGzFile}" algorithm="MD5" property="${aprMd5}" verifyProperty="isEqual" />
                    <gunzip src="${project.build.directory}/${aprTarGzFile}" dest="${project.build.directory}" />
                    <!-- Use the tar command (rather than the untar ant task) in order to preserve file permissions. -->
                    <exec executable="tar" failonerror="true" dir="${project.build.directory}/" resolveexecutable="true">
                      <arg line="xfvz ${aprTarGzFile}" />
                    </exec>
                    <mkdir dir="${aprHome}" />
                    <exec executable="configure" failonerror="true" dir="${aprBuildDir}" resolveexecutable="true">
                      <arg line="--disable-shared --prefix=${aprHome} CFLAGS='-O3 -fno-omit-frame-pointer -fPIC'" />
                    </exec>
                    <exec executable="make" failonerror="true" dir="${aprBuildDir}" resolveexecutable="true" />
                    <exec executable="make" failonerror="true" dir="${aprBuildDir}" resolveexecutable="true">
                      <arg line="install" />
                    </exec>
                  </target>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>

    <!--
      netty-tcnative must be released from RHEL 6.6 x86_64 or compatible so that:

      1) we ship x86_64 version of epoll transport officially, and
      2) we ensure the ABI compatibility with older GLIBC versions.

         The shared library built on a distribution with newer GLIBC
         will not run on older distributions.
    -->
    <profile>
      <id>restricted-release</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-enforcer-plugin</artifactId>
            <executions>
              <execution>
                <id>enforce-release-environment</id>
                <goals>
                  <goal>enforce</goal>
                </goals>
                <configuration>
                  <rules>
                    <requireProperty>
                      <regexMessage>
                        Release process must be performed on linux-x86_64.
                      </regexMessage>
                      <property>os.detected.classifier</property>
                      <regex>^linux-x86_64$</regex>
                    </requireProperty>
                    <requireFilesContent>
                      <message>
                        Release process must be performed on RHEL 6.8 or its derivatives.
                      </message>
                      <files>
                        <file>/etc/redhat-release</file>
                      </files>
                      <content>release 6.9</content>
                    </requireFilesContent>
                  </rules>
                </configuration>
              </execution>
            </executions>
            <dependencies>
              <!-- Provides the 'requireFilesContent' enforcer rule. -->
              <dependency>
                <groupId>com.ceilfors.maven.plugin</groupId>
                <artifactId>enforcer-rules</artifactId>
                <version>1.1.0</version>
              </dependency>
            </dependencies>
          </plugin>
        </plugins>
      </build>
      <modules>
        <!-- When doing a release we only want to deploy dynamic openssl version and the static boring one. -->
        <module>openssl-dynamic</module>
        <module>boringssl-static</module>
      </modules>
    </profile>

    <!--
      Profile for building all modules. This is enabled by default so if any profile is manually specified,
      this will be disabled automatically.
    -->
    <profile>
      <id>all</id>
      <activation>
        <property>
          <name>!moduleSelector</name>
        </property>
      </activation>
      <modules>
        <module>openssl-dynamic</module>
        <module>openssl-static</module>
        <module>boringssl-static</module>
        <module>libressl-static</module>
      </modules>
    </profile>
  </profiles>
</project>
