CMake命令语法问题

9
我需要一个CMAKE宏的语法,可以从类似lex/yacc的工具生成.cc和.h文件。
请问有人能为以下假设情况提供语法示例吗:假设我有一个依赖于x.cc和x.h的y.cc文件,这两个文件是由z_tool工具从x.z文件生成的。这个语法应该怎么写?
对于这个例子,假设y.cc将被转换为静态库,并且由于我对CMAKE还比较陌生,所以完整的CMakellist.txt文件对这个虚构的例子非常有帮助。我正在寻找一个可移植的解决方案,因为我使用的工具在Windows和UNIX变体上都可用。
3个回答

16

与其为您提供一个人造的例子的答案,这里是使用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})

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

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


讲解得很清楚。要点确实是如何连接输出和输入:D - Hassan Syed
为了后代:在cmake文件中也要包含类似于target_link_libraries(Foo ${FLEX_LIBRARIES} ${BISON_LIBRARIES}的内容。 - cheshirekow

1

以下一行有拼写错误

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

BIANRY 应该拼写为BINARY

注意:CMake文档中也有这个错别字。(在2.8.0中,这已经在2.8.10文档中得到修正)。


1

/* 为了在我的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})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接