<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.openhitls</groupId>
    <artifactId>hitls4j</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.13.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies> 
    
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <openhitls.root></openhitls.root>
        <openhitls.lib.dir>${openhitls.root}/build</openhitls.lib.dir>
        <openhitls.include.dir>${openhitls.root}/include</openhitls.include.dir>
        <openhitls.build.include.dir>${openhitls.root}/build/include</openhitls.build.include.dir>
        <jni.java.home>${java.home}</jni.java.home>
    </properties>

    <profiles>
        <profile>
            <id>openhitls-root-from-env</id>
            <activation>
                <property>
                    <name>env.OPENHITLS_ROOT</name>
                </property>
            </activation>
            <properties>
                <openhitls.root>${env.OPENHITLS_ROOT}</openhitls.root>
            </properties>
        </profile>
    </profiles>

<build>
    <plugins>
        <!-- Compile and link JNI library -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>compile-jni</id>
                    <phase>compile</phase>
                    <configuration>
                        <target>
                            <fail message="未设置 OPENHITLS_ROOT 或 -Dopenhitls.root。请设置 OPENHITLS_ROOT=/path/to/openhitls 或传入 -Dopenhitls.root=/path/to/openhitls。">
                                <condition>
                                    <equals arg1="${openhitls.root}" arg2=""/>
                                </condition>
                            </fail>
                            <fail message="OPENHITLS_ROOT or -Dopenhitls.root must point to a valid OpenHiTLS root, not '${openhitls.root}'.">
                                <condition>
                                    <or>
                                        <equals arg1="${openhitls.root}" arg2=""/>
                                        <equals arg1="${openhitls.root}" arg2="/"/>
                                        <not>
                                            <available file="${openhitls.root}" type="dir"/>
                                        </not>
                                        <not>
                                            <available file="${openhitls.include.dir}" type="dir"/>
                                        </not>
                                        <not>
                                            <available file="${openhitls.include.dir}/bsl" type="dir"/>
                                        </not>
                                        <not>
                                            <available file="${openhitls.include.dir}/crypto" type="dir"/>
                                        </not>
                                        <not>
                                            <available file="${openhitls.lib.dir}" type="dir"/>
                                        </not>
                                    </or>
                                </condition>
                            </fail>
                            <fail message="OpenHiTLS build output '${openhitls.lib.dir}' must contain libhitls_bsl.so, libhitls_crypto.so, libhitls_pki.so, and libhitls_tls.so.">
                                <condition>
                                    <or>
                                        <not>
                                            <available file="${openhitls.lib.dir}/libhitls_bsl.so" type="file"/>
                                        </not>
                                        <not>
                                            <available file="${openhitls.lib.dir}/libhitls_crypto.so" type="file"/>
                                        </not>
                                        <not>
                                            <available file="${openhitls.lib.dir}/libhitls_pki.so" type="file"/>
                                        </not>
                                        <not>
                                            <available file="${openhitls.lib.dir}/libhitls_tls.so" type="file"/>
                                        </not>
                                    </or>
                                </condition>
                            </fail>
                            <mkdir dir="${project.build.directory}/native"/>
                            <!-- Copy required native libraries from openhitls build directory -->
                            <copy todir="${project.build.directory}/native" flatten="true">
                                <fileset dir="${openhitls.lib.dir}" includes="libhitls_*.so"/>
                            </copy>
                            <condition property="jni.platform.include" value="darwin">
                                <os family="mac"/>
                            </condition>
                            <condition property="jni.platform.include" value="win32">
                                <os family="windows"/>
                            </condition>
                            <condition property="jni.platform.include" value="linux">
                                <os family="unix"/>
                            </condition>
                            <condition property="resolved.jni.java.home" value="${jni.java.home}">
                                <available file="${jni.java.home}/include/jni.h" type="file"/>
                            </condition>
                            <condition property="resolved.jni.java.home" value="${jni.java.home}/..">
                                <and>
                                    <not>
                                        <isset property="resolved.jni.java.home"/>
                                    </not>
                                    <available file="${jni.java.home}/../include/jni.h" type="file"/>
                                </and>
                            </condition>
                            <condition property="resolved.jni.java.home" value="${env.JAVA_HOME}">
                                <and>
                                    <not>
                                        <isset property="resolved.jni.java.home"/>
                                    </not>
                                    <isset property="env.JAVA_HOME"/>
                                    <available file="${env.JAVA_HOME}/include/jni.h" type="file"/>
                                </and>
                            </condition>
                            <fail message="JNI headers not found. Set JAVA_HOME to a JDK root or pass -Djni.java.home=/path/to/jdk. Checked jni.java.home='${jni.java.home}', jni.java.home/.., and JAVA_HOME='${env.JAVA_HOME}'.">
                                <condition>
                                    <not>
                                        <isset property="resolved.jni.java.home"/>
                                    </not>
                                </condition>
                            </fail>
                            <fail message="JNI platform header jni_md.h not found under '${resolved.jni.java.home}/include/${jni.platform.include}'. Set -Djni.java.home=/path/to/jdk or check this OS mapping.">
                                <condition>
                                    <not>
                                        <available file="${resolved.jni.java.home}/include/${jni.platform.include}/jni_md.h" type="file"/>
                                    </not>
                                </condition>
                            </fail>
                            <echo level="info" message="Using JNI headers from ${resolved.jni.java.home}/include and ${resolved.jni.java.home}/include/${jni.platform.include}"/>
                            <!-- Compile JNI code -->
                            <exec executable="gcc" failonerror="true">
                                <arg value="-c"/>
                                <arg value="-fPIC"/>
                                <arg value="-Wall"/>
                                <arg value="-Werror"/>
                                <arg value="-I${resolved.jni.java.home}/include"/>
                                <arg value="-I${resolved.jni.java.home}/include/${jni.platform.include}"/>
                                <arg value="-I${basedir}/src/main/native"/>
                                <arg value="-I${openhitls.include.dir}"/>
                                <arg value="-I${openhitls.include.dir}/bsl"/>
                                <arg value="-I${openhitls.include.dir}/crypto"/>
                                <arg value="-I${openhitls.build.include.dir}"/>
                                <arg value="${basedir}/src/main/native/crypto_native_jni.c"/>
                                <arg value="-o"/>
                                <arg value="${project.build.directory}/native/crypto_native_jni.o"/>
                            </exec>
                            <!-- Link with dynamic OpenHiTLS libraries -->
                            <exec executable="gcc" failonerror="true">
                                <arg value="-shared"/>
                                <arg value="-o"/>
                                <arg value="${project.build.directory}/native/libhitls_crypto_jni.so"/>
                                <arg value="${project.build.directory}/native/crypto_native_jni.o"/>
                                <arg value="-L${project.build.directory}/native"/>
                                <arg value="-lhitls_crypto"/>
                                <arg value="-lhitls_bsl"/>
                                <arg value="-Wl,-z,noexecstack"/>
                                <arg value="-Wl,-rpath,$ORIGIN"/>
                            </exec>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <!-- Package JNI library into JAR -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <id>copy-native-libs</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.outputDirectory}/META-INF/native</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${project.build.directory}/native</directory>
                                <includes>
                                    <include>*.so</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <systemPropertyVariables>
                    <openhitls.root>${openhitls.root}</openhitls.root>
                    <openhitls.native.path>${project.build.directory}/native</openhitls.native.path>
                </systemPropertyVariables>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>