blob: 9257545143e02756c6ae19144f97c6043b1c010d [file] [log] [blame]
Brian Waters13d96012017-12-08 16:53:31 -06001# - Look for GNU Bison, the parser generator
2# Based off a news post from Andy Cedilnik at Kitware
3# Defines the following:
4# BISON_EXECUTABLE - path to the bison executable
5# BISON_FILE - parse a file with bison
6# BISON_PREFIX_OUTPUTS - Set to true to make BISON_FILE produce prefixed
7# symbols in the generated output based on filename.
8# So for ${filename}.y, you'll get ${filename}parse(), etc.
9# instead of yyparse().
10# BISON_GENERATE_DEFINES - Set to true to make BISON_FILE output the matching
11# .h file for a .c file. You want this if you're using
12# flex.
13
14IF(NOT DEFINED BISON_PREFIX_OUTPUTS)
15 SET(BISON_PREFIX_OUTPUTS FALSE)
16ENDIF(NOT DEFINED BISON_PREFIX_OUTPUTS)
17
18IF(NOT DEFINED BISON_GENERATE_DEFINES)
19 SET(BISON_GENERATE_DEFINES FALSE)
20ENDIF(NOT DEFINED BISON_GENERATE_DEFINES)
21
22IF(NOT BISON_EXECUTABLE)
23 MESSAGE(STATUS "Looking for bison")
24 FIND_PROGRAM(BISON_EXECUTABLE bison)
25 IF(BISON_EXECUTABLE)
26 MESSAGE(STATUS "Looking for bison -- ${BISON_EXECUTABLE}")
27 ENDIF(BISON_EXECUTABLE)
28 MARK_AS_ADVANCED(BISON_EXECUTABLE)
29ENDIF(NOT BISON_EXECUTABLE)
30
31IF(BISON_EXECUTABLE)
32 MACRO(BISON_FILE FILENAME)
33 GET_FILENAME_COMPONENT(PATH "${FILENAME}" PATH)
34 IF("${PATH}" STREQUAL "")
35 SET(PATH_OPT "")
36 ELSE("${PATH}" STREQUAL "")
37 SET(PATH_OPT "/${PATH}")
38 ENDIF("${PATH}" STREQUAL "")
39 GET_FILENAME_COMPONENT(HEAD "${FILENAME}" NAME_WE)
40 IF(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}${PATH_OPT}")
41 FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}${PATH_OPT}")
42 ENDIF(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}${PATH_OPT}")
43 IF(BISON_PREFIX_OUTPUTS)
44 SET(PREFIX "${HEAD}")
45 ELSE(BISON_PREFIX_OUTPUTS)
46 SET(PREFIX "yy")
47 ENDIF(BISON_PREFIX_OUTPUTS)
48 SET(OUTFILE "${CMAKE_CURRENT_BINARY_DIR}${PATH_OPT}/${HEAD}.tab.c")
49 IF(BISON_GENERATE_DEFINES)
50 SET(HEADER "${CMAKE_CURRENT_BINARY_DIR}${PATH_OPT}/${HEAD}.tab.h")
51 ADD_CUSTOM_COMMAND(
52 OUTPUT "${OUTFILE}" "${HEADER}"
53 COMMAND "${BISON_EXECUTABLE}"
54 ARGS "--name-prefix=${PREFIX}"
55 "--defines"
56 "--output-file=${OUTFILE}"
57 "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}"
58 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}")
59 SET_SOURCE_FILES_PROPERTIES("${OUTFILE}" "${HEADER}" PROPERTIES GENERATED TRUE)
60 SET_SOURCE_FILES_PROPERTIES("${HEADER}" PROPERTIES HEADER_FILE_ONLY TRUE)
61 ELSE(BISON_GENERATE_DEFINES)
62 ADD_CUSTOM_COMMAND(
63 OUTPUT "${OUTFILE}"
64 COMMAND "${BISON_EXECUTABLE}"
65 ARGS "--name-prefix=${PREFIX}"
66 "--output-file=${OUTFILE}"
67 "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}"
68 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}")
69 SET_SOURCE_FILES_PROPERTIES("${OUTFILE}" PROPERTIES GENERATED TRUE)
70 ENDIF(BISON_GENERATE_DEFINES)
71 ENDMACRO(BISON_FILE)
72ENDIF(BISON_EXECUTABLE)