CMake: Flex custom_command никогда не вызывается

У меня есть некоторые проблемы с использованием CMake с Flex в проекте C++. я использую FindFlexи его макрос FLEX_TARGET которая генерирует пользовательскую команду, которая просто называется исполняемым файлом Flex, чтобы создать исходный файл из .l файл.

Смотрите определение макроса из проекта Github Cmake.

Мой проект состоит только в CMakeLists.txt и мой Example.l LEX файл. Также есть пара файлов Parser.hpp/Parser.cpp, которые в настоящее время содержат только класс "Я ничего не делаю" (конструктор, деструктор, вот и все):

Вот CMakeLists.txt: cmake_minimum_required(ВЕРСИЯ 3.0)

project(PARSER)

find_package(FLEX REQUIRED)
flex_target(Scanner Example.l ${CMAKE_CURRENT_BINARY_DIR}/LexParser.cpp)

set(Parse_SRCS
    Parse.cpp
    ${FLEX_Scanner_OUTPUTS} 
)

set(Parse_INCS
    Parse.hpp
)

add_executable(Parse ${Parse_INCS} ${Parse_SRCS})

target_include_directories(Parse PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_include_directories(Parse PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")

Проблема: Scannerцель никогда не называется.

Первые проверки:

  • Когда я вывожу FLEX_FOUND, FLEX_EXECUTABLE а также FLEX_LIBRARIES Я вижу, что модуль был правильно найден.
  • Я тестировал как Linux, так и Windows установки CMake и Flex. Но то же самое здесь и там.
  • Внутренняя пользовательская команда должна как минимум выводить сообщение типа "[FLEX] [Scanner] Building scanner with flex 2.5.4", подтверждающее выполнение пользовательской команды, но не выполненное. Тем не менее, у меня тоже нет ошибок.

Спасибо!

1 ответ

Решение

Функция flex_target несколько вводит в заблуждение, создает пользовательскую команду, а не пользовательскую цель.

Пользовательские команды (в отличие от пользовательских целей) не выполняются сами по себе, но должны быть связаны с целью (или другой пользовательской командой), которая потребляет свои выходные данные.

Вы делаете это, добавляя вывод flex_target, который записывается функцией в FLEX_Scanner_OUTPUTS переменная, как исходный файл для вашего Parse исполняемый файл. Это приведет к генерации файла при сборке этого исполняемого файла.

Однако обратите внимание, что пользовательские команды всегда выполняются во время сборки (например, при запуске make), а не при запуске CMake.

Другие вопросы по тегам