#
# 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.
#

macro(ADD_PKGCONFIG_THRIFT name)
    configure_file("${name}.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/${name}.pc" @ONLY)
    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${name}.pc"
        DESTINATION "${PKGCONFIG_INSTALL_DIR}")
endmacro(ADD_PKGCONFIG_THRIFT)

macro(ADD_LIBRARY_THRIFT name)
    add_library(${name} ${ARGN})
    set_target_properties(${name} PROPERTIES
        OUTPUT_NAME ${name}${THRIFT_RUNTIME_POSTFIX}   # windows link variants (/MT, /MD, /MTd, /MDd) get different names
        VERSION ${thrift_VERSION} )
    # set_target_properties(${name} PROPERTIES PUBLIC_HEADER "${thriftcpp_HEADERS}")
    install(TARGETS ${name} EXPORT "${name}Targets"
        RUNTIME DESTINATION "${BIN_INSTALL_DIR}"
        LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
        ARCHIVE DESTINATION "${LIB_INSTALL_DIR}"
        PUBLIC_HEADER DESTINATION "${INCLUDE_INSTALL_DIR}")

	export(EXPORT "${name}Targets"
		FILE "${CMAKE_CURRENT_BINARY_DIR}/${name}/${name}Targets.cmake"
		NAMESPACE "${name}::")

	install(EXPORT "${name}Targets"
		FILE "${name}Targets.cmake"
		NAMESPACE "${name}::"
		DESTINATION "${CMAKE_INSTALL_DIR}/thrift")
endmacro()

macro(TARGET_INCLUDE_DIRECTORIES_THRIFT name)
    target_include_directories(${name} ${ARGN})
endmacro()

macro(TARGET_LINK_LIBRARIES_THRIFT name)
    target_link_libraries(${name} ${ARGN})
endmacro()

macro(LINK_AGAINST_THRIFT_LIBRARY target libname)
    target_link_libraries(${target} ${libname})
endmacro()

macro(TARGET_LINK_LIBRARIES_THRIFT_AGAINST_THRIFT_LIBRARY target libname)
    target_link_libraries(${target} ${ARGN} ${libname})
endmacro()
