2013-10-16 13 views
11

jestem konwersji mój system budować od configure/make do systemu cmakeCUpewnij i Flex/Bison

System ma pewne generowanych automatycznie pliki z żubra/Flex. Oryginalne polecenia makefile są:

bison --defines=tokens.h --output=parser.cpp parser.y 
flex --outfile=scanner.cpp scanner.l 

natknąłem this ancient link który wydaje się wyjaśnić, jak to zrobić, ale gdy uruchamiam cmake z poniższych poleceń niestandardowych, nic nie wydaje się zdarzyć (bez komunikatów o błędach, bez generowania pliku)

FIND_PACKAGE(BISON REQUIRED) 
IF(BISON_FOUND) 
    ADD_CUSTOM_COMMAND(
     SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMAND ${BISON_EXECUTABLE} 
     ARGS --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h 
      -o ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
      ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMENT "Generating parser.cpp" 
     OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
    ) 
ENDIF(BISON_FOUND) 

FIND_PACKAGE(FLEX REQUIRED) 
IF(FLEX_FOUND) 
    ADD_CUSTOM_COMMAND(
     SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMAND ${FLEX_EXECUTABLE} 
     ARGS -o${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
      ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMENT "Generating scanner.cpp" 
     OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp 
    ) 
ENDIF(FLEX_FOUND) 

Jestem nowy w cmake, więc jest to dla mnie nieco dezorientujące. Czy ktokolwiek ma pojęcie, jaka powinna być działająca komenda custom_command?

+0

Czy możesz również opublikować część CMakeList, która używa wygenerowanych plików? – Angew

+0

Należy pamiętać o tagowaniu. Flex-lexer jest przeznaczony do analizatora leksykalnego; tag flex jest dla Adobe/Apache UI Framework. – JeffryHouser

+0

Przepraszam, "flex" jest automatycznie zasugerowany, nie myślałem o sprawdzeniu opisu. – LordAro

Odpowiedz

11

Format twojego add_custom_command s nie jest całkiem poprawny, ale wydaje się być prawie poprawny. Istnieją dwie wersje add_custom_command, a jeden chcesz jest ten, który produkuje plik wyjściowy (elementy w nawiasach kwadratowych są opcjonalne):

add_custom_command(OUTPUT output1 [output2 ...] 
        COMMAND command1 [ARGS] [args1...] 
        [COMMAND command2 [ARGS] [args2...] ...] 
        [MAIN_DEPENDENCY depend] 
        [DEPENDS [depends...]] 
        [IMPLICIT_DEPENDS <lang1> depend1 
            [<lang2> depend2] ...] 
        [WORKING_DIRECTORY dir] 
        [COMMENT comment] [VERBATIM] [APPEND]) 

Chodzi o to, że polecenie zwyczaj wykonywana tylko wtedy, gdy określony plik ponieważ OUTPUT tego polecenia jest używane jako dane wejściowe w innym miejscu w tym samym CMakeLists.txt (np. w wywołaniu add_library lub add_executable).

Polecenie niestandardowe będzie działać tylko w czasie kompilacji (tj. Po uruchomieniu make), a nie w czasie konfiguracji (po uruchomieniu CMake) i tylko wtedy, gdy budujesz cel, który bezpośrednio lub pośrednio potrzebuje pliku OUTPUT .

Aby naprawić swoje polecenia, myślę, że następujące powinny działać (niesprawdzone):

FIND_PACKAGE(BISON REQUIRED) 
SET(BisonOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp) 
IF(BISON_FOUND) 
    ADD_CUSTOM_COMMAND(
     OUTPUT ${BisonOutput} 
     COMMAND ${BISON_EXECUTABLE} 
       --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h 
       --output=${BisonOutput} 
       ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMENT "Generating parser.cpp" 
    ) 
ENDIF() 

FIND_PACKAGE(FLEX REQUIRED) 
SET(FlexOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp) 
IF(FLEX_FOUND) 
    ADD_CUSTOM_COMMAND(
     OUTPUT ${FlexOutput} 
     COMMAND ${FLEX_EXECUTABLE} 
       --outfile=${FlexOutput} 
       ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMENT "Generating scanner.cpp" 
    ) 
ENDIF() 

ADD_LIBRARY(MyLib ${BisonOutput} ${FlexOutput}) 
+0

To wygląda dobrze, chociaż nie jestem pewien, do czego służy add_library, czy mógłbyś je rozwinąć? – LordAro

+0

@LordAro - przepraszam, mógłbym uczynić to nieco jaśniejszym. Próbowałem tylko podać przykład faktycznego użycia plików wyjściowych jako danych wejściowych do innego polecenia. Nie oczekuję, że masz bibliotekę o nazwie "MyLib" lub że dowolny cel używa tylko tych 2 plików. Wyobrażam sobie, że te pliki będą 2 z wielu, które zawierają lib/exe w twoim CMakeLists.txt. – Fraser

+0

ok, podejrzewam, i wydaje się, że działa :) Bardzo dziękuję – LordAro

15

Nowa gorąca dla żubrów użytkowania jest faktycznie udokumentowane w cmake.org Więc dla prostego projektu parsera:

bison_target(parser fl.ypp fl.tab.cpp) 
add_executable(fl ${BISON_parser_OUTPUTS}) 

to, co możesz zrobić. Podobnie dla Flex.

+1

Nie działa w starszej wersji Wersja Flex powinna mieć 2.5.5 lub więcej. Przyczyną przekazanych parametrów jest przyczyna tych funkcji. –

Powiązane problemy