Как написать рабочий файл cmake для flex & bison? - PullRequest
0 голосов
/ 13 июня 2018

Я пишу небольшой анализатор, но у меня проблемы с использованием cmake.

Моя цель: flex Fl => F.cc, bison By => B.cc, my_program.cc + F.cc+ B.cc => библиотека

Моя первая попытка:

FIND_PACKAGE(FLEX REQUIRED)
if (FLEX_FOUND)
    ADD_CUSTOM_TARGET(
        flex_target
        COMMAND ${FLEX_EXECUTABLE} 
            --header-file=${CMAKE_CURRENT_SOURCE_DIR}/F.h
            --outfile=${CMAKE_CURRENT_SOURCE_DIR}/F.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/F.l
        COMMENT "Generating F.cc"
    )
endif(FLEX_FOUND)
FIND_PACKAGE(BISON REQUIRED)
if (BISON_FOUND)
    ADD_CUSTOM_TARGET(
        bison_target
        COMMAND ${BISON_EXECUTABLE} 
            --defines=${CMAKE_CURRENT_SOURCE_DIR}/B.h
            --output=${CMAKE_CURRENT_SOURCE_DIR}/B.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/B.y
        COMMENT "Generating B.cc"
    )
endif(BISON_FOUND)

add_library(my_library my_program.cc F.cc B.cc)
add_dependencies(my_library bison_target)
add_dependencies(my_library flex_target)

Все в порядке, за исключением того, что команды flex & bison вызываются каждый раз, когда я запускаю make, даже файлы Fl и ByНЕ изменилось.

Затем я пытаюсь переключиться на использование ADD_CUSTOM_COMMAND вместо ADD_CUSTOM_TARGET.

FIND_PACKAGE(FLEX REQUIRED)
if (FLEX_FOUND)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/F.cc
        SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/F.l
        COMMAND ${FLEX_EXECUTABLE} 
            --header-file=${CMAKE_CURRENT_SOURCE_DIR}/F.h
            --outfile=${CMAKE_CURRENT_SOURCE_DIR}/F.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/F.l
        COMMENT "Generating F.cc"
    )
endif(FLEX_FOUND)
FIND_PACKAGE(BISON REQUIRED)
if (BISON_FOUND)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/B.cc
        SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/B.y
        COMMAND ${BISON_EXECUTABLE} 
            --defines=${CMAKE_CURRENT_SOURCE_DIR}/B.h
            --output=${CMAKE_CURRENT_SOURCE_DIR}/B.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/B.y
        COMMENT "Generating B.cc"
    )
endif(BISON_FOUND)

add_library(my_library my_program.cc F.cc B.cc)

Обратите внимание, что, похоже, я не могу добавить зависимости для ADD_CUSTOM_COMMAND.

Затем, когда я запускаю make, кажется, что flex & bison будет работать только ОДИН РАЗ.Он не запустится во второй раз, даже если файлы .l и .y изменены.

Есть ли способ достичь моей цели?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

CMake имеет модуль для Flex и Bison , так что вы можете сделать это:

find_package(FLEX REQUIRED)
find_package(BISON REQUIRED)

flex_target(lexer F.l "${CMAKE_CURRENT_BINARY_DIR}/F.cc")

bison_target(parser B.y "${CMAKE_CURRENT_BINARY_DIR}/B.cc")

add_library(my_library STATIC
    ${sources}
    "${CMAKE_CURRENT_BINARY_DIR}/F.cc"
    "${CMAKE_CURRENT_BINARY_DIR}/B.cc"
)

Обратите внимание, что оба flex_target и bison_target используютadd_custom_command внутренне.

Редактировать: Для полноты, как @vre указывает в комментариях, есть FindFLEX обеспечивает add_flex_bison_dependency команда:

add_flex_bison_dependency(lexer parser)

Какие* lexer зависит от parser, чтобы разрешить токены прежнего использования позже.

0 голосов
/ 13 июня 2018
  1. Да, вам нужно использовать add_custom_command.
  2. Не выводить в исходный каталог, используйте для этого inary dir.
  3. Вывести список входных файлов в разделе DEPENDSчтобы внести изменения в CMake track и перезапускать команду всякий раз, когда она изменяется.

См. add_custom_command документацию для получения дополнительной информации.

...