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.