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

    <!--
    Uses a "system installed"  BLAS/LAPACK.
    In reality, this means a BLAS/CBLAS in libblas.so
    and either LAPACK or the incompatible CLAPACK.
    We interface with CBLAS and LAPACKE, but can
    interface with BLAS/LAPACK directly in a pinch.
    -->

    <parent>
        <groupId>com.github.fommil.netlib</groupId>
        <artifactId>parent</artifactId>
        <version>1.1</version>
    </parent>

    <artifactId>native_system</artifactId>
    <packaging>pom</packaging>

    <modules>
        <module>java</module>
        <module>osx-x86_64</module>
        <module>win-i686</module>
        <module>win-x86_64</module>
        <!-- cross compiles are built separately on a Linux box... -->
    </modules>

    <properties>
        <natives>netlib-native_system</natives>
        <!-- GEES etc needs an ill-defined callback -->
        <lapacke.callback>([ds](gees|gges|geesx|ggesx))</lapacke.callback>
        <!-- LSAME, SECOND etc are more efficient on the JVM -->
        <jvm.better>lsame|lsamen|second|dsecnd</jvm.better>
        <!-- LAPACK routines that do not have a named ARPACKE equivalent -->
        <lapacke.unsupported>(ieeeck|ilaenv|ilaver|iparmq|([sd](gbtf2|gebd2|gbtf2|gebd2|gegs|gegv|gehd2|gelsx|geql2|gerq2|gesc2|getc2|gtts2|isnan|labad|labrd|lacn2|lacon|ladiv|lae2|laebz|laed0|laed1|laed2|laed3|laed4|laed5|laed6|laed7|laed8|laed9|laeda|laein|laev2|laexc|lag2|lags2|lagtf|lagtm|lagts|lagv2|lahqr|lahr2|lahrd|laic1|laisnan|laln2|lals0|lalsa|lalsd|lamc1|lamc2|lamc3|lamc4|lamc5|lamrg|laneg|langb|langt|lanhs|lansb|lansp|lanst|lantb|lantp|lanv2|lapll|lapmt|laqgb|laqge|laqp2|laqps|laqr0|laqr1|laqr2|laqr3|laqr4|laqr5|laqsb|laqsp|laqsy|laqtr|lar1v|lar2v|larf|largv|larra|larrb|larrc|larrd|larre|larrf|larrj|larrk|larrr|larrv|lartg|lartv|laruv|larz|larzb|larzt|las2|lascl|lasd0|lasd1|lasd2|lasd3|lasd4|lasd5|lasd6|lasd7|lasd8|lasda|lasdq|lasdt|lasq1|lasq2|lasq3|lasq4|lasq5|lasq6|lasr|lassq|lasv2|lasy2|lasyf|latbs|latdf|latps|latrd|latrs|latrz|latzm|lauu2|lazq3|lazq4|org2l|org2r|orgl2|orgr2|orm2l|orm2r|orml2|ormr2|ormr3|pbtf2|potf2|ptts2|rscl|sygs2|sytd2|sytf2|tgex2|tgsy2|trti2|tzrqf)))</lapacke.unsupported>
        <arpack.noprototypes>(dgetv0|dlaqrb|dmout|dnaitr|dnapps|dnaup2|dnconv|dneigh|dngets|dsaitr|dsapps|dsaup2|dsconv|dseigt|dsesrt|dsgets|dsortc|dsortr|dstatn|dstats|dstqrb|dvout|icnteq|icopy|iset|iswap|ivout|second|sgetv0|slaqrb|smout|snaitr|snapps|snaup2|snconv|sneigh|sngets|ssaitr|ssapps|ssaup2|ssconv|sseigt|ssesrt|ssgets|ssortc|ssortr|sstatn|sstats|sstqrb|svout)</arpack.noprototypes>
        <!-- not supported by OS X veclib -->
        <no.veclib.impl>(dbbcsd|dgemqrt|dgeqrfp|dgeqrt2|dgeqrt3|dgeqrt|dlagge|dlagsy|dlapmr|dlartgp|dlartgs|dlatms|dorbdb|dorcsd|dsyconv|dsyswapr|dsytri2|dsytri2x|dsytrs2|dtpmqrt|dtpqrt2|dtpqrt|dtprfb|sbbcsd|sgemqrt|sgeqrfp|sgeqrt2|sgeqrt3|sgeqrt|slagge|slagsy|slapmr|slartgp|slartgs|slatms|sorbdb|sorcsd|ssyconv|ssyswapr|ssytri2|ssytri2x|ssytrs2|stpmqrt|stpqrt2|stprfb)</no.veclib.impl>
        <prefer.f2j>(${lapacke.callback}|${jvm.better}|${lapacke.unsupported}|${arpack.noprototypes}|${no.veclib.impl})</prefer.f2j>
    </properties>

    <dependencies>
        <dependency>
            <groupId>net.sourceforge.f2j</groupId>
            <artifactId>arpack_combined_all</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.f2j</groupId>
            <artifactId>arpack_combined_all</artifactId>
            <classifier>javadoc</classifier>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.github.fommil.netlib</groupId>
                    <artifactId>generator</artifactId>
                    <executions>
                        <execution>
                            <id>blas</id>
                            <goals>
                                <goal>native-jni</goal>
                            </goals>
                            <configuration>
                                <implementing>com.github.fommil.netlib.NativeSystemBLAS</implementing>
                                <outputDir>${project.build.directory}/netlib-native</outputDir>
                                <outputName>com_github_fommil_netlib_NativeSystemBLAS.c</outputName>
                                <scan>org.netlib.blas</scan>
                                <prefix>cblas_</prefix>
                                <firstParam>CblasColMajor</firstParam>
                                <noFirstParam>.*(dot|nrm2|asum|amax|swap|copy|rot|xpy|cal).*</noFirstParam>
                                <exclude>${prefer.f2j}</exclude>
                                <cblas_hack>true</cblas_hack>
                                <includes>
                                    <param>cblas.h</param>
                                </includes>
                            </configuration>
                        </execution>
                        <execution>
                            <id>lapack</id>
                            <goals>
                                <goal>native-jni</goal>
                            </goals>
                            <configuration>
                                <implementing>com.github.fommil.netlib.NativeSystemLAPACK</implementing>
                                <outputDir>${project.build.directory}/netlib-native</outputDir>
                                <outputName>com_github_fommil_netlib_NativeSystemLAPACK.c</outputName>
                                <scan>org.netlib.lapack</scan>
                                <prefix>LAPACKE_</prefix>
                                <suffix>_work</suffix>
                                <firstParam>LAPACK_COL_MAJOR</firstParam>
                                <noFirstParam>
                                    [sd](disna|gtcon|gttrf|lapy[23]|larfg|larnv|lasrt|ptcon|pttrf|stebz|sterf|lamch)
                                </noFirstParam>
                                <exclude>${prefer.f2j}</exclude>
                                <extractChar>true</extractChar>
                                <lapacke_hack>true</lapacke_hack>
                                <includes>
                                    <param>lapacke.h</param>
                                </includes>
                            </configuration>
                        </execution>
                        <execution>
                            <id>arpack</id>
                            <goals>
                                <goal>native-jni</goal>
                            </goals>
                            <configuration>
                                <implementing>com.github.fommil.netlib.NativeSystemARPACK</implementing>
                                <outputDir>${project.build.directory}/netlib-native</outputDir>
                                <outputName>com_github_fommil_netlib_NativeSystemARPACK.c</outputName>
                                <scan>org.netlib.arpack</scan>
                                <suffix>_</suffix>
                                <exclude>${prefer.f2j}</exclude>
                                <extractChar>true</extractChar>
                                <exclude>${prefer.f2j}</exclude>
                                <fortran_hack>true</fortran_hack>
                                <includes>
                                    <param>arpack.h</param>
                                </includes>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>native-maven-plugin</artifactId>
                    <configuration>
                        <!-- numberOfConcurrentCompilation would be nice, but always fails :-( -->
                        <!-- http://jira.codehaus.org/browse/MOJO-1955 -->
                        <javahVerbose>true</javahVerbose>
                        <javahClassNames>
                            <javahClassName>com.github.fommil.netlib.NativeSystemBLAS</javahClassName>
                            <javahClassName>com.github.fommil.netlib.NativeSystemLAPACK</javahClassName>
                            <javahClassName>com.github.fommil.netlib.NativeSystemARPACK</javahClassName>
                        </javahClassNames>
                        <compilerStartOptions>
                            <compilerStartOption>-O3</compilerStartOption>
                        </compilerStartOptions>
                        <compilerMiddleOptions>
                            <compilerMiddleOption>-Wall -fPIC -DADD_</compilerMiddleOption>
                            <compilerMiddleOption>-fdata-sections</compilerMiddleOption>
                            <compilerMiddleOption>-ffunction-sections</compilerMiddleOption>
                        </compilerMiddleOptions>
                        <linkerStartOptions>
                            <linkerStartOption>-O3</linkerStartOption>
                        </linkerStartOptions>
                        <sources>
                            <source>
                                <directory>${project.build.directory}/netlib-native</directory>
                                <includes>
                                    <include>*.c</include>
                                </includes>
                            </source>
                            <source>
                                <directory>${netlib.src}/JNI</directory>
                                <includes>
                                    <include>*.c</include>
                                </includes>
                            </source>
                            <source>
                                <directory>${netlib.src}/LAPACKE</directory>
                                <includes>
                                    <include>**/*.f</include>
                                    <include>**/*.c</include>
                                </includes>
                                <excludes>
                                    <!-- yay for regex exclusion rules, oh wait... -->
                                    <!-- no.veclib.impl -->
                                    <exclude>**/*_dbbcsd*</exclude>
                                    <exclude>**/*_dgemqrt*</exclude>
                                    <exclude>**/*_dgeqrfp*</exclude>
                                    <exclude>**/*_dgeqrt2*</exclude>
                                    <exclude>**/*_dgeqrt3*</exclude>
                                    <exclude>**/*_dgeqrt*</exclude>
                                    <exclude>**/*_dlagge*</exclude>
                                    <exclude>**/*_dlagsy*</exclude>
                                    <exclude>**/*_dlapmr*</exclude>
                                    <exclude>**/*_dlartgp*</exclude>
                                    <exclude>**/*_dlartgs*</exclude>
                                    <exclude>**/*_dlatms*</exclude>
                                    <exclude>**/*_dorbdb*</exclude>
                                    <exclude>**/*_dorcsd*</exclude>
                                    <exclude>**/*_dsyconv*</exclude>
                                    <exclude>**/*_dsyswapr*</exclude>
                                    <exclude>**/*_dsytri2*</exclude>
                                    <exclude>**/*_dsytri2x*</exclude>
                                    <exclude>**/*_dsytrs2*</exclude>
                                    <exclude>**/*_dtpmqrt*</exclude>
                                    <exclude>**/*_dtpqrt2*</exclude>
                                    <exclude>**/*_dtpqrt*</exclude>
                                    <exclude>**/*_dtprfb*</exclude>
                                    <exclude>**/*_sbbcsd*</exclude>
                                    <exclude>**/*_sgemqrt*</exclude>
                                    <exclude>**/*_sgeqrfp*</exclude>
                                    <exclude>**/*_sgeqrt2*</exclude>
                                    <exclude>**/*_sgeqrt3*</exclude>
                                    <exclude>**/*_sgeqrt*</exclude>
                                    <exclude>**/*_slagge*</exclude>
                                    <exclude>**/*_slagsy*</exclude>
                                    <exclude>**/*_slapmr*</exclude>
                                    <exclude>**/*_slartgp*</exclude>
                                    <exclude>**/*_slartgs*</exclude>
                                    <exclude>**/*_slatms*</exclude>
                                    <exclude>**/*_sorbdb*</exclude>
                                    <exclude>**/*_sorcsd*</exclude>
                                    <exclude>**/*_ssyconv*</exclude>
                                    <exclude>**/*_ssyswapr*</exclude>
                                    <exclude>**/*_ssytri2*</exclude>
                                    <exclude>**/*_ssytri2x*</exclude>
                                    <exclude>**/*_ssytrs2*</exclude>
                                    <exclude>**/*_stpmqrt*</exclude>
                                    <exclude>**/*_stpqrt2*</exclude>
                                    <exclude>**/*_stprfb*</exclude>
                                </excludes>
                            </source>
                            <source>
                                <directory>${netlib.src}/ARPACK</directory>
                                <includes>
                                    <include>*.f</include>
                                </includes>
                            </source>
                        </sources>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>runtime</id>
                            <phase>package</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                            <configuration>
                                <classesDirectory>${project.build.directory}</classesDirectory>
                                <includes>
                                    <include>${project.artifactId}.*</include>
                                </includes>
                                <classifier>natives</classifier>
                            </configuration>
                        </execution>
                        <execution>
                            <id>source</id>
                            <phase>package</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                            <configuration>
                                <classesDirectory>${project.build.directory}</classesDirectory>
                                <includes>
                                    <include>netlib-native/**/*</include>
                                    <include>native/**/*</include>
                                </includes>
                                <classifier>sources</classifier>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
