2015-08-24 2 views
22

Со следующим Cmake SCRPT:Как распечатать все свойства цели в cmake?

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

Мы можем напечатать все переменные в проекте CMake. Тогда мой вопрос: есть ли функция, которая может печатать все свойства цели?

+0

Это не «печатает все переменные в проекте CMake». Он печатает один передаваемый ему __переменный. Вы можете тривиально сделать что-то подобное для свойств, используя 'get_property'. Это то, о чем вы просите? – Angew

+0

@Angew Спасибо, и я переписал вопрос. – feelfree

+0

Вы ищете что-то вроде [этого] (http://www.kitware.com/blog/home/post/390)? –

ответ

18

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

Я вызываю команду cmake, чтобы отобразить все свойства, а затем попробовать каждый из них.

# 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

Да, это полезно. Если бы добавить ", когда CMAKE_PROPERTY_LIST был использован, и CMAKE_BUILD_TYPE должен быть настроен вручную. –

+0

Свойство РАСПОЛОЖЕНИЕ не может быть считана с целью„PandemicCore“. Используйте целевое имя непосредственно add_custom_command, или использовать выражение генератор $ , в соответствующих случаях. https://stackoverflow.com/questions/32197663/how-can-i-remove-the-the-location-property-may-not-be-read-from-target-error-i –

+0

Исправлено с: \t \t '# Исправить https://stackoverflow.com/questions/32197663/how-can-i-remove-the-the-location-property-may-not-be-read-from-target-error-i \t \t IF (prop STREQUAL "РАСПОЛОЖЕНИЕ" ИЛИ ПОДКЛЮЧЕНИЕ МАТЧА "^ РАСПОЛОЖЕНИЕ_" ИЛИ ПРОФИЛЬНЫЕ МАТЧИ "_LOCATION $") \t \t \t CONTINUE() \t \t ENDIF() ' –

Смежные вопросы