# Copyright (c) 2014, 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.

if (WIN32)
    set(UTILITY_OS_SPECIFIC_FILES windows/DynamicLibrary.cpp)
else ()
    set(UTILITY_OS_SPECIFIC_FILES posix/DynamicLibrary.cpp)
endif ()

add_library(pfw_utility STATIC
    ${UTILITY_OS_SPECIFIC_FILES}
    Tokenizer.cpp
    Utility.cpp
    DynamicLibrary.cpp)

target_include_directories(pfw_utility PUBLIC .)

# Needed for linking against shared libraries on Linux (no-op on Windows)
set_target_properties(pfw_utility PROPERTIES POSITION_INDEPENDENT_CODE TRUE)

install(FILES
    NonCopyable.hpp
    ErrorContext.hpp
    Utility.h
    convert.hpp
    DESTINATION "include/utility")

if(BUILD_TESTING)
    # Add unit test
    add_executable(utilityUnitTest test/utility.cpp)

    target_link_libraries(utilityUnitTest pfw_utility catch)
    add_test(NAME utilityUnitTest
             COMMAND utilityUnitTest)
endif()
