Brian Waters | 13d9601 | 2017-12-08 16:53:31 -0600 | [diff] [blame] | 1 | # - 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 | |
| 14 | IF(NOT DEFINED BISON_PREFIX_OUTPUTS) |
| 15 | SET(BISON_PREFIX_OUTPUTS FALSE) |
| 16 | ENDIF(NOT DEFINED BISON_PREFIX_OUTPUTS) |
| 17 | |
| 18 | IF(NOT DEFINED BISON_GENERATE_DEFINES) |
| 19 | SET(BISON_GENERATE_DEFINES FALSE) |
| 20 | ENDIF(NOT DEFINED BISON_GENERATE_DEFINES) |
| 21 | |
| 22 | IF(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) |
| 29 | ENDIF(NOT BISON_EXECUTABLE) |
| 30 | |
| 31 | IF(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) |
| 72 | ENDIF(BISON_EXECUTABLE) |