function(setup_fgfs_libraries target)
    if(RTI_FOUND)
        set(HLA_LIBRARIES ${RTI_LDFLAGS})
    else()
        set(HLA_LIBRARIES "")
    endif()

    if(ENABLE_JSBSIM)
        target_link_libraries(${target} JSBSim)
    endif()

    if(ENABLE_IAX)
        target_link_libraries(${target} iaxclient_lib)
    endif()

    if(HAVE_DBUS)
        # ALIAS doesn't work with CMake 3.10, so we need
        # variable to store the target name
        target_link_libraries(${target} ${dbus_target})
    endif()

    if(X11_FOUND)
        target_link_libraries(${target} ${X11_LIBRARIES})
    endif()

    target_link_libraries(${target} fgsqlite3 fgvoicesynth fgembeddedresources)

    target_link_libraries(${target}
        SimGearCore
        SimGearScene
        Boost::boost
        ${EVENT_INPUT_LIBRARIES}
        ${HLA_LIBRARIES}
        ${OPENGL_LIBRARIES}
        ${OPENSCENEGRAPH_LIBRARIES}
        ${PLATFORM_LIBS}
        ${PLIB_LIBRARIES}
    )

    if (ENABLE_SWIFT)
        # ALIAS doesn't work with CMake 3.10, so we need
        # variable to store the target name
        target_link_libraries(${target} ${dbus_target} ${libEvent_target})
    endif()

    if (ENABLE_PLIB_JOYSTICK)
        target_link_libraries(${target} PLIBJoystick)
    endif()

    target_link_libraries(${target} PLIBFont)

    if (HAVE_QT)
        target_link_libraries(${target} fglauncher fgqmlui)
    endif()

    if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
        target_link_libraries(${target} execinfo)
    endif()

    if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
        target_link_libraries(${target} execinfo)
    endif()

    if (TARGET sentry::sentry)
        target_link_libraries(${target} sentry::sentry)
    endif()
endfunction()


# CMake < 3.12 can't define a link to an OBJECT library to specify its include
# paths, so we have to essentially duplicate the above and configure the paths manually.
# Once we require CMake 3.12, delete all this and use the function above.

function (_apply_target_includes dest target)
    if (NOT TARGET ${target})
        return()
    endif()

    # retrieve the list of includes from the target
    get_target_property(includes ${target} INTERFACE_INCLUDE_DIRECTORIES)

    foreach(i ${includes})
        # skip any invalid includes
        if (NOT i)
            return()
        endif()

        target_include_directories(${dest} PUBLIC ${i})
    endforeach()
endfunction()

function (_apply_all_target_includes dest)
    foreach(arg IN LISTS ARGN)
      _apply_target_includes(${dest} ${arg})
    endforeach()
endfunction()

function (setup_fgfs_library_includes target)
 
    _apply_all_target_includes(${target} 
        SimGearCore
        SimGearScene
        Boost::boost
        ${EVENT_INPUT_LIBRARIES}
        ${HLA_LIBRARIES}
        ${OPENGL_LIBRARIES}
        ${OPENSCENEGRAPH_LIBRARIES}
        ${PLATFORM_LIBS}
        ${PLIB_LIBRARIES}
    )

    if(ENABLE_JSBSIM)
        _apply_target_includes(${target} JSBSim)
    endif()    
    
    _apply_target_includes(${target} fgsqlite3)
    _apply_target_includes(${target} fgvoicesynth)
    _apply_target_includes(${target} fgembeddedresources)

    if(ENABLE_IAX)
        _apply_target_includes(${target} iaxclient_lib)
    endif()

    if (ENABLE_SWIFT)
        _apply_all_target_includes(${target} ${dbus_target})
    endif()

    if (ENABLE_PLIB_JOYSTICK)
        _apply_target_includes(${target} PLIBJoystick)
    endif()
    
    _apply_target_includes(${target} PLIBFont)

    if (TARGET sentry::sentry)
        _apply_target_includes(${target} sentry::sentry)
    endif()

endfunction()