##
## 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
INLINE_INHERITED_MEMB   = YES
JAVADOC_AUTOBRIEF       = YES
INHERIT_DOCS            = YES
INLINE_SIMPLE_STRUCTS   = YES
HIDE_UNDOC_CLASSES      = YES
HIDE_COMPOUND_REFERENCE = YES
HIDE_SCOPE_NAMES        = YES
TYPEDEF_HIDES_STRUCT    = YES
MAX_INITIALIZER_LINES   = 0
ALPHABETICAL_INDEX      = NO
SORT_MEMBER_DOCS        = NO

# Redefine protected as private and strip out the PN_EXTERN and
# PNX_EXTERN macros

ENABLE_PREPROCESSING    = YES
MACRO_EXPANSION         = YES
EXPAND_ONLY_PREDEF      = YES
PREDEFINED              = PN_EXTERN= PNX_EXTERN=

# Configuration options related to warning and progress messages

QUIET                   = YES
WARNINGS                = YES

# Configuration options related to the input files

INPUT                   = @CMAKE_SOURCE_DIR@/c/include \
                          @CMAKE_SOURCE_DIR@/c/examples \
                          @CMAKE_CURRENT_SOURCE_DIR@
FILE_PATTERNS           = *.h *.md *.dox
EXCLUDE_PATTERNS        = @CMAKE_SOURCE_DIR@/c/examples/*.c \
                          @CMAKE_SOURCE_DIR@/c/examples/*.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/cid.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/engine.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/handlers.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/import_export.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/log.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/object.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/reactor.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/sasl_plugin.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/selectable.h \
                          @CMAKE_SOURCE_DIR@/c/include/proton/type_compat.h
FULL_PATH_NAMES         = YES
RECURSIVE               = YES
STRIP_FROM_PATH         = @CMAKE_SOURCE_DIR@/c/include
EXAMPLE_PATH            = @CMAKE_SOURCE_DIR@/c/examples
EXAMPLE_RECURSIVE       = YES

# View and list options

DISABLE_INDEX           = YES
GENERATE_TREEVIEW       = YES
IGNORE_PREFIX           = pn_ PN_

# Configuration options related to the output format

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