#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

m4_define([xcam_major_version], [1])
m4_define([xcam_minor_version], [2])
m4_define([xcam_micro_version], [0])
m4_define([xcam_version], [xcam_major_version.xcam_minor_version.xcam_micro_version])

AC_PREREQ([2.60])
AC_CONFIG_MACRO_DIR([m4])
AC_INIT([libxcam], [xcam_version], [feng.yuan@intel.com], [libxcam])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign subdir-objects])

#xcam version
XCAM_MAJOR_VERSION=xcam_major_version
XCAM_MINOR_VERSION=xcam_minor_version
XCAM_MICRO_VERSION=xcam_micro_version
XCAM_VERSION=xcam_version
XCAM_VERSION_HEX="0x$XCAM_MAJOR_VERSION$XCAM_MINOR_VERSION$XCAM_MICRO_VERSION"
AC_DEFINE_UNQUOTED(XCAM_VERSION, $XCAM_VERSION_HEX,
    [define libxcam version])
AC_SUBST(XCAM_VERSION)

XCAM_LT_VERSION="xcam_major_version:xcam_minor_version:xcam_micro_version"
XCAM_LT_LDFLAGS="-version-number $XCAM_LT_VERSION"
AC_SUBST(XCAM_LT_VERSION)
AC_SUBST(XCAM_LT_LDFLAGS)

#xcam required OpenCV version
XCAM_REQUIRE_CV_MIN=3.0.0
XCAM_REQUIRE_CV_MAX=3.4.3

#xcam required OpenSceneGraph version
XCAM_REQUIRE_OSG_MIN=3.3.2

# Checks for programs.
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
PKG_PROG_PKG_CONFIG
LT_INIT

AC_ARG_ENABLE(debug,
    AS_HELP_STRING([--enable-debug],
                   [enable debug, @<:@default=no@:>@]),
    [], [enable_debug="no"])
AM_CONDITIONAL([DEBUG], [test "$enable_debug" = "yes"])

AC_ARG_ENABLE(profiling,
    AS_HELP_STRING([--enable-profiling],
                   [enable profiling, @<:@default=no@:>@]),
    [], [enable_profiling="no"])

AC_ARG_ENABLE(drm,
    AS_HELP_STRING([--enable-drm],
                   [enable drm buffer, @<:@default=no@:>@]),
    [], [enable_drm="no"])

AC_ARG_ENABLE([aiq],
    AS_HELP_STRING([--enable-aiq],
                   [enable Aiq 3A algorithm build, @<:@default=no@:>@]),
    [], [enable_aiq="no"])

AC_ARG_ENABLE([gst],
    AS_HELP_STRING([--enable-gst],
                   [enable gstreamer plugin build, @<:@default=no@:>@]),
    [], [enable_gst="no"])

AC_ARG_ENABLE(libcl,
    AS_HELP_STRING([--enable-libcl],
                   [enable libcl image processor, @<:@default=yes@:>@]),
    [], [enable_libcl="yes"])

AC_ARG_ENABLE([gles],
    AS_HELP_STRING([--enable-gles],
                   [enable gles, @<:@default=no@:>@]),
    [], [enable_gles="no"])

AC_ARG_ENABLE([vulkan],
    AS_HELP_STRING([--enable-vulkan],
                   [enable vulkan, @<:@default=no@:>@]),
    [], [enable_vulkan="no"])

AC_ARG_ENABLE(opencv,
    AS_HELP_STRING([--enable-opencv],
                   [enable opencv library, @<:@default=no@:>@]),
    [], [enable_opencv="no"])

AC_ARG_ENABLE(capi,
    AS_HELP_STRING([--enable-capi],
                   [enable libxcam-capi library, @<:@default=no@:>@]),
    [], [enable_capi="no"])

AC_ARG_ENABLE([render],
    AS_HELP_STRING([--enable-render],
                   [enable texture render with OpenSceneGraph library, @<:@default=no@:>@]),
    [], [enable_render="no"])
# documentation
AC_ARG_ENABLE(docs,
    [AC_HELP_STRING([--enable-docs],
                    [build Doxygen documentation @<:@default=no@:>@])],
    [], [enable_docs="no"])

