2016-05-25 16 views
9

Esiste un modo per ottenere tutti gli obiettivi di un progetto CMake dal livello superiore CMakeLists.txt, ovvero iterare sulle destinazioni a livello di programmazione?Come si esegue l'iterazione su tutti gli obiettivi di CMake a livello di codice?

Il motivo per cui desidero farlo è applicare alcune impostazioni specifiche di XCode a ciascun target. .

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

FYI: il modulo di sanitizzazione si presenta così. .

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

Intendi iterare programmaticamente gli obiettivi nel tuo script cmake? –

+0

@ TamásSzelei sì – learnvst

+0

A quale scopo? (Odore di un problema X-Y.) Qualunque cosa tu voglia fare è probabilmente la cosa migliore da fare in CMakeLists.txt stesso. – DevSolar

risposta

6

Girando il mio commento in una risposta

Per avere una lista di tutti gli obiettivi è un desiderio che è stato lì per un po ', ma la proprietà globale TARGETS non è ancora implementato (come per Maggio 2016, see "Listing all targets" discussion).

Edit: Si è da adesso implementata: Global BUILDSYSTEM_TARGETS struttura è stata rilasciata con CMake 3,7

in modo da poter implementare da soli utilizzando lo script CMake per sé - come @DevSolar come commentato/risposta o come here - ma io' Ho imparato nel tempo a lavorare con CMake che potresti anche cambiare molte proprietà di destinazione a livello globale. Per esempio. la maggior parte delle proprietà di destinazione sono predefinite a un'impostazione di variabile globale equivalente.

Si può approfittare di questo nel tuo caso e risolvere questo aggiungendo quanto segue al globale CMakeLists.txt del file:

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

Riferimenti

2

Se si vuole andare oltre un elenco di obiettivi, impostare il vostro CMakeLists.txt fino a fornire che elencano, in primo luogo.

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

Ho trovato generalmente un buon trucco per avere una serie di comandi 'set()' all'inizio, impostando tutto e facendo tutta la "magia" alla fine. In realtà, [nel mio framework CMake riutilizzabile] (http://jaws.rootdirectory.de), I * only * fa 'set()' s nel mio 'CMakeLists.txt', e poi' include() 'a file con tutta la "magia".Se aggiungo/cambio file sorgente, tocchino solo "CMakeLists.txt", se modifico il "magico" "tocco" un file diverso. Più facile da mantenere, IMHO. – DevSolar

Problemi correlati