如何为 flex 和 bison 编写工作 cmake 文件?

2023-12-03

我正在编写一个小型解析器,但在使用 cmake 时遇到问题。

我的目的是:flex F.l => F.cc,bison B.y => B.cc, my_program.cc + F.cc + B.cc => 库

我的第一次尝试:

FIND_PACKAGE(FLEX REQUIRED)
if (FLEX_FOUND)
    ADD_CUSTOM_TARGET(
        flex_target
        COMMAND ${FLEX_EXECUTABLE} 
            --header-file=${CMAKE_CURRENT_SOURCE_DIR}/F.h
            --outfile=${CMAKE_CURRENT_SOURCE_DIR}/F.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/F.l
        COMMENT "Generating F.cc"
    )
endif(FLEX_FOUND)
FIND_PACKAGE(BISON REQUIRED)
if (BISON_FOUND)
    ADD_CUSTOM_TARGET(
        bison_target
        COMMAND ${BISON_EXECUTABLE} 
            --defines=${CMAKE_CURRENT_SOURCE_DIR}/B.h
            --output=${CMAKE_CURRENT_SOURCE_DIR}/B.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/B.y
        COMMENT "Generating B.cc"
    )
endif(BISON_FOUND)

add_library(my_library my_program.cc F.cc B.cc)
add_dependencies(my_library bison_target)
add_dependencies(my_library flex_target)

一切都很好,除了每次运行 make 时都会调用 flex 和 bison 命令,甚至 F.l 和 B.y 文件都没有更改。

然后我尝试切换为使用 ADD_CUSTOM_COMMAND 而不是 ADD_CUSTOM_TARGET。

FIND_PACKAGE(FLEX REQUIRED)
if (FLEX_FOUND)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/F.cc
        SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/F.l
        COMMAND ${FLEX_EXECUTABLE} 
            --header-file=${CMAKE_CURRENT_SOURCE_DIR}/F.h
            --outfile=${CMAKE_CURRENT_SOURCE_DIR}/F.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/F.l
        COMMENT "Generating F.cc"
    )
endif(FLEX_FOUND)
FIND_PACKAGE(BISON REQUIRED)
if (BISON_FOUND)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/B.cc
        SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/B.y
        COMMAND ${BISON_EXECUTABLE} 
            --defines=${CMAKE_CURRENT_SOURCE_DIR}/B.h
            --output=${CMAKE_CURRENT_SOURCE_DIR}/B.cc
            ${CMAKE_CURRENT_SOURCE_DIR}/B.y
        COMMENT "Generating B.cc"
    )
endif(BISON_FOUND)

add_library(my_library my_program.cc F.cc B.cc)

请注意,我似乎无法添加 ADD_CUSTOM_COMMAND 的依赖项。

然后,当我运行 make 时,flex & bison 似乎只会运行一次。即使 .l 和 .y 文件更改,它也不会第二次运行。

有办法实现我的目标吗?

Thanks.


CMake 有两个模块Flex and Bison,所以你可以这样做:

find_package(FLEX REQUIRED)
find_package(BISON REQUIRED)

flex_target(lexer F.l "${CMAKE_CURRENT_BINARY_DIR}/F.cc")

bison_target(parser B.y "${CMAKE_CURRENT_BINARY_DIR}/B.cc")

add_library(my_library STATIC
    ${sources}
    "${CMAKE_CURRENT_BINARY_DIR}/F.cc"
    "${CMAKE_CURRENT_BINARY_DIR}/B.cc"
)

请注意,两者flex_target and bison_target use add_custom_command内部。

Edit:为了完整起见,正如 @vre 在评论中指出的那样,有FindFLEX提供add_flex_bison_dependency命令:

add_flex_bison_dependency(lexer parser)

这使得lexer取决于parser,以允许前者使用后者的令牌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 flex 和 bison 编写工作 cmake 文件? 的相关文章