AC_ARG_ENABLE([3alib],
    AS_HELP_STRING([--enable-3alib],
                   [enable 3A lib build, @<:@default=no@:>@]),
    [], [enable_3alib="no"])

AC_ARG_ENABLE([smartlib],
    AS_HELP_STRING([--enable-smartlib],
                   [enable smart analysis lib build, @<:@default=no@:>@]),
    [], [enable_smartlib="no"])

# Check for Doxygen
if test "$enable_docs" = "yes"; then
    AC_CHECK_TOOL([DOXYGEN], [doxygen], [no])
    if test "$DOXYGEN" = "no"; then
       enable_docs="no"
    fi
fi
AM_CONDITIONAL(ENABLE_DOCS, test "$enable_docs" = "yes")

# check profiling
ENABLE_PROFILING=0
if test "$enable_profiling" = "yes"; then
    ENABLE_PROFILING=1
fi

# check drm
HAVE_LIBDRM=0
if test "$enable_drm" = "yes"; then
    PKG_CHECK_MODULES(LIBDRM, [libdrm], [HAVE_LIBDRM=1], [HAVE_LIBDRM=0])
fi

# check libcl
HAVE_LIBCL=0
if test "$enable_libcl" = "yes"; then
    PKG_CHECK_MODULES(LIBCL, [libcl], [HAVE_LIBCL=1], [HAVE_LIBCL=0])
fi

# check gl
HAVE_GLES=0
if test "$enable_gles" = "yes"; then
    PKG_CHECK_MODULES(LIBGL, [gl], [HAVE_GLES=1], [HAVE_GLES=0])
fi

# check vulkan
HAVE_VULKAN=0
if test "$enable_vulkan" = "yes"; then
    PKG_CHECK_MODULES(LIBVULKAN, [vulkan], [HAVE_VULKAN=1], [HAVE_VULKAN=0])
fi

# check open sence graph
ENABLE_RENDER=0
if test "$enable_render" = "yes"; then
    PKG_CHECK_MODULES(
        [LIBOSG],
        [openscenegraph-osg >= $XCAM_REQUIRE_OSG_MIN],
        [HAVE_OSG=1],
        [HAVE_OSG=0])

    XCAM_OSG_VERSION=`$PKG_CONFIG --modversion openscenegraph-osg`
    AC_MSG_NOTICE(OpenSceneGraph version: $XCAM_OSG_VERSION)

    if test "$HAVE_OSG" -eq 1; then
        ENABLE_RENDER=1
    else
        AC_MSG_WARN(OpenSceneGraph required version: >= $XCAM_REQUIRE_OSG_MIN)
        ENABLE_RENDER=0
    fi
fi

if test "$enable_libcl" = "yes" && test "$HAVE_LIBCL" -eq 0; then
    PKG_CHECK_MODULES(LIBCL, [OpenCL], [HAVE_LIBCL=1], [HAVE_LIBCL=0])
fi

