#
#    Copyright (c) 2014-2017 Nest Labs, Inc.
#    All rights reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#

#
#    Description:
#      This file defines a GNU autoconf M4-style macro for checking
#      project-specific header search paths.
#

#
# NL_CHECK_PROJECT_CONFIG_INCLUDES(option, header, description, default)
#
#   option          - The stem of the option advertised via AC_ARG_WITH.
#   header-define   - The pre-processor macro that will be defined with the
#                     with the name of the header file.
#   header          - The name of the header file to search for when a directory
#                     is given. 
#   description     - The short description of the project-specific configuration
#                     header.
#   default-dir     - [optional] The default directory to search for project-specific
#                     configuration headers.
#
# Create a configuration option that allows the user to specify the place to
# search for the named project-specific configuration header.
# ----------------------------------------------------------------------------
AC_DEFUN([NL_CHECK_PROJECT_CONFIG_INCLUDES],
[
AC_ARG_WITH($1,
    [AS_HELP_STRING([--with-$1=FILE|DIR],
                    [Specify a project-specific configuration header for $4. If a directory is given, it is searched for the file $3. @<:@default=$5@:>@])],
    [
        # If a file or directory was specified...
        if test "x${withval}" != "x" -a "x${withval}" != "xno"; then
        
            # Attempt to find the specified file, or a directory containing the default 
            # file name.  NOTE: We do not use AC_CHECK_HEADERS here because the supplied
            # file may not be compilable out of context of the full OpenWeave build.
            if test -f "${withval}"; then
                _nl_tmp_project_file="${withval}"
                _nl_tmp_project_dir=
            elif test -f "${withval}/include/$3"; then
                _nl_tmp_project_file="$3"
                _nl_tmp_project_dir="${withval}/include/"
            elif test -f "${withval}/$3"; then
                _nl_tmp_project_file="$3"
                _nl_tmp_project_dir="${withval}/"
            else
                AC_MSG_ERROR([Project-specific configuration for %4 not found: ${withval}".])
            fi

            # If a directory was given, include it in the header search paths.
            if test "x${_nl_tmp_project_dir}" != "x"; then
                CPPFLAGS="-I${_nl_tmp_project_dir} ${CPPFLAGS}"
            fi

            # Define a pre-processor macro containing the name of the located header file in angle brackets
            # (e.g. <WeaveProjectConfig.h>).
            AC_DEFINE_UNQUOTED([$2], [<${_nl_tmp_project_file}>], [Path to $4 platform config header file])

            # Accumulate a list of the project config files that have been selected.
            NL_PROJECT_CONFIG_INCLUDES="$NL_PROJECT_CONFIG_INCLUDES ${_nl_tmp_project_dir}${_nl_tmp_project_file}"
        fi
    ],
    [
        # If a default location was specified and it contains the expected header file...
        if test "x$5" != "x" -a -f "$5/$3"; then
            
            # Include the default directory in the header search paths.
            CPPFLAGS="-I$5 ${CPPFLAGS}"
            
            # Define a pre-processor macro containing the default header name in angle brackets
            # (e.g. <WeaveProjectConfig.h>).
            AC_DEFINE_UNQUOTED([$2], [<$3>], [Path to $4 platform config header file])

            # Accumulate a list of the project config files that have been selected.
            NL_PROJECT_CONFIG_INCLUDES="$NL_PROJECT_CONFIG_INCLUDES $5/$3"
        fi
    ])
])

# A list of the project configuration headers that have been selected
# for inclusion.
#
AC_SUBST(NL_PROJECT_CONFIG_INCLUDES)
