2010-03-22 75 views
8

我需要使用像lex/yacc这样的工具生成.cc和.h文件的宏的CMAKE的语法。cmake命令语法问题

可能有人请告诉我以下人为的例子语法:

说我有这取决于x.cc和x.h文件y.cc,提到的两个文件是由工具z_tool从文件x.z.产生这是什么语法?

对于这个例子,假设y.cc将变成一个静态库,并且由于我对CMAKE相当陌生,这个人为的例子的完整CMakellist.txt将非常有帮助。我正在寻找一种便携式解决方案因为我使用的工具可以在Windows以及UNIX变体上使用。

回答

15

而不是给你的答案,一个人为的例子,这里是你会产生使用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的寻找野牛包的方式/柔性包括在默认安装,所以这是跨平台的。

一般来说,要创建一个稍后将用作输入的输出,您可以使用add_custom_command函数。如果您使用自定义命令的输出作为库或可执行文件的输入,那么CMake会知道在编译库/可执行文件目标的源文件之前运行自定义命令。

+0

很好解释。其要点确实是如何连接输出和输入:D – 2010-03-22 13:06:03

+0

后人:在cmake文件中还包含诸如“target_link_libraries(Foo $ {FLEX_LIBRARIES} $ {BISON_LIBRARIES}”之类的东西。 – cheshirekow 2012-08-13 15:54:27

1

下面的行具有错字

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

BIANRY应拼写为BINARY

注意:CMake Documentation也有这个错字。 (在2.8.0中,这是固定在2.8.10文档)..

1

/*使它在我的Mac与狮子工作。如果从命令行运行lex lex.l和yacc -D yacc.y,我将文件名更改为y.tab.c和lex.yy.c,它们是输出文件。见下文。 */

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})