if test "$HAVE_LIBCL" -eq 1; then
    AC_CHECK_PROGS([GAWK], [gawk], [no])
    if test "x$GAWK" = "xno"; then
        AC_MSG_ERROR([gawk not found])
    fi

    if test "$HAVE_LIBDRM" -eq 1; then
        HAVE_CL_INTEL_H=1
        AC_CHECK_HEADERS([CL/cl_intel.h], [HAVE_CL_INTEL_H=1], [HAVE_CL_INTEL_H=0])
        if test "$HAVE_CL_INTEL_H" -eq 0; then
            # https://raw.githubusercontent.com/intel/beignet/Release_v1.3/include/CL/cl_intel.h
            XCAM_WGET(
                [https://cgit.freedesktop.org/beignet/plain/include/CL/cl_intel.h?id=Release_v1.3.0],
                [./ext/beignet/include/CL/cl_intel.h],
                [6a6619073cb35e6987b7379a5a1a1497])

            CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/ext/beignet/include"
        fi
    fi
fi

# check opencv version number
HAVE_OPENCV=0
if test "$enable_opencv" = "yes"; then
    PKG_CHECK_MODULES(
        [OPENCV],
        [opencv >= $XCAM_REQUIRE_CV_MIN opencv <= $XCAM_REQUIRE_CV_MAX],
        [HAVE_OPENCV=1],
        [HAVE_OPENCV=0])

    XCAM_CV_VERSION=`$PKG_CONFIG --modversion opencv`
    AC_MSG_NOTICE(OpenCV version: $XCAM_CV_VERSION)

    if test "$HAVE_OPENCV" -eq 0; then
        AC_MSG_ERROR(OpenCV required version: >= $XCAM_REQUIRE_CV_MIN && <= $XCAM_REQUIRE_CV_MAX)
    fi
fi

# check opencv videostab module
ENABLE_DVS=0
if test "$HAVE_OPENCV" -eq 1; then
    AC_LANG(C++)
    saved_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $OPENCV_CFLAGS"
    saved_LIBS="$LIBS"
    LIBS="$LIBS $OPENCV_LIBS"
    AC_CHECK_HEADER([opencv2/videostab.hpp], [ENABLE_DVS=1], [ENABLE_DVS=0])
    CPPFLAGS="$saved_CPPFLAGS"
    LIBS="$saved_LIBS"
fi

# check dvs opencl path
ENABLE_DVS_CL_PATH=0
if test "$HAVE_OPENCV" -eq 1; then
    AC_LANG(C++)
    saved_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $OPENCV_CFLAGS"
    saved_LIBS="$LIBS"
    LIBS="$LIBS $OPENCV_LIBS"
    AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
            [[#include <opencv2/core.hpp>
              #include <opencv2/opencv.hpp>
            ]],
            [[cv::UMat frame0;
              cv::UMat frame1;
              cv::videostab::MotionEstimatorRansacL2 est;
              cv::videostab::KeypointBasedMotionEstimator kpest(&est);
              kpest.estimate(frame0, frame1);
            ]]
           )],
        [ENABLE_DVS_CL_PATH=1],
        [ENABLE_DVS_CL_PATH=0]
    )
    CPPFLAGS="$saved_CPPFLAGS"
    LIBS="$saved_LIBS"
fi

# check capi build
ENABLE_CAPI=0
if test "$enable_capi" = "yes" && test "$HAVE_LIBCL" -eq 1; then
    AC_MSG_NOTICE(enable capi && have libcl: $HAVE_LIBCL)
    ENABLE_CAPI=1
fi

# check AIQ
ENABLE_IA_AIQ=0
USE_LOCAL_AIQ=0
if test "$enable_aiq" = "yes"; then
    ENABLE_IA_AIQ=1
    PKG_CHECK_MODULES(IA_AIQ, ia_imaging,
        PKG_CHECK_EXISTS(ia_imaging >= 2.7,
            AC_DEFINE(HAVE_AIQ_2_7, 1, [defined if module ia_imaging >= v2.0_007 is found])
        ),
        [USE_LOCAL_AIQ=1]
    )

    if test "$USE_LOCAL_AIQ" -eq 1; then
        #check HAVE_AIQ_2_7
        AC_CACHE_CHECK([for ext/ia_imaging >=v2.0_007],
            ac_cv_have_aiq_2_7, [
            saved_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS="$CPPFLAGS -I./ext/ia_imaging/include"
            saved_LIBS="$LIBS"
            LIBS="$LIBS"
            AC_COMPILE_IFELSE(
                [AC_LANG_PROGRAM(
                    [[#include <stdint.h>
                      #include <stdio.h>
                      #include "ia_aiq_types.h"
                    ]],
                    [[ia_aiq_ae_results ae_result;
                      ae_result.flashes = NULL;
                    ]]
                   )],
                [ac_cv_have_aiq_2_7="yes"],
                [ac_cv_have_aiq_2_7="no"]
            )
            CPPFLAGS="$saved_CPPFLAGS"
            LIBS="$saved_LIBS"
        ])

        if test "$ac_cv_have_aiq_2_7" = "yes"; then
            AC_DEFINE(HAVE_AIQ_2_7, 1, [defined if ia_imaging >= v2.0_007 is found])
        fi
    fi

    if test "$USE_LOCAL_AIQ" -eq 0; then
        IA_IMAGING_CFLAGS="$IA_AIQ_CFLAGS"
        IA_IMAGING_LIBS="$IA_AIQ_LIBS"
    else
        IA_IMAGING_CFLAGS="-I\$(top_srcdir)/ext/ia_imaging/include"
        IA_IMAGING_LIBS="-L\$(top_srcdir)/ext/ia_imaging/lib -lia_aiq -lia_isp_2_2 -lia_cmc_parser -lia_mkn -lia_nvm -lia_exc -lia_log"
    fi
    AC_SUBST(IA_IMAGING_CFLAGS)
    AC_SUBST(IA_IMAGING_LIBS)
    LIBS="$LIBS $IA_IMAGING_LIBS"
