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

# Requires autoconf tool later than 2.61
AC_PREREQ([2.61])
# Initialize the omxvideo package version 1.0.0
AC_INIT([omxvideo], 1.0.0)
# Does not strictly follow GNU Coding standards
AM_INIT_AUTOMAKE([gnu foreign subdir-objects])
AM_MAINTAINER_MODE
# defines some macros variable to be included by source
AC_CONFIG_HEADER([config.h])
AC_CONFIG_MACRO_DIR([m4])

# Checks for programs.
AM_PROG_AR
AC_PROG_CC
AC_PROG_CPP
AC_PROG_CXX
AM_PROG_CC_C_O
AC_PROG_LIBTOOL
AC_PROG_AWK
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET

PKG_PROG_PKG_CONFIG

AC_ARG_ENABLE([target-msm8953],
        AC_HELP_STRING([--enable-target-msm8953],
                [Enable conditional compile for target msm8953 [default=no]]),
        [target_msm8953="${enableval}"])

AC_ARG_ENABLE([target-msm8909],
        AC_HELP_STRING([--enable-target-msm8909],
                [Enable conditional compile for target msm8909 [default=no]]),
        [target_msm8909="${enableval}"])

AC_ARG_ENABLE([target-msm8996],
        AC_HELP_STRING([--enable-target-msm8996],
                [Enable conditional compile for target msm8996 [default=no]]),
        [target_msm8996="${enableval}"])

AC_ARG_ENABLE([target-msm8610],
        AC_HELP_STRING([--enable-target-msm8610],
                [Enable conditional compile for target msm8610 [default=no]]),
        [target_msm8610="${enableval}"])

AC_ARG_ENABLE([target-msm8226],
        AC_HELP_STRING([--enable-target-msm8226],
                [Enable conditional compile for target msm8610 [default=no]]),
        [target_msm8226="${enableval}"])

AC_ARG_ENABLE([is-ubwc-supported],
        AC_HELP_STRING([--enable-ubwc-supported],
                [Enable conditional compile for target msm8953 [default=no]]),
        [targets_that_support_ubwc="${enableval}"])

AC_ARG_ENABLE([targets-that-support-pq],
        AC_HELP_STRING([--enable-targets-that-support-pq],
                [Enable conditional compile for target msm8953 [default=no]]),
        [targets_that_support_pq="${enableval}"])

AC_ARG_ENABLE([target-uses-ion],
        AC_HELP_STRING([--enable-target-uses-ion],
                [Enable conditional compile for target target-uses-ion [default=no]]),
        [target_uses_ion="${enableval}"])

AC_ARG_ENABLE([targets-that-use-flag-msm8226],
        AC_HELP_STRING([--enable-targets-that-use-flag-msm8226],
                [Enable conditional compile for target targets_that_use_flag_msm8226 [default=no]]),
        [targets_that_use_flag_msm8226="${enableval}"])

AC_ARG_ENABLE([target-uses-media-extensions],
        AC_HELP_STRING([--enable-target-uses-media-extensions],
                [Enable conditional compile for target target_uses_media_extensions [default=no]]),
        [target_uses_media_extensions="${enableval}"])

AC_ARG_ENABLE([master-side-cp-target-list],
        AC_HELP_STRING([--enable-master-side-cp-target-list],
                [Enable conditional compile for target master_side_cp_target_list [default=no]]),
        [master_side_cp_target_list="${enableval}"])

AC_ARG_ENABLE([targets-that-use-hevc-adsp-heap],
        AC_HELP_STRING([-targets-that-use-hevc-adsp-heap],
                [Enable conditional compile for target target-uses-ion [default=no]]),
        [targets_that_use_hevc_adsp_heap="${enableval}"])

AC_ARG_ENABLE([use-glib],
        AC_HELP_STRING([--enable-use-glib],
                [Enable conditional compile for use glib [default=no]]),
        [use_glib="${enableval}"])

