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

后端 未结 3 1228
天涯浪人
天涯浪人 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 "" "${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)
    

提交回复
热议问题