fi

# check 3a lib build
ENABLE_3ALIB=0
if test "$enable_3alib" = "yes"; then
    ENABLE_3ALIB=1
fi
AM_CONDITIONAL([ENABLE_3ALIB], [test "$ENABLE_3ALIB" -eq 1])

# check smart analysis lib build
ENABLE_SMART_LIB=0
if test "$enable_smartlib" = "yes"; then
    ENABLE_SMART_LIB=1
fi
AM_CONDITIONAL([ENABLE_SMART_LIB], [test "$ENABLE_SMART_LIB" -eq 1])

# check atomisp headers
USE_LOCAL_ATOMISP=0
#AC_CHECK_HEADERS([linux/atomisp.h], [USE_LOCAL_ATOMISP=0], [USE_LOCAL_ATOMISP=1])
AC_CACHE_CHECK([for linux/atomisp.h],
    ac_cv_have_atomisp_headers, [
    saved_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS"
    saved_LIBS="$LIBS"
    LIBS="$LIBS"
    AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
            [[#ifndef __user
              #define __user 
              #endif
              #include <stdint.h>
              #include <stdio.h>
              #include <linux/atomisp.h>]],
            [[struct atomisp_parm param;]]
           )],
        [ac_cv_have_atomisp_headers="yes"],
        [ac_cv_have_atomisp_headers="no" USE_LOCAL_ATOMISP=1]
    )
    CPPFLAGS="$saved_CPPFLAGS"
    LIBS="$saved_LIBS"
])


