# Copyright (c) 2015, Intel Corporation
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation and/or
# other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# The introspection-subsystem provides ability to retrieve
# a boolean parameter value set by the parameter-framework
# at subsystem level.
#
# To get the boolean value, include the "IntrospectionEntryPoint.h"
# header and use the getParameterValue() function.


if (BUILD_TESTING)
    add_library(introspection-subsystem SHARED
        IntrospectionSubsystem.cpp
        IntrospectionSubsystemObject.cpp
        IntrospectionSubsystemBuilder.cpp
        IntrospectionEntryPoint.cpp)

    # generating header used to export shared library symbols
    include(GenerateExportHeader)
    generate_export_header(introspection-subsystem
                           BASE_NAME introspection_subsystem)

    # exporting public headers:
    # - the header that contains the introspection function
    # - the header generated by cmake used to export symbols in shared library.
    #
    # Note : headers located in root project directory remain private.
    target_include_directories(introspection-subsystem
                               PUBLIC "include" "${CMAKE_CURRENT_BINARY_DIR}")

    target_link_libraries(introspection-subsystem PRIVATE parameter)
endif()
