<?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">
    <parent>
        <artifactId>gmssl</artifactId>
        <groupId>org.openeuler</groupId>
        <version>2.0.4</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sdfprovider</artifactId>
    <version>2.0.4</version>
    <name>sdfprovider</name>
    
    <properties>
        <native.compiler.startOptions>
            -g
            -fPIC
            -fsigned-char
            -fno-aggressive-loop-optimizations
            -Wno-unused-parameter
            -fno-gnu-unique
            -fstack-protector-all
            -I ${env.JAVA_HOME}/include/linux/
            -I ${env.JAVA_HOME}/include/
            -I ${basedir}/src/main/native
            -I ${project.build.directory}/include
        </native.compiler.startOptions>
        <native.link.startOptions>-shared</native.link.startOptions>
        <native.link.library>-lcrypto_card_sdk</native.link.library>
        <compiler.executable.x86_64>${SDF_EXECUTABLE_X86_64}</compiler.executable.x86_64>
        <compiler.executable.aarch64>${SDF_EXECUTABLE_AARCH64}</compiler.executable.aarch64>
        <compiler.library_path.x86_64>${SDF_LIBRARY_PATH_X86_64}</compiler.library_path.x86_64>
        <compiler.library_path.aarch64>${SDF_LIBRARY_PATH_AARCH64}</compiler.library_path.aarch64>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openeuler</groupId>
            <artifactId>commons</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.openeuler</groupId>
            <artifactId>jca</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.openeuler</groupId>
            <artifactId>jsse</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--
      // compile
      export LIBRARY_PATH=/home/user/workspace/GM0018-20240204/SDK/Linux/aarch64
      // run
      export LD_LIBRARY_PATH=/home/user/workspace/GM0018-20240204/SDK/Linux/aarch64
    -->
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArgs>
                        <arg>-h</arg>
                        <arg>${project.build.directory}/include</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>native-maven-plugin</artifactId>
                <executions>
                    <!-- x86_64 -->
                    <execution>
                        <id>compile_linux_x86_64</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <compilerExecutable>${compiler.executable.x86_64}</compilerExecutable>
                            <compilerStartOptions>
                                <compilerStartOption>${native.compiler.startOptions}</compilerStartOption>
                            </compilerStartOptions>
                            <sources>
                                <source>
                                    <directory>${basedir}/src/main/native</directory>
                                    <includes>
                                        <include>sdf_util.c</include>
                                        <include>sdf_exception.c</include>
                                        <include>sdf_log.c</include>
                                        <include>sdf_sdk.c</include>
                                        <include>sdf_random.c</include>
                                        <include>sdf_digest.c</include>
                                        <include>sdf_hmac.c</include>
                                        <include>sdf_keygenerator.c</include>
                                        <include>sdf_internal.c</include>
                                        <include>sdf_pbkdf2.c</include>
                                        <include>sdf_cipher_symmetric.c</include>
                                        <include>sdf_keypairgenerator_sm2.c</include>
                                        <include>sdf_signature_sm2.c</include>
                                        <include>sdf_cipher_sm2.c</include>
                                        <include>sdf_keyagreement_sm2.c</include>
                                        <include>sdf_keyagreement_ecc.c</include>
                                        <include>sdf_prf.c</include>
                                        <include>sdf_keypairgenerator_sm9.c</include>
                                        <include>sdf_cipher_sm9.c</include>
                                        <include>sdf_signature_sm9.c</include>
                                    </includes>
                                </source>
                            </sources>
                            <compilerOutputDirectory>
                                ${project.build.directory}/objs/linux_x86_64
                            </compilerOutputDirectory>
                        </configuration>
                    </execution>
                    <execution>
                        <id>link_linux_x86_64</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>link</goal>
                        </goals>
                        <configuration>
                            <linkerExecutable>${compiler.executable.x86_64}</linkerExecutable>
                            <linkerStartOptions>
                                <linkerStartOptions>${native.link.startOptions}</linkerStartOptions>
                            </linkerStartOptions>
                            <linkerEndOptions>
                                <linkerEndOption>-L${compiler.library_path.x86_64}</linkerEndOption>
                                <linkerEndOption>${native.link.library}</linkerEndOption>
                            </linkerEndOptions>
                            <linkerFinalName>libsdfcrypto_linux_x86_64</linkerFinalName>
                            <linkerFinalNameExt>so</linkerFinalNameExt>
                            <linkerOutputDirectory>${project.build.directory}</linkerOutputDirectory>
                            <attach>false</attach>
                        </configuration>
                    </execution>

                    <!-- aarch64 -->
                    <execution>
                        <id>compile_linux_aarch64</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <compilerExecutable>${compiler.executable.aarch64}</compilerExecutable>
                            <compilerStartOptions>
                                <compilerStartOption>${native.compiler.startOptions}</compilerStartOption>
                            </compilerStartOptions>
                            <sources>
                                <source>
                                    <directory>${basedir}/src/main/native</directory>
                                    <includes>
                                        <include>sdf_util.c</include>
                                        <include>sdf_exception.c</include>
                                        <include>sdf_log.c</include>
                                        <include>sdf_sdk.c</include>
                                        <include>sdf_random.c</include>
                                        <include>sdf_digest.c</include>
                                        <include>sdf_hmac.c</include>
                                        <include>sdf_keygenerator.c</include>
                                        <include>sdf_internal.c</include>
                                        <include>sdf_pbkdf2.c</include>
                                        <include>sdf_cipher_symmetric.c</include>
                                        <include>sdf_keypairgenerator_sm2.c</include>
                                        <include>sdf_signature_sm2.c</include>
                                        <include>sdf_cipher_sm2.c</include>
                                        <include>sdf_keyagreement_sm2.c</include>
                                        <include>sdf_keyagreement_ecc.c</include>
                                        <include>sdf_prf.c</include>
                                        <include>sdf_keypairgenerator_sm9.c</include>
                                        <include>sdf_cipher_sm9.c</include>
                                        <include>sdf_signature_sm9.c</include>
                                    </includes>
                                </source>
                            </sources>
                            <compilerOutputDirectory>
                                ${project.build.directory}/objs/linux_aarch64
                            </compilerOutputDirectory>
                        </configuration>
                    </execution>
                    <execution>
                        <id>link_linux_aarch64</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>link</goal>
                        </goals>
                        <configuration>
                            <linkerExecutable>${compiler.executable.aarch64}</linkerExecutable>
                            <linkerStartOptions>
                                <linkerStartOptions>${native.link.startOptions}</linkerStartOptions>
                            </linkerStartOptions>
                            <linkerEndOptions>
                                <linkerEndOption>-L${compiler.library_path.aarch64}</linkerEndOption>
                                <linkerEndOption>${native.link.library}</linkerEndOption>
                            </linkerEndOptions>
                            <linkerFinalName>libsdfcrypto_linux_aarch64</linkerFinalName>
                            <linkerFinalNameExt>so</linkerFinalNameExt>
                            <linkerOutputDirectory>${project.build.directory}</linkerOutputDirectory>
                            <attach>false</attach>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/classes/META-INF/native</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${project.build.directory}</directory>
                                    <includes>
                                        <include>*.so</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- plugin for compile with sdk -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>prepare-environment</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <!-- interupt build when shell failed -->
                            <failOnError>true</failOnError>
                            <target>
                                <exec executable="sh" dir="${project.basedir}" failonerror="true">
                                    <arg value="${project.basedir}/build/pre-env.sh"/>
                                </exec>
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>target/antrun/env.properties</file>
                            </files>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>jdk9-plus</id>
            <activation>
                <jdk>[9,)</jdk>
            </activation>
            <properties>
                <jdk.module.options>
                    --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED
                    --add-exports=java.base/jdk.internal.access=ALL-UNNAMED
                    --add-exports=java.base/sun.security.util=ALL-UNNAMED
                    --add-exports=java.base/sun.security.x509=ALL-UNNAMED
                    --add-exports=java.base/sun.security.action=ALL-UNNAMED
                    --add-exports=java.base/sun.security.provider=ALL-UNNAMED
                    --add-exports=java.base/sun.security.provider.certpath=ALL-UNNAMED
                    --add-exports=java.base/sun.net.util=ALL-UNNAMED
                    --add-opens=java.base/sun.security.util=ALL-UNNAMED
                    --add-exports=java.base/sun.security.pkcs=ALL-UNNAMED
                    --add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED
                    --add-opens=java.base/sun.security.ssl=ALL-UNNAMED
                    --add-opens=java.base/javax.crypto=ALL-UNNAMED
                    --add-opens=java.base/sun.security.x509=ALL-UNNAMED
                    --add-opens=java.base/sun.security.pkcs12=ALL-UNNAMED
                    --add-exports=java.base/sun.security.jca=ALL-UNNAMED
                    --add-exports=jdk.crypto.cryptoki/sun.security.pkcs11.wrapper=ALL-UNNAMED
                    --add-exports=java.base/sun.security.rsa=ALL-UNNAMED
                </jdk.module.options>
            </properties>
        </profile>
    </profiles>
</project>