# build gstreamer plugin
GST_API_VERSION=1.0
GST_VERSION_REQUIRED=1.2.3
ENABLE_GST=0
if test "$enable_gst" = "yes"; then
    ENABLE_GST=1
    PKG_CHECK_MODULES([GST], [gstreamer-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
    PKG_CHECK_MODULES([GST_ALLOCATOR], [gstreamer-allocators-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
    PKG_CHECK_MODULES([GST_VIDEO], [gstreamer-video-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
fi
AM_CONDITIONAL([ENABLE_GST], [test "$ENABLE_GST" -eq 1])

dnl set XCAM_CFLAGS and XCAM_CXXFLAGS
XCAM_CFLAGS=" -fPIC -DSTDC99 -W -Wall -D_REENTRANT -Wformat -Wformat-security -fstack-protector"
if test "$enable_debug" = "yes"; then
    XCAM_CFLAGS="$XCAM_CFLAGS -g -DDEBUG"
fi
XCAM_CXXFLAGS="$XCAM_CFLAGS -std=c++0x"
AC_SUBST(XCAM_CFLAGS)
AC_SUBST(XCAM_CXXFLAGS)

PTHREAD_LDFLAGS="$PTHREAD_LDFLAGS -pthread"
AC_SUBST(PTHREAD_LDFLAGS)

# define macor in config.h
AC_DEFINE_UNQUOTED([ENABLE_PROFILING], $ENABLE_PROFILING,
    [enable profiling])

AC_DEFINE_UNQUOTED([HAVE_LIBDRM], $HAVE_LIBDRM,
    [have libdrm])
AM_CONDITIONAL([HAVE_LIBDRM], [test "$HAVE_LIBDRM" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_LIBCL], $HAVE_LIBCL,
    [have libcl])
AM_CONDITIONAL([HAVE_LIBCL], [test "$HAVE_LIBCL" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_GLES], $HAVE_GLES,
    [have gles])
AM_CONDITIONAL([HAVE_GLES], [test "$HAVE_GLES" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_VULKAN], $HAVE_VULKAN,
    [have vulkan])
AM_CONDITIONAL([HAVE_VULKAN], [test "$HAVE_VULKAN" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_RENDER], $ENABLE_RENDER,
    [enable texture render])
AM_CONDITIONAL([ENABLE_RENDER], [test "$ENABLE_RENDER" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_OPENCV], $HAVE_OPENCV,
    [have opencv])
AM_CONDITIONAL([HAVE_OPENCV], [test "$HAVE_OPENCV" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_DVS], $ENABLE_DVS,
    [enable dvs])
AM_CONDITIONAL([ENABLE_DVS], [test "$ENABLE_DVS" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_DVS_CL_PATH], $ENABLE_DVS_CL_PATH,
    [enable dvs cl path])
AM_CONDITIONAL([ENABLE_DVS_CL_PATH], [test "$ENABLE_DVS_CL_PATH" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_CAPI], $ENABLE_CAPI,
    [enable capi build])
AM_CONDITIONAL([ENABLE_CAPI], [test "$ENABLE_CAPI" -eq 1])

#atomisp
AM_CONDITIONAL([USE_LOCAL_ATOMISP], [test "$USE_LOCAL_ATOMISP" -eq 1])

# aiq (ia_imaging)
AC_DEFINE_UNQUOTED([HAVE_IA_AIQ], $ENABLE_IA_AIQ,
    [have aiq binary])
AM_CONDITIONAL([ENABLE_IA_AIQ], [test "$ENABLE_IA_AIQ" -eq 1])
AM_CONDITIONAL([USE_LOCAL_AIQ], [test "$USE_LOCAL_AIQ" -eq 1])

AC_CONFIG_FILES([Makefile
                 shaders/Makefile
                 shaders/clx/Makefile
                 shaders/glslx/Makefile
                 xcore/Makefile
                 modules/Makefile
                 modules/soft/Makefile
                 modules/isp/Makefile
                 modules/ocl/Makefile
                 modules/gles/Makefile
                 modules/vulkan/Makefile
                 modules/render/Makefile
                 wrapper/Makefile
                 wrapper/gstreamer/Makefile
                 wrapper/gstreamer/interface/Makefile
                 plugins/Makefile
                 plugins/3a/hybrid/Makefile
                 plugins/3a/aiq/Makefile
                 plugins/3a/Makefile
                 plugins/smart/Makefile
                 plugins/smart/dvs/Makefile
                 plugins/smart/dvs/libdvs/Makefile
                 plugins/smart/sample/Makefile
                 capi/Makefile
                 tests/Makefile
                 pkgconfig/Makefile
                 pkgconfig/libxcam.pc
                ])

AC_OUTPUT

if test "$HAVE_LIBDRM" -eq 1; then have_drm="yes"; else have_drm="no"; fi
if test "$USE_LOCAL_AIQ" -eq 1; then use_local_aiq="yes"; else  use_local_aiq="no"; fi
if test "$USE_LOCAL_ATOMISP" -eq 1; then use_local_atomisp="yes"; else  use_local_atomisp="no"; fi
if test "$HAVE_LIBCL" -eq 1; then have_libcl="yes"; else  have_libcl="no"; fi
if test "$HAVE_GLES" -eq 1; then have_gles="yes"; else  have_gles="no"; fi
if test "$HAVE_VULKAN" -eq 1; then have_vulkan="yes"; else  have_vulkan="no"; fi
if test "$HAVE_OPENCV" -eq 1; then have_opencv="yes"; else have_opencv="no"; fi
if test "$ENABLE_RENDER" -eq 1; then enable_render="yes"; else enable_render="no"; fi
if test "$ENABLE_DVS" -eq 1; then enable_dvs="yes"; else enable_dvs="no"; fi
if test "$ENABLE_CAPI" -eq 1; then enable_capi="yes"; else enable_capi="no"; fi

echo "
     libxcam configuration summary
     version                    : $XCAM_VERSION
     enable debug               : $enable_debug
     enable profiling           : $enable_profiling
     enable drm lib             : $have_drm
     build GStreamer plugin     : $enable_gst
     build aiq analyzer         : $enable_aiq
     use local aiq              : $use_local_aiq
     use local atomisp          : $use_local_atomisp
     enable OpenCV              : $have_opencv
     enable OpenCL              : $have_libcl
     enable GLES                : $have_gles
     enable Vulkan              : $have_vulkan
     enable OSG render          : $enable_render
     enable 3a lib              : $enable_3alib
     enable smart analysis lib  : $enable_smartlib
     enable dvs                 : $enable_dvs
     enable libxcam-capi lib    : $enable_capi
"
