2016-05-25 18 views
9

Czy istnieje sposób, aby uzyskać wszystkie cele projektu CMake z poziomu najwyższego poziomu, tj. Iterować programowo obiekty docelowe?Jak programowo wykonać iterację wszystkich celów CMake?

Powodem, dla którego chcę to zrobić, jest zastosowanie określonych ustawień XCode do każdego celu. .

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

FYI - moduł sanityzacji wygląda następująco. .

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

Masz na myśli iterację celów w twoim skryptu cmake programowo? –

+0

@ TamásSzelei yes – learnvst

+0

W jakim celu? (Wąchanie problemu X-Y.) Cokolwiek chcesz zrobić, najlepiej zrobić najlepiej w samym CMakeLists.txt. – DevSolar

Odpowiedz

6

Włączanie mój komentarz na odpowiedź

Aby mieć listę wszystkich celów jest chęć, który został tam przez jakiś czas, ale właściwość globalna TARGETS nie jest jeszcze zaimplementowana (jak na May-2016, see "Listing all targets" discussion).

Edit: Obecnie jest realizowany: Global BUILDSYSTEM_TARGETS nieruchomość została wydana z CMake 3,7

Więc można wdrożyć ten samodzielnie za pomocą skryptu CUpewnij się - jak @DevSolar jak skomentował/lub jak here odpowiedział - ale jestem w czasie pracy z CMake nauczyłeś się, że możesz zmienić wiele właściwości docelowych na całym świecie. Na przykład. większość docelowych właściwości jest domyślnie ustawiona na równoważne ustawienie zmiennej globalnej.

Można wykorzystać to w Twoim przypadku i rozwiązać ten problem poprzez dodanie następujących do globalnej CMakeLists.txt pliku:

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") 

Odniesienia

2

Jeśli chcesz iść na listę celów, ustaw CMakeLists.txt do zapewnić tej liście w pierwszej kolejności.

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

Znalazłem na ogół dobry trik, aby na początku mieć serię komend 'set()', ustawiających wszystko i wykonujących całą "magię" na końcu. Właściwie, [w moim ponownie używanym frameworku CMake] (http://jaws.rootdirectory.de), I * only * robi 'set()' s w moim 'CMakeLists.txt', a następnie' include() 'a plik z całą "magią".Jeśli dodaję/zmieniam pliki źródłowe, "dotykam" tylko "CMakeLists.txt", jeśli zmienię "magię", to "dotykam" innego pliku. Łatwiejsze do utrzymania, IMHO. – DevSolar

Powiązane problemy