¿Cómo puedo escapar de caracteres de clave en una expresión del generador CMake?

Estoy escribiendo un archivo CMake para apoyar la cadena de herramientas IAR incluyendo el lenguaje ASM pero deje la opción abierta para herramientas como GCC en el futuro.

Escribí una expresión del generador así:

target_compile_options(my_library PRIVATE
   
    # ASM language options
    $<$:
        -s+
        -w+
        --cpu Cortex-M7
        --fpu VFPv5_sp
        -M<> # This is a problem 
    >
    
)

La última opción para el ensamblador requiere el uso de нел, pero esto causa comprensiblemente CMake un problema porque √ indica el final de una expresión del generador. Traté de escapar de los personajes con las barras de atrás como -M\<\> o con citas como -M'<>' o ""-M" significaba ", pero no funcionó. Incluso intenté definir una variable separada pero los comandos de salida todavía están equivocados:

set(MY_IAR_ASM_FLAG "-M<>")
target_compile_options(my_library PRIVATE
   
    # ASM language options
    $<$:
        ${MY_IAR_ASM_FLAG}
    >

Termino con un estrado > en la línea de comandos en todos los casos.

¿Cuál es la manera correcta de escapar de estos personajes así que tengo los interruptores ASM adecuados? ¿O hay un buen trabajo?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por codecraftsman


3 Respuestas:

  • Podrías usar el CMake. personajes fugados (por ejemplo, $Así.

    target_compile_options(my_library PRIVATE
    
    # ASM language options
    $<$:
        -s+
        -w+
        --cpu Cortex-M7
        --fpu VFPv5_sp
        -M<$ # This is a problem 
    >
    )
    

    Respondida el Dec 17, 2020 a las 17:00 - por htmlhero

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a la interpretación de las llaves angulares < > en la expresión del generador cmake. Para escapar estos caracteres en una expresión del generador cmake, puedes hacer uso de las variables de escape de cmake "$< y >", así como del comando de escape ^. A continuación te muestro cómo podrías modificar tu código para escapar correctamente la opción -M<> en tu expresión:

    cmake
    target_compile_options(my_library PRIVATE
    
        

    ASM language options

    $<$:
    • s+
    • w+
    • -cpu Cortex-M7
    • -fpu VFPv5_sp
    • M$<$^:$<>>

      Escape option for IAR ASM

      >
    )

    Al usar $<$^:$<>>, estás escapando las llaves angulares <> dentro de la expresión de generador, evitando la interpretación incorrecta de CMake. Esto debería permitir que la opción -M<> se pase correctamente a la herramienta de compilación IAR sin errores.

    Espero que esto te ayude a resolver tu problema. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 17:02 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Puedes escapar caracteres de clave en una expresión del generador CMake usando el carácter de escape \ antes del carácter de clave. Por lo tanto, para escapar del carácter < en tu ejemplo, utilizarías \<.

    Aquí tienes el código modificado con el carácter de escape añadido:

    cmake
    target_compile_options(my_library PRIVATE
    
        

    ASM language options

    $<$:
    • s+
    • w+
    • -cpu Cortex-M7
    • -fpu VFPv5_sp
    • M\<\>

      This is now correct

      >
    )

    También puedes utilizar la sintaxis if() para definir opciones de compilación específicas para diferentes compiladores. Aquí tienes un ejemplo:

    cmake
    if(CMAKE_COMPILER_IS_IAR)
        target_compile_options(my_library PRIVATE
               
    • s+
    • w+
    • -cpu Cortex-M7
    • -fpu VFPv5_sp
    • M\<\>
    ) endif()

    Ten en cuenta que la sintaxis if() solo está disponible en CMake 3.13 y versiones posteriores.

    Respondida el Dec 18, 2020 a las 17:04 - por Gemini

    Votos positivos: 0 | Votos negativos: 0