CMake: Is there a difference between set_property(

2020-05-30 06:34发布

问题:

In CMake, assuming one is just setting one property, is there any difference between

set_target_properties(target PROPERTIES prop value)

and

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

which imply there is no difference but aren't that clear.

回答1:

Consider set_target_properties() as a specialized form of set_property().

Advantages of ...

  • set_target_properties(...) is a convenience function because it allows to set multiple properties of multiple targets.

    For example:

    add_executable(a ...)
    add_executable(b ...)
    set_target_properties(
        a 
        b
        PROPERTIES 
            LINKER_LANGUAGE CXX
            FOLDER          "Executable"
    )
    
  • set_property(TARGET ...) can APPEND to a list- or APPEND_STRING to a string-based property of targets.

    For example:

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

References

  • How to change the name of the output binary to not be a.out with CMake?
  • target_include_directories prior to 2.8.12?
  • Appending compiler flags to a file with CMake


回答2:

The difference is that with set_property, you get to define the scope. You actually have more options with the set_property other than just specifying a target, such as specifying source files in a list to have a certain property.

For example:

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

This will add the SKIP_AUTOMOC property to source files listed. (This is for Qt, where Moc'ing of objects occurs automatically and sometimes you don't want that).

Contrast with set_target_properties where you must specify a Target and the property and it's value.

set_target_properties(target PROPERTIES CXX_STANDARD 11 ...)

Hopefully this helps!



回答3:

Note that you also have respective set_*_properties functions for some of the other types of properties: set_source_files_properties, set_directory_properties and set_tests_properties. Notably absent are setters for install and global properties.

The reason for that is that these functions predate the general set_property call, which was only introduced with CMake 2.6, together with a general overhaul of the property system to what it is today.

These days, people tend to prefer the generic set_property, as it is the more modern function and provides a few additional features. It also offers a more consistent syntax than the old functions (eg. set_directory_properties not allowing to specify the directory as a parameter, set_source_files vs set_directory, etc.).

There is not a strong technical reason for preferring set_property, but I would consider it slightly better style than using the old, specific functions.



标签: cmake