CMake: есть ли разница между set property(TARGET ...) и set target properties?

в CMake, предполагая, что вы просто устанавливаете одно свойство, есть ли разница между

set_target_properties(target PROPERTIES prop value)

и

set_property(TARGET target PROPERTY prop value)

?

Cf.

https://cmake.org/cmake/help/v3.0/command/set_property.html https://cmake.org/cmake/help/v3.0/command/set_target_properties.html

что означает, что нет никакой разницы, но не так ясно.

3 ответов


считают set_target_properties() как специализированная форма set_property().

преимущества ...

  • set_target_properties(...) - это удобная функция, поскольку позволяет установить несколько свойств нескольких объектов.

    например:

    add_executable(a ...)
    add_executable(b ...)
    set_target_properties(
        a 
        b
        PROPERTIES 
            LINKER_LANGUAGE CXX
            FOLDER          "Executable"
    )
    
  • set_property(TARGET ...) can APPEND в список или APPEND_STRING к строковому свойству целей.

    для пример:

    add_executable(a ...)
    set_property(
        TARGET a
        APPEND PROPERTY
            INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}"
    )  
    

ссылки


разница в том, что с set_property, вы можете определить область. У вас на самом деле есть больше вариантов с set_property кроме указания целевого объекта, например указания исходных файлов в списке для определенного свойства.

например:

set_property(SOURCE src1.cpp src2.cpp PROPERTY SKIP_AUTOMOC ...)

это добавит свойство SKIP_AUTOMOC в список исходных файлов. (Это для Qt, где Moc'ING объектов происходит автоматически, и иногда вы этого не хотите).

контраст с set_target_properties где необходимо указать цель и свойство и его значение.

set_target_properties(target PROPERTIES CXX_STANDARD 11 ...)

надеюсь, это поможет!


обратите внимание, что у вас также есть соответствующие set_*_properties функции для некоторых других типов свойства: set_source_files_properties, set_directory_properties и set_tests_properties. Примечательно, что отсутствуют сеттеры для install и global properties.

причина в том, что эти функции предшествуют общие set_property вызов, который был введен только с CMake 2.6, вместе с общим капитальным ремонтом системы собственности до того, что это сегодня.

в наши дни люди, как правило, предпочитают общий set_property, поскольку это более современная функция и предоставляет несколько дополнительных функций. Он также предлагает более последовательный синтаксис, чем старые функции (например. set_directory_properties не позволяет указать каталог в качестве параметра, set_source_files vs set_directory, etc.).

нет сильной технической причины для предпочтения set_property, но я считаю это немного лучше, чем используя старые, специфические функции.