【问题标题】:CMake : Flex custom_command never calledCMake:从未调用过 Flex custom_command
【发布时间】:2015-09-03 10:12:37
【问题描述】:

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

See macro definition from Github Cmake project.

我的项目只包含在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_FOUNDFLEX_EXECUTABLEFLEX_LIBRARIES 时,我看到模块已正确找到。
  • 我已经在 Linux 和 Windows 安装的 CMake 和 Flex 上进行了测试。但这里和那里都一样。
  • 内部自定义命令至少应输出类似“[FLEX][Scanner] Buildingscanner with flex 2.5.4”的消息,证明自定义命令已执行,但未执行。我仍然没有错误。

谢谢!

【问题讨论】:

  • 自定义命令不会被调用,如果它的输出文件(${CMAKE_CURRENT_BINARY_DIR}/LexParser.cpp)已经存在,并且新的输入(Example.l)。检查您是否还没有输出文件。此外,您可以检查Parse_SRCS 变量的内容是否正确(只需使用message() 打印即可)。
  • 检查Parse_SRCS 值对应于${CMAKE_CURRENT_BINARY_DIR}/LexParser.cpp,这很好。是的,我已经检查过了,但没有输出文件阻止依赖项。

标签: c++ cmake lex


【解决方案1】:

flex_target 函数创建了一个 custom command 而不是 custom target

自定义命令(与自定义目标不同)不会自行执行,而是必须与消耗其输出的目标(或其他自定义命令)相关联。

您可以通过将flex_target 的输出添加到FLEX_Scanner_OUTPUTS 变量中,作为Parse 可执行文件的源文件。这将导致在构建该可执行文件时生成文件。

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

【讨论】:

  • FLEX_Scanner_OUTPUTSParse_SRCS 的一部分,这意味着将 Flex 输出设置为我的可执行文件的源文件。但是我已经通过 eplicitly 进行了测试,以防出现问题。不用找了。 确实,你说得对,它是构建系统的预构建过程,而不是 CMake。所以我必须运行'make'来创建文件。感觉很奇怪,我什至没有想到这一点......
  • 对不起,我错过了FLEX_Scanner_OUTPUTS。我会相应地调整答案。
猜你喜欢
  • 2019-06-15
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2017-08-27
相关资源
最近更新 更多