Я пишу небольшой анализатор, но у меня проблемы с использованием 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 изменены.
Есть ли способ достичь моей цели?
Спасибо.