PUBLIC | PRIVATE | INTERFACE cmake как понимать данные спецификаторы

1,00
р.
Я продолжаю разбираться с cmake файлами, и появился вопрос для чего используются спецификаторы PUBLIC | PRIVATE | INTERFACE ? Из прочтенной справки target_link_libraries я мало что понял...
The PUBLIC, PRIVATE and INTERFACE keywords can be used to specify both the link dependencies and the link interface in one command. Libraries and targets following PUBLIC are linked to, and are made part of the link interface. Libraries and targets following PRIVATE are linked to, but are not made part of the link interface. Libraries following INTERFACE are appended to the link interface and are not used for linking .
Я не совсем пойму что имеется ввиду когда говорится что они связаны (имеется ввиду линковщик ?) и являются/не являются частью связанного интерфейса (тоже не совсем пойму) так же непонятно касательно INTERFACE где пишется что они присоединяются к интерфейсу ссылки и не используются для связи с целью (linking ).
Подскажите что имеется ввиду в cmake файлах когда мы указываем данные модификаторы ? Имеется ли ввиду что таким образом мы устанавливаем необходимые файлы (заголовки к примеру для библилотек) или же библиотеки (к примеру в случае с (.so) библиотеками) для работы программы ? Но программа и так не сможет запуститься без использования (.so) библиотеки к примеру... Меня несколько запутали данные модификаторы.
Так же не понятно к их использование в команде target_sources да и в целом не совсем пойму их смысл в cmake файлах. Буду благодарен если разъясните для чего они нужны и когда к ним стоит прибегать.

Ответ
Там всё достаточно просто.
PRIVATE служит для того, чтобы указать какие элементы (исходники, библиотеки, цели) необходимы для сборки этой цели. Т.е. эта цель зависима от этих элементов, но другие цели, которые будут использовать эту цель в качестве зависимости, не получат её зависимости транзитивно. Т.е. если цель A зависит от нашей цели Target, у которой в качестве приватной зависимости указана цель Dep, то A не будет зависеть от Dep, а Target будет использовать Dep при сборке себя. INTERFACE служит для указания элементов, которые не нужны для сборки этой цели, но они должны быть «прокинуты» для любой цели, которая данную цель указывает в качестве зависимости. Т.е. если цель A зависит от нашей цели Target, у которой в качестве интерфейсной зависимости указана цель Dep, то A будет зависеть от Dep, но Target не будет использовать Dep при сборке себя. PUBLIC аналогичен связке INTERFACE и PRIVATE. Т.е. если цель A зависит от нашей цели Target, у которой в качестве публичной зависимости указана цель Dep, то A будет зависеть от Dep, а Target будет использовать Dep при сборке себя.
Прибегать к ним стоит тогда, когда нужно. Это сравнительно новые модификаторы, которые лучше всего раскрывают себя при разработке библиотек. Т.е. они позволяют чётко разграничить, что мы показываем миру и что от чего зависит. Для себя можно взять за правило использовать PRIVATE по умолчанию, прибегая к другим модификаторам только тогда, когда они действительно необходимы.