随机推荐

  • MongoDB 中的 findAndModify 和 update 有什么区别?

    我有点困惑findAndModifyMongoDB 中的方法 相对于它有什么优势update方法 对我来说 它似乎只是先返回项目 然后更新它 但为什么我需要先退货呢 我读了MongoDB 权威指南它说它对于操作队列和执行其他需要获取和设置风
  • 如何在颤动中从图库中检索图像[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在尝试在 Flutter 中制作一个图像选择器 我可以从图库中选择图像 我不知道图像选择器的一些内置代码或库 我知道我可能有点晚了 但你可以使用这个库 它返回图库以及当前正在
  • ASP.NET Core 中的目录服务和帐户管理问题

    我有一个 ASP NET Core API 项目 我想利用 DirectoryServices 和 DirectoryServices AccountManagement 命名空间 经过一番研究 我想我找到了一些可以使用的 project
  • Spring boot spring.batch.job.enabled=false 无法识别

    I tried spring batch job enabled false在 application properties 和 Dspring batch job enabled false运行 jar 文件时 However Enabl
  • 指定的填充模式对此算法无效 - .net Core

    当我从 net 4 5 转换为 net core 2 时 收到以下错误消息 代码完全相同 我看过一些帖子 但没有一个能解决这个错误 我正在使用 RijndaelManaged 加密 Specified padding mode is not
  • 实现Unity Singleton的最佳方式?

    我是 Unity 的初学者 我目前正在实施单例 我在学习的过程中有疑问 像标题一样在Unity中实现Singleton的最佳方式是什么 我明白为什么要使用单例 那是 创建一个对象一次 并在需要时使用它 我理解正确吗 实现单例的方法有很多种
  • 如何在react中动态添加类?

    在简单的井字游戏中 当有人获胜时 突出显示导致获胜的三个方块 p class codepen See the Pen a href https codepen io akshgods pen PQyERJ Simple tic tac ga
  • 以编程方式修剪 mp3 文件

    嘿 我需要在我的应用程序中修剪 剪切 编辑音频文件 我尝试使用 ffmpeg 但我不知道如何安装这个库或者如何使用它 所以 有人能给我一个好的建议吗 指南如何将 ffmpeg 2 3 与 android ndk r10 for window
  • SendKeys.SendWait 在 Windows 7 中不发送“{ENTER}”

    我已经在带有 XP 和 Windows 7 的 Visual Studio 2008 中尝试过此操作 SendKeys SendWait sometext ENTER ENTER 这用于在打开文件对话框中打开文件 它可以在带有 VS2008
  • GLSL:iPhone 应用程序无法访问内置属性?

    我在这里真的很绝望 我使用 Xcode 尝试在 iPhone 上实现一些 OpenGL 的东西 我必须为 Phong Lighting 编写一个着色器 我声明了我的几何体 顶点 索引 计算等 并将相应的参数作为属性传递给着色器 用 GLSL
  • 适用于 Android 的 Firebase 浅查询参数

    根据以下链接 Firebase 查询有一个可用的浅选项 Firebase 中的浅查询 Android 也支持吗 所有 Firebase SDK 都不支持对数据库进行浅层查询 它们都检索整个节点 唯一支持浅层查询的 Firebase 数据库
  • MySQL INSERT IF(自定义 if 语句)

    首先 这是问题的简洁摘要 是否可以运行INSERT有条件的陈述 与此类似的东西 IF expression INSERT 现在 我知道我可以使用存储过程来做到这一点 我的问题是 我可以在查询中执行此操作吗 现在 我为什么要这么做 假设我们有
  • 无法在 Google Slides API 上使用 PageSize 创建演示文稿

    我正在尝试创建新的 4 3 演示文稿 而不是 16 9 我阅读了此参考文献并编写了一些 ruby 代码 但它不起作用 新演示文稿的高度与我指定的高度不同 方法 presentations create 幻灯片 API谷歌开发者 foo rb
  • Java5 -XX:MaxHeapFreeRatio=45 即使超过 45% 的堆空闲也不会释放堆

    我有一个带有以下参数的 java 应用程序 但即使总可用空间大于 45 可以通过可视化 VM 查看 堆也不会被回收 JVM 是否有任何原因不释放该堆空间 相同的设置在 Java6 中按预期工作 运行Java5运行时和编译时 java jar
  • 如何使用sql从日期字段按月分组

    如何仅按日期字段中的月份进行分组 而不是按天分组 这是我的日期字段的样子 2012 05 01 这是我当前的 SQL select Closing Date Category COUNT Status TotalCount from MyT
  • Alfresco Workflow 表单中的多个受让人控件

    我需要构建一个工作流程 允许管理员在工作流程的第一个任务中从两个不同的组中选择两个受让人 我可以在一种表单中使用两个受让人控件吗 如何 你需要 在任务内容模型中 将 2 个受让人定义为任务类型的 2 个独立关联
  • Twitter 的 Bootstrap 3 在同一页面上有多个导航栏

    同一页面下拉菜单上的多个导航栏将与其他导航栏重叠 请参阅 如何防止这种情况发生 尽管导航栏仅供单一使用 但您可以自由地将更多导航栏用作每页一个导航栏 同一页面上的多个导航栏将具有相同的 z index 1000 因此下拉菜单可能会重叠 当使
  • Python 字符串 - 字符串的不变性

    我想知道如果 Python 字符串是不可变的 那么这段代码为何有效以及它是如何工作的 a input for i in a if i isupper print i lower end else print i upper end 这会更改
  • 获取用户图片

    操作系统 Win7x64 2008 2008r2 郎 德尔福Xe2 如何接收图像 用户帐户图片 的完整路径 和文件名 如何设置新图片 delphi 上的例子请 需要 函数 GetCurrentUser 图片 字符串 函数 GetUserPi
  • 如何为 flex 和 bison 编写工作 cmake 文件?

    我正在编写一个小型解析器 但在使用 cmake 时遇到问题 我的目的是 flex F l gt F cc bison B y gt B cc my program cc F cc B cc gt 库 我的第一次尝试 FIND PACKAGE