2012-07-21 6 views
25

listas CRealice son esencialmente cadenas separadas por punto y coma solo, pero si pasa una variable de este tipo a un comando, que se pone expanden en múltiples argumentos - por ejemplo,¿Cómo paso correctamente la lista de CMake (punto y coma y sep) de los indicadores a set_target_properties?

set(FLAGS f1 f2 f3) 
# now FLAGS == 'f1;f2;f3' 
add_custom_command(
    ... 
    COMMAND my_cmd ${FLAGS} 
    ... 
) 

se llame correctamente my_cmd f1 f2 f3.

si hago esto con

set_target_properties(
    myTarget PROPERTIES 
    LINK_FLAGS "${LD_FLAGS}" 
) 

la expansión no se produce, y termino con un solo punto y coma que contiene LD_FLAG - inútil, en lugar de expandir en una cadena separada por espacios.

¿Hay alguna manera de hacerlo para que cuando paso una lista a la propiedad LINK_FLAGS (o cualquier propiedad que sea), se expanda en múltiples argumentos en lugar de solo uno?

Gracias, Dan

Respuesta

13

No creo set_target_properties puede hacer la expansión automáticamente, pero se puede usar string (REPLACE ...) para expandir una lista en un espacio de cadena separados:

string (REPLACE ";" " " LD_FLAGS_STR "${LD_FLAGS}") 
set_target_properties(
    myTarget PROPERTIES 
    LINK_FLAGS "${LD_FLAGS_STR}" 
) 
+8

¿Es realmente la mejor manera? ¿Por qué CMake fue diseñado para usar un formato de lista que no es compatible con su propio comando 'set_target_properties'? –

+0

El problema principal con esta técnica en general es que si alguno de los indicadores contiene espacios, causarán problemas. Deberá haber algún escape aplicado para conservar espacios en argumentos si es posible (por ejemplo, si se incluye un nombre de archivo proporcionado externamente, que puede contener espacios). –

+1

B +++ T. No funciona 'string (REPLACE"; "" "DEST $ {SRC})' reemplaza el punto y coma con ... una cadena vacía. Solo esto funciona: 'foreach (OPT $ {LD_FLAGS}) set (LINK_FLAGS" $ {LINK_FLAGS} $ {OPT} ") endforeach()'. Sería realmente divertido, a menos que este C+++ p no fuera la herramienta de compilación más popular en la actualidad. – Ethouris

2

lo uso como cuerdas

set(FLAGS " f1 f2 f3")

Observa el espacio en la parte delantera, es una Te permite concatenar otros conjuntos de banderas.

Para proyectos más complejos, en lugar de si-vigilara también puede hacer una doble expansión truco:

set(GCC_FLAGS " -Wl,--relax") 
set(DIAB_FLAGS " -tPPCE500ES:cross") 
set(MSVC_FLAGS " /RAINBOW_CRAP) 
# ... 
# ...LINUX_FLAGS, WINDOWS_FLAGS, etc... 


set_target_properties(
    myTarget PROPERTIES 
    LINK_FLAGS "${${COMPILER}_FLAGS} ${${SYSTEM}_FLAGS}" 
) 

# COMPILER and SYSTEM is set somewhere else, in toolchain files for example 
5

Para usar una lista de cmake como lista, utilice

${LD_FLAG} 

Para poder utilizar una lista de cmake como cadena, (es decir, los elementos de la lista se separan con ';'), use

"${LD_FLAG}" 

Por lo tanto, en su caso, simplemente elimine "" debería ser suficiente.

+0

Esta es la solución correcta, gracias –

+0

Extraño, pero este no funcionó para mí, versión 3.9 :('set_target_properties llamado con número incorrecto de argumentos. – Andry

+0

@Andry ¿Qué se muestra si inserta" MENSAJE ("$ {LD_FLAG} ")" delante de él? –

5

El comando set_property está diseñado para este

http://www.cmake.org/cmake/help/v3.0/command/set_property.html

set_property(TARGET tgt PROPERTY LINK_FLAGS foo bar) 
+0

¿Quién dice que no es? – steveire

+0

Steveire - Creo erróneamente que no estaba en 2.8.11, porque traté de cambiar' set_target_properties (foo ...) 'a' set_properties (TARGET foo ...) '. Pero ahora veo que hay una diferencia en p luralización de los nombres de comando (plural vs singular). El nombre correcto es 'set_property' (termina en' y'). –

+0

Sí, puedes usar set_property() como muestra esta respuesta, pero CMake trata a LINK_FLAGS como una cadena simple, no como una lista; esto significa que en esta respuesta se pasa un único argumento, 'foo; bar'. Es desafortunado. También es interesante que ahora hay una propiedad 'COMPILE_OPTIONS' que es una lista, pero el antiguo' COMPILE_FLAGS' es una cadena simple. –

Cuestiones relacionadas