##
## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you 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.
##

# Project options

PROJECT_NAME            = "Qpid Proton C++"
PROJECT_NUMBER          = @PN_VERSION_MAJOR@.@PN_VERSION_MINOR@.@PN_VERSION_POINT@
OUTPUT_DIRECTORY        = .
OUTPUT_LANGUAGE         = English
BRIEF_MEMBER_DESC       = YES
REPEAT_BRIEF            = YES
ALWAYS_DETAILED_SEC     = NO
JAVADOC_AUTOBRIEF       = YES
MULTILINE_CPP_IS_BRIEF  = NO
INHERIT_DOCS            = YES
BUILTIN_STL_SUPPORT     = YES
INLINE_SIMPLE_STRUCTS   = YES
HIDE_UNDOC_CLASSES      = YES
HIDE_COMPOUND_REFERENCE = YES
HIDE_SCOPE_NAMES        = YES
MAX_INITIALIZER_LINES   = 0
ALPHABETICAL_INDEX      = NO
SORT_MEMBER_DOCS        = NO

# Redefine protected as private and strip out the PN_CPP_EXTERN macro

ENABLE_PREPROCESSING    = YES
MACRO_EXPANSION         = YES
EXPAND_ONLY_PREDEF      = YES
PREDEFINED              = protected=private PN_CPP_DEPRECATED(x)= PN_CPP_EXTERN= PN_CPP_OVERRIDE= PN_CPP_HAS_CPP11=1 PN_CPP_HAS_SHARED_PTR=1 PN_CPP_HAS_UNIQUE_PTR=1 PN_CPP_HAS_LONG_LONG=1 PN_CPP_HAS_NULLPTR=1 PN_CPP_HAS_RVALUE_REFERENCES=1 PN_CPP_HAS_OVERRIDE=override PN_CPP_HAS_EXPLICIT_CONVERSIONS=1 PN_CPP_HAS_DEFAULTED_FUNCTIONS=1 PN_CPP_HAS_DELETED_FUNCTIONS=1 PN_CPP_HAS_STD_FUNCTION=1 PN_CPP_HAS_CHRONO=1 PN_CPP_SUPPORTS_THREADS=1
EXCLUDE_SYMBOLS         = internal internal::*

# Configuration options related to warning and progress messages

QUIET                   = YES
WARNINGS                = YES

# Configuration options related to the input files

INPUT                   = @CMAKE_SOURCE_DIR@/cpp/docs/pages.dox \
                          @CMAKE_SOURCE_DIR@/cpp/docs \
                          @CMAKE_SOURCE_DIR@/cpp/include \
                          @CMAKE_SOURCE_DIR@/cpp/examples \
                          @CMAKE_SOURCE_DIR@/docs/connect-config.md

FILE_PATTERNS           = *.hpp *.md *.dox
EXCLUDE_PATTERNS        = @CMAKE_SOURCE_DIR@/cpp/examples/*.?pp \
                          @CMAKE_SOURCE_DIR@/cpp/include/proton/internal/*.hpp
FULL_PATH_NAMES         = YES
RECURSIVE               = YES
STRIP_FROM_PATH         = @CMAKE_SOURCE_DIR@/cpp/include
EXAMPLE_PATH            = @CMAKE_SOURCE_DIR@/cpp/examples
EXAMPLE_RECURSIVE       = YES

# View and list options

DISABLE_INDEX           = YES
GENERATE_TREEVIEW       = YES

# Configuration options related to the output format

GENERATE_HTML           = YES
HTML_OUTPUT             = html
HTML_FILE_EXTENSION     = .html
GENERATE_LATEX          = NO
