1 find_package(Java QUIET COMPONENTS Runtime)
3 if(NOT ANTLR_EXECUTABLE)
4 find_program(ANTLR_EXECUTABLE
5 NAMES antlr.jar antlr4.jar antlr-4.jar antlr-4.9.2-complete.jar)
8 if(ANTLR_EXECUTABLE AND Java_JAVA_EXECUTABLE)
10 COMMAND ${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE}
11 OUTPUT_VARIABLE ANTLR_COMMAND_OUTPUT
12 ERROR_VARIABLE ANTLR_COMMAND_ERROR
13 RESULT_VARIABLE ANTLR_COMMAND_RESULT
14 OUTPUT_STRIP_TRAILING_WHITESPACE)
16 if(ANTLR_COMMAND_RESULT EQUAL 0)
17 string(REGEX MATCH "Version [0-9]+(\\.[0-9])*" ANTLR_VERSION ${ANTLR_COMMAND_OUTPUT})
18 string(REPLACE "Version " "" ANTLR_VERSION ${ANTLR_VERSION})
22 "Command '${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE}' "
23 "failed with the output '${ANTLR_COMMAND_ERROR}'")
26 macro(ANTLR_TARGET Name InputFile)
27 set(ANTLR_OPTIONS LEXER PARSER LISTENER VISITOR)
28 set(ANTLR_ONE_VALUE_ARGS PACKAGE OUTPUT_DIRECTORY DEPENDS_ANTLR)
29 set(ANTLR_MULTI_VALUE_ARGS COMPILE_FLAGS DEPENDS)
30 cmake_parse_arguments(ANTLR_TARGET
32 "${ANTLR_ONE_VALUE_ARGS}"
33 "${ANTLR_MULTI_VALUE_ARGS}"
36 set(ANTLR_${Name}_INPUT ${InputFile})
38 get_filename_component(ANTLR_INPUT ${InputFile} NAME_WE)
40 if(ANTLR_TARGET_OUTPUT_DIRECTORY)
41 set(ANTLR_${Name}_OUTPUT_DIR ${ANTLR_TARGET_OUTPUT_DIRECTORY})
43 set(ANTLR_${Name}_OUTPUT_DIR
44 ${CMAKE_CURRENT_BINARY_DIR}/antlr4cpp_generated_src/${ANTLR_INPUT})
47 unset(ANTLR_${Name}_CXX_OUTPUTS)
49 if((ANTLR_TARGET_LEXER AND NOT ANTLR_TARGET_PARSER) OR
50 (ANTLR_TARGET_PARSER AND NOT ANTLR_TARGET_LEXER))
51 list(APPEND ANTLR_${Name}_CXX_OUTPUTS
52 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.h
53 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.cpp)
54 set(ANTLR_${Name}_OUTPUTS
55 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.interp
56 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.tokens)
58 list(APPEND ANTLR_${Name}_CXX_OUTPUTS
59 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.h
60 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.cpp
61 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Parser.h
62 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Parser.cpp)
63 list(APPEND ANTLR_${Name}_OUTPUTS
64 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.interp
65 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.tokens)
68 if(ANTLR_TARGET_LISTENER)
69 list(APPEND ANTLR_${Name}_CXX_OUTPUTS
70 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseListener.h
71 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseListener.cpp
72 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Listener.h
73 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Listener.cpp)
74 list(APPEND ANTLR_TARGET_COMPILE_FLAGS -listener)
77 if(ANTLR_TARGET_VISITOR)
78 list(APPEND ANTLR_${Name}_CXX_OUTPUTS
79 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseVisitor.h
80 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseVisitor.cpp
81 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Visitor.h
82 ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Visitor.cpp)
83 list(APPEND ANTLR_TARGET_COMPILE_FLAGS -visitor)
86 if(ANTLR_TARGET_PACKAGE)
87 list(APPEND ANTLR_TARGET_COMPILE_FLAGS -package ${ANTLR_TARGET_PACKAGE})
90 list(APPEND ANTLR_${Name}_OUTPUTS ${ANTLR_${Name}_CXX_OUTPUTS})
92 if(ANTLR_TARGET_DEPENDS_ANTLR)
93 if(ANTLR_${ANTLR_TARGET_DEPENDS_ANTLR}_INPUT)
94 list(APPEND ANTLR_TARGET_DEPENDS
95 ${ANTLR_${ANTLR_TARGET_DEPENDS_ANTLR}_INPUT})
96 list(APPEND ANTLR_TARGET_DEPENDS
97 ${ANTLR_${ANTLR_TARGET_DEPENDS_ANTLR}_OUTPUTS})
100 "ANTLR target '${ANTLR_TARGET_DEPENDS_ANTLR}' not found")
105 OUTPUT ${ANTLR_${Name}_OUTPUTS}
106 COMMAND ${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE}
108 -o ${ANTLR_${Name}_OUTPUT_DIR}
111 ${ANTLR_TARGET_COMPILE_FLAGS}
113 ${ANTLR_TARGET_DEPENDS}
114 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
115 COMMENT "Building ${Name} with ANTLR ${ANTLR_VERSION}")
116 endmacro(ANTLR_TARGET)
118 endif(ANTLR_EXECUTABLE AND Java_JAVA_EXECUTABLE)
120 include(FindPackageHandleStandardArgs)
121 find_package_handle_standard_args(
123 REQUIRED_VARS ANTLR_EXECUTABLE Java_JAVA_EXECUTABLE
124 VERSION_VAR ANTLR_VERSION)