How to print all the properties of a target in cmake?

后端 未结 3 1229
天涯浪人
天涯浪人 2020-12-13 00:22

With the following cmake scrpt:

get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
    message(STATUS \"${_variableName}=         


        
相关标签:
3条回答
  • 2020-12-13 00:35

    This isn't really intended to be a competing answer, just an expansion on the answer by AlwaysTraining (and edited by Dawid Drozd)!

    If the target is an INTERFACE_LIBRARY, this will print out a whole bunch of errors about whitelisted properties. Unfortunately, there doesn't seem to be a good way to dynamically query what the whitelisted properties are - by checking the source for cmTargetPropertyComputer::WhiteListedInterfaceProperty I was able to come up with a regexp, but it could change from version to version (I was looking at the source for cmake-3.11). Anyway, here's my revised version, with support for INTERFACE_LIBRARYtargets - I also removes duplicate, and made the filtering of LOCATION properties happen once, outside of the loop.

    (I've made a suggested edit to the original question, but this is here in case it isn't accepted...)

    Thanks AlwaysTraining and Dawid Drozd!

    # Get all propreties that cmake supports
    execute_process(COMMAND cmake --help-property-list OUTPUT_VARIABLE CMAKE_PROPERTY_LIST)
    
    # Convert command output into a CMake list
    STRING(REGEX REPLACE ";" "\\\\;" CMAKE_PROPERTY_LIST "${CMAKE_PROPERTY_LIST}")
    STRING(REGEX REPLACE "\n" ";" CMAKE_PROPERTY_LIST "${CMAKE_PROPERTY_LIST}")
    # Fix https://stackoverflow.com/questions/32197663/how-can-i-remove-the-the-location-property-may-not-be-read-from-target-error-i
    list(FILTER CMAKE_PROPERTY_LIST EXCLUDE REGEX "^LOCATION$|^LOCATION_|_LOCATION$")
    # For some reason, "TYPE" shows up twice - others might too?
    list(REMOVE_DUPLICATES CMAKE_PROPERTY_LIST)
    
    # build whitelist by filtering down from CMAKE_PROPERTY_LIST in case cmake is
    # a different version, and one of our hardcoded whitelisted properties
    # doesn't exist!
    unset(CMAKE_WHITELISTED_PROPERTY_LIST)
    foreach(prop ${CMAKE_PROPERTY_LIST})
        if(prop MATCHES "^(INTERFACE|[_a-z]|IMPORTED_LIBNAME_|MAP_IMPORTED_CONFIG_)|^(COMPATIBLE_INTERFACE_(BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|EXPORT_NAME|IMPORTED(_GLOBAL|_CONFIGURATIONS|_LIBNAME)?|NAME|TYPE|NO_SYSTEM_FROM_IMPORTED)$")
            list(APPEND CMAKE_WHITELISTED_PROPERTY_LIST ${prop})
        endif()
    endforeach(prop)
    
    function(print_properties)
        message ("CMAKE_PROPERTY_LIST = ${CMAKE_PROPERTY_LIST}")
    endfunction(print_properties)
    
    function(print_whitelisted_properties)
        message ("CMAKE_WHITELISTED_PROPERTY_LIST = ${CMAKE_WHITELISTED_PROPERTY_LIST}")
    endfunction(print_whitelisted_properties)
    
    function(print_target_properties tgt)
        if(NOT TARGET ${tgt})
          message("There is no target named '${tgt}'")
          return()
        endif()
    
        get_target_property(target_type ${tgt} TYPE)
        if(target_type STREQUAL "INTERFACE_LIBRARY")
            set(PROP_LIST ${CMAKE_WHITELISTED_PROPERTY_LIST})
        else()
            set(PROP_LIST ${CMAKE_PROPERTY_LIST})
        endif()
    
        foreach (prop ${PROP_LIST})
            string(REPLACE "<CONFIG>" "${CMAKE_BUILD_TYPE}" prop ${prop})
            # message ("Checking ${prop}")
            get_property(propval TARGET ${tgt} PROPERTY ${prop} SET)
            if (propval)
                get_target_property(propval ${tgt} ${prop})
                message ("${tgt} ${prop} = ${propval}")
            endif()
        endforeach(prop)
    endfunction(print_target_properties)
    
    0 讨论(0)
  • 2020-12-13 00:43

    I have had limited success with the following work-around to the apparent lack of ability to dynamically query for the properties of a target.

    I invoke the cmake command to list all properties, and then try each one on the target.

    # Get all propreties that cmake supports
    execute_process(COMMAND cmake --help-property-list OUTPUT_VARIABLE CMAKE_PROPERTY_LIST)
    
    # Convert command output into a CMake list
    STRING(REGEX REPLACE ";" "\\\\;" CMAKE_PROPERTY_LIST "${CMAKE_PROPERTY_LIST}")
    STRING(REGEX REPLACE "\n" ";" CMAKE_PROPERTY_LIST "${CMAKE_PROPERTY_LIST}")
    
    function(print_properties)
        message ("CMAKE_PROPERTY_LIST = ${CMAKE_PROPERTY_LIST}")
    endfunction(print_properties)
    
    function(print_target_properties tgt)
        if(NOT TARGET ${tgt})
          message("There is no target named '${tgt}'")
          return()
        endif()
    
        foreach (prop ${CMAKE_PROPERTY_LIST})
            string(REPLACE "<CONFIG>" "${CMAKE_BUILD_TYPE}" prop ${prop})
        # Fix https://stackoverflow.com/questions/32197663/how-can-i-remove-the-the-location-property-may-not-be-read-from-target-error-i
        if(prop STREQUAL "LOCATION" OR prop MATCHES "^LOCATION_" OR prop MATCHES "_LOCATION$")
            continue()
        endif()
            # message ("Checking ${prop}")
            get_property(propval TARGET ${tgt} PROPERTY ${prop} SET)
            if (propval)
                get_target_property(propval ${tgt} ${prop})
                message ("${tgt} ${prop} = ${propval}")
            endif()
        endforeach(prop)
    endfunction(print_target_properties)
    
    0 讨论(0)
  • 2020-12-13 00:44

    Improved @AlwaysTraining's and @PaulMolodowitch's answers.
    Solves problem with INTERFACE_LIBRARY described in kyb's comment

    Functionally my implementation does at most the same as @PaulMolodowitch's implementation. But it is more laconic.

    ## https://stackoverflow.com/questions/32183975/how-to-print-all-the-properties-of-a-target-in-cmake/56738858#56738858
    ## https://stackoverflow.com/a/56738858/3743145
    
    ## Get all properties that cmake supports
    execute_process(COMMAND cmake --help-property-list OUTPUT_VARIABLE CMAKE_PROPERTY_LIST)
    ## Convert command output into a CMake list
    STRING(REGEX REPLACE ";" "\\\\;" CMAKE_PROPERTY_LIST "${CMAKE_PROPERTY_LIST}")
    STRING(REGEX REPLACE "\n" ";" CMAKE_PROPERTY_LIST "${CMAKE_PROPERTY_LIST}")
    
    list(REMOVE_DUPLICATES CMAKE_PROPERTY_LIST)
    
    function(print_target_properties tgt)
        if(NOT TARGET ${tgt})
          message("There is no target named '${tgt}'")
          return()
        endif()
    
        foreach (prop ${CMAKE_PROPERTY_LIST})
            string(REPLACE "<CONFIG>" "${CMAKE_BUILD_TYPE}" prop ${prop})
            get_target_property(propval ${tgt} ${prop})
            if (propval)
                get_target_property(propval ${tgt} ${prop})
                message ("${tgt} ${prop} = ${propval}")
            endif()
        endforeach(prop)
    endfunction(print_target_properties)
    
    0 讨论(0)
提交回复
热议问题