CMake:Flex custom_command从未调用过

CMake : Flex custom_command never called

本文关键字:调用 command Flex custom CMake      更新时间:2023-10-16

我在C++项目中使用带有Flex的CMake时遇到了一些问题。我使用FindFlex和它的宏FLEX_TARGET,后者生成一个自定义命令,该命令简单地调用Flex可执行文件,从.l文件创建一个源文件。

请参阅Github Cmake项目中的宏定义。

我的项目只包含在CMakeLists.txtExample.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_FOUNDFLEX_EXECUTABLEFLEX_LIBRARIES时,我看到模块已正确找到
  • 我已经在Linux和Windows上测试了CMake和Flex的安装。但这里和那里都一样
  • 内部自定义命令至少应输出一条消息,如">[FLEX][Scanner]Building Scanner with FLEX 2.5.4",以证明自定义命令已执行,但未执行。不过我也没有错

谢谢!

函数flex_target创建了一个自定义命令,而不是一个自定义目标。

自定义命令(与自定义目标不同(不是自己执行的,而是必须与消耗其输出的目标(或另一个自定义命令(关联。

您可以通过将flex_target的输出(由函数写入FLEX_Scanner_OUTPUTS变量(作为源文件添加到Parse可执行文件中来完成此操作。这将导致在生成该可执行文件时生成该文件。

但是请注意,自定义命令总是在编译时执行(例如,运行make时(,而不是在运行CMake时执行。