]> gitweb.ps.run Git - toc/blob - antlr4-cpp-runtime-4.9.2-source/cmake/antlr4-generator.cmake.in
add antlr source code and ReadMe
[toc] / antlr4-cpp-runtime-4.9.2-source / cmake / antlr4-generator.cmake.in
1 set(ANTLR_VERSION @ANTLR_VERSION@)
2
3 @PACKAGE_INIT@
4
5 if (NOT ANTLR4_CPP_GENERATED_SRC_DIR)
6   set(ANTLR4_GENERATED_SRC_DIR ${CMAKE_BINARY_DIR}/antlr4_generated_src)
7 endif()
8
9 FIND_PACKAGE(Java COMPONENTS Runtime REQUIRED)
10
11 #
12 # The ANTLR generator will output the following files given the input file f.g4
13 #
14 # Input  -> f.g4
15 # Output -> f.h
16 #        -> f.cpp
17 #
18 # the following files will only be produced if there is a parser contained
19 # Flag -visitor active
20 # Output -> <f>BaseVisitor.h
21 #        -> <f>BaseVisitor.cpp
22 #        -> <f>Visitor.h
23 #        -> <f>Visitor.cpp
24 #
25 # Flag -listener active
26 # Output -> <f>BaseListener.h
27 #        -> <f>BaseListener.cpp
28 #        -> <f>Listener.h
29 #        -> <f>Listener.cpp
30 #
31 # See documentation in markup
32 #
33 function(antlr4_generate
34     Antlr4_ProjectTarget
35     Antlr4_InputFile
36     Antlr4_GeneratorType
37     )
38
39   set( Antlr4_GeneratedSrcDir ${ANTLR4_GENERATED_SRC_DIR}/${Antlr4_ProjectTarget} )
40
41   get_filename_component(Antlr4_InputFileBaseName ${Antlr4_InputFile} NAME_WE )
42
43   list( APPEND Antlr4_GeneratorStatusMessage "Common Include-, Source- and Tokenfiles" )
44
45   if ( ${Antlr4_GeneratorType} STREQUAL "LEXER")
46     set(Antlr4_LexerBaseName "${Antlr4_InputFileBaseName}")
47     set(Antlr4_ParserBaseName "")
48   else()
49     if ( ${Antlr4_GeneratorType} STREQUAL "PARSER")
50       set(Antlr4_LexerBaseName "")
51       set(Antlr4_ParserBaseName "${Antlr4_InputFileBaseName}")
52     else()
53       if ( ${Antlr4_GeneratorType} STREQUAL "BOTH")
54         set(Antlr4_LexerBaseName "${Antlr4_InputFileBaseName}Lexer")
55         set(Antlr4_ParserBaseName "${Antlr4_InputFileBaseName}Parser")
56       else()
57         message(FATAL_ERROR "The third parameter must be LEXER, PARSER or BOTH")
58       endif ()
59     endif ()
60   endif ()
61
62   # Prepare list of generated targets
63   list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}.tokens" )
64   list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}.interp" )
65   list( APPEND DependentTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}.tokens" )
66
67   if ( NOT ${Antlr4_LexerBaseName} STREQUAL "" )
68     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_LexerBaseName}.h" )
69     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_LexerBaseName}.cpp" )
70   endif ()
71
72   if ( NOT ${Antlr4_ParserBaseName} STREQUAL "" )
73     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_ParserBaseName}.h" )
74     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_ParserBaseName}.cpp" )
75   endif ()
76
77   # process optional arguments ...
78
79   if ( ( ARGC GREATER_EQUAL 4 ) AND ARGV3 )
80     set(Antlr4_BuildListenerOption "-listener")
81
82     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseListener.h" )
83     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseListener.cpp" )
84     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Listener.h" )
85     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Listener.cpp" )
86
87     list( APPEND Antlr4_GeneratorStatusMessage ", Listener Include- and Sourcefiles" )
88   else()
89     set(Antlr4_BuildListenerOption "-no-listener")
90   endif ()
91
92   if ( ( ARGC GREATER_EQUAL 5 ) AND ARGV4 )
93     set(Antlr4_BuildVisitorOption "-visitor")
94
95     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseVisitor.h" )
96     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseVisitor.cpp" )
97     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Visitor.h" )
98     list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Visitor.cpp" )
99
100     list( APPEND Antlr4_GeneratorStatusMessage ", Visitor Include- and Sourcefiles" )
101   else()
102     set(Antlr4_BuildVisitorOption "-no-visitor")
103   endif ()
104
105   if ( (ARGC GREATER_EQUAL 6 ) AND (NOT ${ARGV5} STREQUAL "") )
106     set(Antlr4_NamespaceOption "-package;${ARGV5}")
107
108     list( APPEND Antlr4_GeneratorStatusMessage " in Namespace ${ARGV5}" )
109   else()
110     set(Antlr4_NamespaceOption "")
111   endif ()
112
113   if ( (ARGC GREATER_EQUAL 7 ) AND (NOT ${ARGV6} STREQUAL "") )
114     set(Antlr4_AdditionalDependencies ${ARGV6})
115   else()
116     set(Antlr4_AdditionalDependencies "")
117   endif ()
118
119   if ( (ARGC GREATER_EQUAL 8 ) AND (NOT ${ARGV7} STREQUAL "") )
120     set(Antlr4_LibOption "-lib;${ARGV7}")
121
122     list( APPEND Antlr4_GeneratorStatusMessage " using Library ${ARGV7}" )
123   else()
124     set(Antlr4_LibOption "")
125   endif ()
126
127   if(NOT Java_FOUND)
128     message(FATAL_ERROR "Java is required to process grammar or lexer files! - Use 'FIND_PACKAGE(Java COMPONENTS Runtime REQUIRED)'")
129   endif()
130
131   if(NOT EXISTS "${ANTLR4_JAR_LOCATION}")
132     message(FATAL_ERROR "Unable to find antlr tool. ANTLR4_JAR_LOCATION:${ANTLR4_JAR_LOCATION}")
133   endif()
134
135   # The call to generate the files
136   add_custom_command(
137     OUTPUT ${Antlr4_GeneratedTargets}
138     # Remove target directory
139     COMMAND
140     ${CMAKE_COMMAND} -E remove_directory ${Antlr4_GeneratedSrcDir}
141     # Create target directory
142     COMMAND
143     ${CMAKE_COMMAND} -E make_directory ${Antlr4_GeneratedSrcDir}
144     COMMAND
145     # Generate files
146     "${Java_JAVA_EXECUTABLE}" -jar "${ANTLR4_JAR_LOCATION}" -Werror -Dlanguage=Cpp ${Antlr4_BuildListenerOption} ${Antlr4_BuildVisitorOption} ${Antlr4_LibOption} ${ANTLR4_GENERATED_OPTIONS} -o "${Antlr4_GeneratedSrcDir}" ${Antlr4_NamespaceOption} "${Antlr4_InputFile}"
147     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
148     MAIN_DEPENDENCY "${Antlr4_InputFile}"
149     DEPENDS ${Antlr4_AdditionalDependencies}
150     )
151
152   # set output variables in parent scope
153   set( ANTLR4_INCLUDE_DIR_${Antlr4_ProjectTarget} ${Antlr4_GeneratedSrcDir} PARENT_SCOPE)
154   set( ANTLR4_SRC_FILES_${Antlr4_ProjectTarget} ${Antlr4_GeneratedTargets} PARENT_SCOPE)
155   set( ANTLR4_TOKEN_FILES_${Antlr4_ProjectTarget} ${DependentTargets} PARENT_SCOPE)
156   set( ANTLR4_TOKEN_DIRECTORY_${Antlr4_ProjectTarget} ${Antlr4_GeneratedSrcDir} PARENT_SCOPE)
157
158   # export generated cpp files into list
159   foreach(generated_file ${Antlr4_GeneratedTargets})
160
161     if (NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
162       set_source_files_properties(
163         ${generated_file}
164         PROPERTIES
165         COMPILE_FLAGS -Wno-overloaded-virtual
166         )
167     endif ()
168
169     if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
170       set_source_files_properties(
171         ${generated_file}
172         PROPERTIES
173         COMPILE_FLAGS -wd4251
174         )
175     endif ()
176
177   endforeach(generated_file)
178
179 message(STATUS "Antlr4 ${Antlr4_ProjectTarget} - Building " ${Antlr4_GeneratorStatusMessage} )
180
181 endfunction()