##
## 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/include \
                          @CMAKE_SOURCE_DIR@/cpp/docs \
                          @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
