【问题标题】:cmake command syntax questioncmake命令语法问题
【发布时间】:2023-09-16 20:58:01
【问题描述】:

我需要 CMAKE 宏的语法,该宏从 lex/yacc 等工具生成 .cc 和 .h 文件。

谁能告诉我以下人为示例的语法:

假设我有一个依赖于 x.cc 和 x.h 的文件 y.cc,提到的两个文件是由工具 z_tool 从文件 x.z 生成的。这个的语法是什么?

对于此示例,假设 y.cc 将被转换为静态库,并且由于我对 CMAKE 还很陌生,因此此人为示例的完整 CMakellist.txt 将非常有帮助。我正在寻找一个可移植的解决方案我使用的工具可用于 Windows 以及 UNIX 变体。

【问题讨论】:

    标签: build-process macros compilation cmake portability


    【解决方案1】:

    这里不是给你一个人为的例子的答案,而是使用flexbison生成可执行文件的方法

    find_package(BISON)
    find_package(FLEX)
    
    BISON_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cc)
    FLEX_TARGET(MyScanner lexer.l  ${CMAKE_CURRENT_BINARY_DIR}/lexer.cc)
    ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)
    
    include_directories(${CMAKE_CURRENT_BINARY_DIR})
    add_executable(Foo
      Foo.cc
      ${BISON_MyParser_OUTPUTS}
      ${FLEX_MyScanner_OUTPUTS})
    target_link_libraries(Foo ${FLEX_LIBRARIES} ${BISON_LIBRARIES})
    

    bison/flex 的 CMake 查找包包含在默认安装中,因此这是跨平台的。

    通常,要创建稍后用作输入的输出,您可以使用add_custom_command 函数。如果您使用自定义命令的输出作为库或可执行文件的输入,则 CMake 知道在编译库/可执行目标的源代码之前运行您的自定义命令。

    【讨论】:

    • 很好解释。要点确实是如何连接输出和输入:D
    • 为了后代:在 cmake 文件中也包含类似target_link_libraries(Foo ${FLEX_LIBRARIES} ${BISON_LIBRARIES} 的内容。
    【解决方案2】:

    以下行有错字

    FLEX_TARGET(MyScanner lexer.l  ${CMAKE_CURRENT_BIANRY_DIR}/lexer.cc)
    

    BIANRY 应拼写为 BINARY

    注意:CMake 文档也有这个错字。 (在 2.8.0 中,这已在 2.8.10 文档中修复)..

    【讨论】:

      【解决方案3】:

      /* 让它在我的 Mac 上和 Lion 一起工作。我将文件名更改为 y.tab.c 和 lex.yy.c,如果您从命令行运行 lex lex.l 和 yacc -D yacc.y,它们就是输出文件。见下文。 */

      cmake_minimum_required(VERSION 2.8)
      project (LexYacc)
      
      find_package(BISON)
      find_package(FLEX)
      
      BISON_TARGET(MyParser yacc.y ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c) 
      FLEX_TARGET(MyScanner lex.l  ${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c)
      ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)
      
      include_directories(${CMAKE_CURRENT_BINARY_DIR})
      add_executable(LexYacc
        ${BISON_MyParser_OUTPUTS}
        ${FLEX_MyScanner_OUTPUTS})
      target_link_libraries(LexYacc ${FLEX_LIBRARIES} ${BISON_LIBRARIES})
      

      【讨论】: