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命令
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(
)
#添加一个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(
#上面是执行bison命令,需要注意的是OUTPUTS一定要和${GEN_SOURCES}中文件一致,并且target设置对
#否则无法确保执行顺序
ADD_CUSTOM_COMMAND(
#上面是执行flex命令,其他同bison
add_library(driver SHARED
#这里将flex和bison生成的.c文件编译到程序的动态库中,需要注意指定路径
#${CMAKE_CURRENT_BINARY_DIR}
ADD_DEPENDENCIES(driver GenServerSource)
#指明动态库driver所需要的依赖,所以可以保证cmake会先生成GenServerSource, 而GenServerSource又
#依赖${GEN_SOURCES}指明的文件, 而这些文件又是由两个ADD_CUSTOM_COMMAND命令来生成的
#(outputs中给出的),所以会先执行两个ADD_CUSTOM_COMMAND命令
转载请注明转自高孝鑫的博客