##
## 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
INLINE_INHERITED_MEMB   = YES
JAVADOC_AUTOBRIEF       = YES
MULTILINE_CPP_IS_BRIEF  = NO
INHERIT_DOCS            = YES
BUILTIN_STL_SUPPORT     = YES
INLINE_SIMPLE_STRUCTS   = YES
EXTRACT_LOCAL_CLASSES   = NO
HIDE_UNDOC_CLASSES      = YES
HIDE_COMPOUND_REFERENCE = YES
HIDE_SCOPE_NAMES        = YES
MAX_INITIALIZER_LINES   = 0
ALPHABETICAL_INDEX      = 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_EXTERN=

# Configuration options related to warning and progress messages

QUIET                  = YES
WARNINGS               = YES

# Configuration options related to the input files

INPUT = @CMAKE_SOURCE_DIR@/proton-c/bindings/cpp/include @CMAKE_SOURCE_DIR@/proton-c/bindings/cpp/docs @CMAKE_SOURCE_DIR@/examples/cpp/README.hpp
FILE_PATTERNS          = *.hpp *.md
RECURSIVE              = YES
EXAMPLE_PATH           = @CMAKE_SOURCE_DIR@/examples/cpp
EXAMPLE_RECURSIVE      = YES

# View and list options

GENERATE_TODOLIST       = NO
GENERATE_TESTLIST       = NO
GENERATE_BUGLIST        = NO
GENERATE_DEPRECATEDLIST = YES

# Configuration options related to the output format

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