2016-05-25 1 views
9

Есть ли способ получить все цели проекта CMake с верхнего уровня CMakeLists.txt, т. Е. Программно перебирать цели?Как программно перебирать все цели CMake?

Причина, по которой я хочу это сделать, - применить некоторые конкретные настройки XCode к каждой цели. ,

if (CMAKE_GENERATOR MATCHES "Xcode") 
    include(sanitize_xcode) 
    sanitize_xcode(myTarget) 
endif() 

FYI - модуль санитарии выглядит следующим образом. ,

macro (set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE) 
    set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE}) 
endmacro (set_xcode_property) 

macro (sanitize_xcode TARGET) 
    set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Debug] "YES") 
    set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=MinSizeRel] "NO") 
    set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES") 
    set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "NO") 

    set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=Debug] "NO") 
    set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=MinSizeRel] "YES") 
    set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=RelWithDebInfo] "NO") 
    set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=Release] "YES") 

    set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=Debug] "0") 
    set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=MinSizeRel] "s") 
    set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=RelWithDebInfo] "3") 
    set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=Release] "3") 

    set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=Debug] "7.0") 
    set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=MinSizeRel] "7.0") 
    set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=RelWithDebInfo] "7.0") 
    set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=Release] "7.0") 
endmacro (sanitize_xcode) 
+0

Вы имеете в виду итерацию целей в вашем скрипте cmake программно? –

+0

@ TamásSzelei yes – learnvst

+0

С какой целью? (Запах проблемы X-Y.) Что бы вы ни делали, вероятно, лучше всего сделать в самом CMakeLists.txt. – DevSolar

ответ

6

Повернувшись мой комментарий в ответ

Чтобы получить список всех целей является желание, которое было там на некоторое время, но глобальное свойство TARGETS еще не реализована (как для Май-2016, see "Listing all targets" discussion).

Edit: Сейчас реализуется: Global BUILDSYSTEM_TARGETS собственность была выпущена с CMake 3,7

Таким образом, вы можете осуществить это самостоятельно, используя CMake сценарий себя - в качестве @DevSolar, как комментировал/ответ или как here - но я во время работы с CMake вы узнали, что вы также можете изменить множество целевых свойств во всем мире. Например. большинству целевых свойств по умолчанию присваивается эквивалентная глобальная переменная.

Вы можете воспользоваться этим в вашем случае и решить эту проблему, добавив следующие строки в глобальной CMakeLists.txt файла:

set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Debug] "YES") 
set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=MinSizeRel] "NO") 
set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES") 
set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "NO") 

set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=Debug] "NO") 
set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=MinSizeRel] "YES") 
set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=RelWithDebInfo] "NO") 
set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=Release] "YES") 

set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=Debug] "0") 
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=MinSizeRel] "s") 
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=RelWithDebInfo] "3") 
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=Release] "3") 

set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=Debug] "7.0") 
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=MinSizeRel] "7.0") 
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=RelWithDebInfo] "7.0") 
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=Release] "7.0") 

Ссылки

2

Если вы хотите перейти на список целей, установить CMakeLists.txt до обеспечить, что список в первую очередь.

if (CMAKE_GENERATOR MATCHES "Xcode") 
    include(sanitize_xcode) 
endif() 

# A list of executables to build 
set(project_EXECUTABLES 
    foo 
    bar 
    ) 

# List of sources for each executable, following some naming scheme 

# foo 
set(EXE_foo_SOURCES 
    foo/main.c 
    ) 

# bar 
set(EXE_bar_SOURCES 
    bar/main.c 
    ) 

# For each executable in the list... 
foreach(exe ${project_EXECUTABLES}) 
    # declare the target... 
    add_executable(${exe} ${EXE_${exe}_SOURCES}) 

    # ...and do whatever additional configuration you need 
    if (CMAKE_GENERATOR MATCHES "Xcode") 
     sanitize_xcode(${exe}) 
    endif() 
endforeach() 
+0

Я нашел в целом хороший трюк, чтобы вначале иметь ряд команд 'set()', все настраивать и делать все «волшебство» в конце. На самом деле, [в моей повторно используемой CMake framework] (http://jaws.rootdirectory.de), я * только * делаю 'set()' s в моем 'CMakeLists.txt', а затем' include() 'a файл со всем «волшебством».Если я добавляю/изменяю исходные файлы, я только «прикасаюсь» к «CMakeLists.txt», если я изменяю «волшебство», я «касаюсь» другого файла. Легче поддерживать, ИМХО. – DevSolar

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

  • Нет связанных вопросов^_^