AC_ARG_ENABLE([build-mm-video],
        AC_HELP_STRING([--enable-use-glib],
                [Enable conditional compile for use glib [default=no]]),
        [build_mm_video="${enableval}"])

AC_ARG_WITH([sanitized-headers],
        [AS_HELP_STRING([--with-sanitized-headers=DIR],[location of the sanitized Linux kernel headers])],
        [CPPFLAGS="$CPPFLAGS -I $withval"])

AC_ARG_WITH([glib-headers],
        [AS_HELP_STRING([--with-binder-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([utils-headers],
        [AS_HELP_STRING([--with-utils-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([cutils-headers],
        [AS_HELP_STRING([--with-cutils-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([kernel-headers],
        [AS_HELP_STRING([--with-kernel-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([kernel-uapi-headers],
        [AS_HELP_STRING([--with-kernel-uapi-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([adreno-headers],
        [AS_HELP_STRING([--with-adreno-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([libgpustats-headers],
        [AS_HELP_STRING([--with-libgpustats-headers=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([ui-headers],
        [AS_HELP_STRING([--with-ui-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([android-headers],
        [AS_HELP_STRING([--with-gralloc-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([gralloc-headers],
        [AS_HELP_STRING([--with-strcpyincludes-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([binder-headers],
        [AS_HELP_STRING([--with-binder-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([display-headers],
        [AS_HELP_STRING([--with-binder-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([qdutils-headers],
        [AS_HELP_STRING([--with-binder-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AC_ARG_WITH([glib-lib-dir],
        [AS_HELP_STRING([--with-binder-inc=DIR],[location of common headers])],
        [CPPFLAGS="$CPPFLAGS -I$withval"])

AM_CONDITIONAL(TARGET_MSM8953, [test "x$target_msm8953" = "xyes"])
AM_CONDITIONAL(TARGET_MSM8909, [test "x$target_msm8909" = "xyes"])
AM_CONDITIONAL(TARGET_MSM8996, [test "x$target_msm8996" = "xyes"])
AM_CONDITIONAL(TARGET_MSM8610, [test "x$target_msm8610" = "xyes"])
AM_CONDITIONAL(TARGET_MSM8226, [test "x$target_msm8226" = "xyes"])
AM_CONDITIONAL(TARGETS_THAT_SUPPORT_UBWC, [test "x$targets_that_support_ubwc" = "xyes"])
AM_CONDITIONAL(TARGETS_THAT_SUPPORT_PQ, [test "x$targets_that_support_pq" = "xyes"])
AM_CONDITIONAL(TARGET_USES_ION, [test "x$target_uses_ion" = "xyes"])
AM_CONDITIONAL(TARGETS_THAT_USE_FLAG_MSM8226, [test "x$targets_that_use_flag_msm8226" = "xyes"])
AM_CONDITIONAL(TARGET_USES_MEDIA_EXTENSIONS, [test "x$target_uses_media_extensions" = "xyes"])
AM_CONDITIONAL(MASTER_SIDE_CP_TARGET_LIST, [test "x$master_side_cp_target_list" = "xyes"])
AM_CONDITIONAL(USE_GLIB, [test "x$use_glib" = "xyes"])
AM_CONDITIONAL(BUILD_MM_VIDEO, [test "x$build_mm_video" = "xyes"])

AC_ARG_WITH([glib],
      AC_HELP_STRING([--with-glib],
         [enable glib, building HLOS systems which use glib]))

if (test "x${with_glib}" = "xyes"); then
        GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
        GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"

        AC_SUBST(GLIB_CFLAGS)
        AC_SUBST(GLIB_LIBS)
fi

AC_SUBST([CPPFLAGS])
AC_SUBST([CFLAGS])

AC_CONFIG_FILES([ \
        Makefile \
        mm-core/Makefile
        mm-video-v4l2/Makefile \
        mm-video-v4l2/vidc/Makefile \
        mm-video-v4l2/vidc/venc/Makefile \
        mm-video-v4l2/vidc/vdec/Makefile \
        ])
AC_OUTPUT
