2010-03-22 5 views
8

J'ai besoin de la syntaxe d'une macro CMAKE qui génère des fichiers .cc et .h à partir d'un outil comme lex/yacc.cmake commande syntaxe question

Quelqu'un pourrait-il s'il vous plaît me montrer la syntaxe pour l'exemple suivant artificiel:

que j'ai un y.cc de fichier qui dépend de x.cc et x.h, les deux fichiers mentionnés sont générés par z_tool outil de fichier x.z. Quelle serait la syntaxe pour cela? Pour cet exemple, supposons que y.cc devienne une bibliothèque statique, et comme je suis relativement nouveau dans CMAKE, le fichier CMakellist.txt complet pour cet exemple artificiel serait très utile. Je cherche une solution portable Comme les outils que j'utilise sont disponibles sur Windows ainsi que des variantes UNIX.

Répondre

15

Plutôt que de vous donner la réponse à un exemple artificiel, voici la façon dont vous générer un exécutable en utilisant flex et 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}) 

Le CMake trouver des paquets pour le bison/flex sont inclus dans l'installation par défaut, c'est donc une plateforme croisée.

En général, pour créer une sortie qui sera utilisée ultérieurement comme entrée, vous pouvez utiliser la fonction add_custom_command. Si vous utilisez une sortie de la commande personnalisée en tant qu'entrée dans une bibliothèque ou un exécutable, CMake sait exécuter votre commande personnalisée avant de compiler les sources pour la bibliothèque/la cible exécutable.

+0

Bien expliqué. L'essentiel était en effet comment câbler les sorties et les entrées: D –

+0

Pour la postérité: inclure aussi quelque chose comme target_link_libraries (Foo $ {FLEX_LIBRARIES} $ {BISON_LIBRARIES} 'dans le fichier cmake. – cheshirekow

1

La ligne suivante a Typo

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

BIANRY doit être orthographié BINARY.

Remarque: CMake Documentation a cette faute de frappe là aussi. (en 2.8.0, ceci est corrigé dans la documentation de 2.8.10).

1

/* Pour que cela fonctionne sur mon Mac avec Lion. J'ai changé les noms de fichiers en y.tab.c et lex.yy.c, qui sont les fichiers de sortie si vous exécutez lex lex.l et yacc -D yacc.y à partir de la ligne de commande. Voir ci-dessous. */

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