CMake:Flex custom_command 从未调用过
CMake : Flex custom_command never called
我在 C++ 项目中将 CMake 与 Flex 结合使用时遇到一些问题。
我使用 FindFlex
及其宏 FLEX_TARGET
生成一个自定义命令,该命令简单地调用 Flex 可执行文件以从 .l
文件创建源文件。
See macro definition from Github Cmake project.
我的项目只包含 CMakeLists.txt
和我的 Example.l
LEX 文件。还有一对文件,Parser.hpp/Parser.cpp,目前只包含一个"I do nothing" class(构造函数,析构函数,仅此而已):
这是 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”,证明自定义命令已执行,但不会.我也没有错误。
谢谢!
函数flex_target
, somewhat misleadingly, creates a custom command and not a custom target.
自定义命令(与自定义目标不同)不会自行执行,而是必须与使用其输出的目标(或其他自定义命令)相关联。
您可以通过将 flex_target
的输出添加到 FLEX_Scanner_OUTPUTS
变量,作为源文件添加到 Parse
可执行文件。这将导致在构建可执行文件时生成文件。
但是请注意,自定义命令总是在构建时执行(例如,当运行 make
),而不是运行 CMake .
我在 C++ 项目中将 CMake 与 Flex 结合使用时遇到一些问题。
我使用 FindFlex
及其宏 FLEX_TARGET
生成一个自定义命令,该命令简单地调用 Flex 可执行文件以从 .l
文件创建源文件。
See macro definition from Github Cmake project.
我的项目只包含 CMakeLists.txt
和我的 Example.l
LEX 文件。还有一对文件,Parser.hpp/Parser.cpp,目前只包含一个"I do nothing" class(构造函数,析构函数,仅此而已):
这是 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”,证明自定义命令已执行,但不会.我也没有错误。
谢谢!
函数flex_target
, somewhat misleadingly, creates a custom command and not a custom target.
自定义命令(与自定义目标不同)不会自行执行,而是必须与使用其输出的目标(或其他自定义命令)相关联。
您可以通过将 flex_target
的输出添加到 FLEX_Scanner_OUTPUTS
变量,作为源文件添加到 Parse
可执行文件。这将导致在构建可执行文件时生成文件。
但是请注意,自定义命令总是在构建时执行(例如,当运行 make
),而不是运行 CMake .