1 set(ANTLR_VERSION @ANTLR_VERSION@)
5 if (NOT ANTLR4_CPP_GENERATED_SRC_DIR)
6 set(ANTLR4_GENERATED_SRC_DIR ${CMAKE_BINARY_DIR}/antlr4_generated_src)
9 FIND_PACKAGE(Java COMPONENTS Runtime REQUIRED)
12 # The ANTLR generator will output the following files given the input file f.g4
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
25 # Flag -listener active
26 # Output -> <f>BaseListener.h
27 # -> <f>BaseListener.cpp
31 # See documentation in markup
33 function(antlr4_generate
39 set( Antlr4_GeneratedSrcDir ${ANTLR4_GENERATED_SRC_DIR}/${Antlr4_ProjectTarget} )
41 get_filename_component(Antlr4_InputFileBaseName ${Antlr4_InputFile} NAME_WE )
43 list( APPEND Antlr4_GeneratorStatusMessage "Common Include-, Source- and Tokenfiles" )
45 if ( ${Antlr4_GeneratorType} STREQUAL "LEXER")
46 set(Antlr4_LexerBaseName "${Antlr4_InputFileBaseName}")
47 set(Antlr4_ParserBaseName "")
49 if ( ${Antlr4_GeneratorType} STREQUAL "PARSER")
50 set(Antlr4_LexerBaseName "")
51 set(Antlr4_ParserBaseName "${Antlr4_InputFileBaseName}")
53 if ( ${Antlr4_GeneratorType} STREQUAL "BOTH")
54 set(Antlr4_LexerBaseName "${Antlr4_InputFileBaseName}Lexer")
55 set(Antlr4_ParserBaseName "${Antlr4_InputFileBaseName}Parser")
57 message(FATAL_ERROR "The third parameter must be LEXER, PARSER or BOTH")
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" )
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" )
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" )
77 # process optional arguments ...
79 if ( ( ARGC GREATER_EQUAL 4 ) AND ARGV3 )
80 set(Antlr4_BuildListenerOption "-listener")
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" )
87 list( APPEND Antlr4_GeneratorStatusMessage ", Listener Include- and Sourcefiles" )
89 set(Antlr4_BuildListenerOption "-no-listener")
92 if ( ( ARGC GREATER_EQUAL 5 ) AND ARGV4 )
93 set(Antlr4_BuildVisitorOption "-visitor")
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" )
100 list( APPEND Antlr4_GeneratorStatusMessage ", Visitor Include- and Sourcefiles" )
102 set(Antlr4_BuildVisitorOption "-no-visitor")
105 if ( (ARGC GREATER_EQUAL 6 ) AND (NOT ${ARGV5} STREQUAL "") )
106 set(Antlr4_NamespaceOption "-package;${ARGV5}")
108 list( APPEND Antlr4_GeneratorStatusMessage " in Namespace ${ARGV5}" )
110 set(Antlr4_NamespaceOption "")
113 if ( (ARGC GREATER_EQUAL 7 ) AND (NOT ${ARGV6} STREQUAL "") )
114 set(Antlr4_AdditionalDependencies ${ARGV6})
116 set(Antlr4_AdditionalDependencies "")
119 if ( (ARGC GREATER_EQUAL 8 ) AND (NOT ${ARGV7} STREQUAL "") )
120 set(Antlr4_LibOption "-lib;${ARGV7}")
122 list( APPEND Antlr4_GeneratorStatusMessage " using Library ${ARGV7}" )
124 set(Antlr4_LibOption "")
128 message(FATAL_ERROR "Java is required to process grammar or lexer files! - Use 'FIND_PACKAGE(Java COMPONENTS Runtime REQUIRED)'")
131 if(NOT EXISTS "${ANTLR4_JAR_LOCATION}")
132 message(FATAL_ERROR "Unable to find antlr tool. ANTLR4_JAR_LOCATION:${ANTLR4_JAR_LOCATION}")
135 # The call to generate the files
137 OUTPUT ${Antlr4_GeneratedTargets}
138 # Remove target directory
140 ${CMAKE_COMMAND} -E remove_directory ${Antlr4_GeneratedSrcDir}
141 # Create target directory
143 ${CMAKE_COMMAND} -E make_directory ${Antlr4_GeneratedSrcDir}
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}
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)
158 # export generated cpp files into list
159 foreach(generated_file ${Antlr4_GeneratedTargets})
161 if (NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
162 set_source_files_properties(
165 COMPILE_FLAGS -Wno-overloaded-virtual
169 if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
170 set_source_files_properties(
173 COMPILE_FLAGS -wd4251
177 endforeach(generated_file)
179 message(STATUS "Antlr4 ${Antlr4_ProjectTarget} - Building " ${Antlr4_GeneratorStatusMessage} )