]> gitweb.ps.run Git - toc/blob - antlr4-cpp-runtime-4.9.2-source/cmake/FindANTLR.cmake
add antlr source code and ReadMe
[toc] / antlr4-cpp-runtime-4.9.2-source / cmake / FindANTLR.cmake
1 find_package(Java QUIET COMPONENTS Runtime)
2
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)
6 endif()
7
8 if(ANTLR_EXECUTABLE AND Java_JAVA_EXECUTABLE)
9   execute_process(
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)
15
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})
19   else()
20     message(
21         SEND_ERROR
22         "Command '${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE}' "
23         "failed with the output '${ANTLR_COMMAND_ERROR}'")
24   endif()
25
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
31                           "${ANTLR_OPTIONS}"
32                           "${ANTLR_ONE_VALUE_ARGS}"
33                           "${ANTLR_MULTI_VALUE_ARGS}"
34                           ${ARGN})
35
36     set(ANTLR_${Name}_INPUT ${InputFile})
37
38     get_filename_component(ANTLR_INPUT ${InputFile} NAME_WE)
39
40     if(ANTLR_TARGET_OUTPUT_DIRECTORY)
41       set(ANTLR_${Name}_OUTPUT_DIR ${ANTLR_TARGET_OUTPUT_DIRECTORY})
42     else()
43       set(ANTLR_${Name}_OUTPUT_DIR
44           ${CMAKE_CURRENT_BINARY_DIR}/antlr4cpp_generated_src/${ANTLR_INPUT})
45     endif()
46
47     unset(ANTLR_${Name}_CXX_OUTPUTS)
48
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)
57     else()
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)
66     endif()
67
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)
75     endif()
76
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)
84     endif()
85
86     if(ANTLR_TARGET_PACKAGE)
87       list(APPEND ANTLR_TARGET_COMPILE_FLAGS -package ${ANTLR_TARGET_PACKAGE})
88     endif()
89
90     list(APPEND ANTLR_${Name}_OUTPUTS ${ANTLR_${Name}_CXX_OUTPUTS})
91
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})
98       else()
99         message(SEND_ERROR
100                 "ANTLR target '${ANTLR_TARGET_DEPENDS_ANTLR}' not found")
101       endif()
102     endif()
103
104     add_custom_command(
105         OUTPUT ${ANTLR_${Name}_OUTPUTS}
106         COMMAND ${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE}
107                 ${InputFile}
108                 -o ${ANTLR_${Name}_OUTPUT_DIR}
109                 -no-listener
110                 -Dlanguage=Cpp
111                 ${ANTLR_TARGET_COMPILE_FLAGS}
112         DEPENDS ${InputFile}
113                 ${ANTLR_TARGET_DEPENDS}
114         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
115         COMMENT "Building ${Name} with ANTLR ${ANTLR_VERSION}")
116   endmacro(ANTLR_TARGET)
117
118 endif(ANTLR_EXECUTABLE AND Java_JAVA_EXECUTABLE)
119
120 include(FindPackageHandleStandardArgs)
121 find_package_handle_standard_args(
122     ANTLR
123     REQUIRED_VARS ANTLR_EXECUTABLE Java_JAVA_EXECUTABLE
124     VERSION_VAR ANTLR_VERSION)