您的位置:首页 > 其它

用cmake 编译 bison和flex

2015-01-18 20:17 274 查看
DBScale是用cmake来编译的,所以往里面添加bison和flex编写的解析器的时候需要修改对应的CMakeList.txt文件。

include_directories(. ${CMAKE_CURRENT_BINARY_DIR} )

#首先是在include_directories中添加${CMAKE_CURRENT_BINARY_DIR}。
因为执行flex和bison后生成的.c和.h

#文件是生成在${CMAKE_CURRENT_BINARY_DIR}中。

SET(PARSER_DIR ${CMAKE_SOURCE_DIR}/driver/mysql)

ADD_CUSTOM_TARGET(

GenServerSource

DEPENDS ${GEN_SOURCES}

)

#添加一个custom_target用于构建依赖。该target依赖${GEN_SOURCES}指向的文件

SET(GEN_SOURCES

${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c

${CMAKE_CURRENT_BINARY_DIR}/parser.tab.c

${CMAKE_CURRENT_BINARY_DIR}/parser.tab.h

${CMAKE_CURRENT_BINARY_DIR}/parser.l.h

)

#定义${GEN_SOURCES}变量为flex和bison要生成的文件。

SET_SOURCE_FILES_PROPERTIES(${GEN_SOURCES} GENERATED)

#告知cmake ${GEN_SOURCES}指向的文件是编译过程中生成的,以避免执行cmake命令的时候报文件找不到

ADD_CUSTOM_COMMAND(

SOURCE
${PARSER_DIR}/parser.y

COMMAND bison -d
${PARSER_DIR}/parser.y

TARGET GenServerSource

OUTPUTS
${CMAKE_CURRENT_BINARY_DIR}/parser.tab.c
${CMAKE_CURRENT_BINARY_DIR}/parser.tab.h

WORKING_DIRECTORY
${PARSER_DIR})

#上面是执行bison命令,需要注意的是OUTPUTS一定要和${GEN_SOURCES}中文件一致,并且target设置对

#否则无法确保执行顺序

ADD_CUSTOM_COMMAND(

SOURCE
${PARSER_DIR}/parser.l

COMMAND flex
${PARSER_DIR}/parser.l

TARGET GenServerSource

OUTPUTS
${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c
${CMAKE_CURRENT_BINARY_DIR}/parser.l.h

WORKING_DIRECTORY
${PARSER_DIR})

#上面是执行flex命令,其他同bison

add_library(driver SHARED

sourcefile1.cc sourcefile2.cc
sourcefile3.cc

${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c

${CMAKE_CURRENT_BINARY_DIR}/parser.tab.c)

#这里将flex和bison生成的.c文件编译到程序的动态库中,需要注意指定路径

#${CMAKE_CURRENT_BINARY_DIR}

ADD_DEPENDENCIES(driver GenServerSource)

#指明动态库driver所需要的依赖,所以可以保证cmake会先生成GenServerSource,
而GenServerSource又

#依赖${GEN_SOURCES}指明的文件, 而这些文件又是由两个ADD_CUSTOM_COMMAND命令来生成的

#(outputs中给出的),所以会先执行两个ADD_CUSTOM_COMMAND命令

转载请注明转自高孝鑫的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: