2010-03-22 8 views
8

Necesito la sintaxis de una macro CMAKE que genera archivos .cc y .h desde una herramienta como lex/yacc.pregunta de sintaxis del comando cmake

Podría alguien por favor me muestran la sintaxis para el siguiente ejemplo artificial:

decir que tengo un y.cc archivo que depende de x.cc y x.h, los dos archivos mencionados son generados por z_tool herramienta de x.z. archivo ¿Cuál sería la sintaxis para esto?

Para este ejemplo supongamos que y.cc se convertirá en una biblioteca estática, y como soy bastante nuevo en CMAKE, el CMakellist.txt completo para este ejemplo artificial sería muy útil. Estoy buscando una solución portátil ya que las herramientas que estoy usando están disponibles tanto en Windows como en variantes de UNIX.

Respuesta

15

En lugar de darle la respuesta a un ejemplo artificial, aquí es la manera que le generará un ejecutable usando flex y bison

find_package(BISON) 
find_package(FLEX) 

BISON_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cc) 
FLEX_TARGET(MyScanner lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.cc) 
ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser) 

include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
add_executable(Foo 
    Foo.cc 
    ${BISON_MyParser_OUTPUTS} 
    ${FLEX_MyScanner_OUTPUTS}) 
target_link_libraries(Foo ${FLEX_LIBRARIES} ${BISON_LIBRARIES}) 

El CMake encontrar paquetes para el bisonte/flex están incluidos en la instalación por defecto, así que esto es multiplataforma.

En general, para crear una salida que luego se utilizará como entrada, puede usar la función add_custom_command. Si usa una salida del comando personalizado como una entrada a una biblioteca o ejecutable, entonces CMake sabe ejecutar su comando personalizado antes de compilar las fuentes para el objetivo de biblioteca/ejecutable.

+0

Bien explicado. Lo esencial era cómo conectar las salidas y las entradas: D –

+0

Para la posteridad: también incluya algo como 'target_link_libraries (Foo $ {FLEX_LIBRARIES} $ {BISON_LIBRARIES}' en el archivo cmake. – cheshirekow

1

La siguiente línea tiene Typo

FLEX_TARGET(MyScanner lexer.l ${CMAKE_CURRENT_BIANRY_DIR}/lexer.cc) 

binario a debe ser escrito como BINARIO.

Nota: La documentación de CMake tiene este error también. (en 2.8.0, esto está corregido en la documentación 2.8.10) ..

1

/* Para que funcione en mi Mac con Lion. Cambié los nombres de los archivos a y.tab.c y lex.yy.c, que son los archivos de salida si ejecuta lex lex.l y yacc -D yacc.y desde la línea de comandos. Vea abajo. */

cmake_minimum_required(VERSION 2.8) 
project (LexYacc) 

find_package(BISON) 
find_package(FLEX) 

BISON_TARGET(MyParser yacc.y ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c) 
FLEX_TARGET(MyScanner lex.l ${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c) 
ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser) 

include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
add_executable(LexYacc 
    ${BISON_MyParser_OUTPUTS} 
    ${FLEX_MyScanner_OUTPUTS}) 
target_link_libraries(LexYacc ${FLEX_LIBRARIES} ${BISON_LIBRARIES}) 
Cuestiones relacionadas