set(ANTLR_VERSION @ANTLR_VERSION@) @PACKAGE_INIT@ if (NOT ANTLR4_CPP_GENERATED_SRC_DIR) set(ANTLR4_GENERATED_SRC_DIR ${CMAKE_BINARY_DIR}/antlr4_generated_src) endif() FIND_PACKAGE(Java COMPONENTS Runtime REQUIRED) # # The ANTLR generator will output the following files given the input file f.g4 # # Input -> f.g4 # Output -> f.h # -> f.cpp # # the following files will only be produced if there is a parser contained # Flag -visitor active # Output -> BaseVisitor.h # -> BaseVisitor.cpp # -> Visitor.h # -> Visitor.cpp # # Flag -listener active # Output -> BaseListener.h # -> BaseListener.cpp # -> Listener.h # -> Listener.cpp # # See documentation in markup # function(antlr4_generate Antlr4_ProjectTarget Antlr4_InputFile Antlr4_GeneratorType ) set( Antlr4_GeneratedSrcDir ${ANTLR4_GENERATED_SRC_DIR}/${Antlr4_ProjectTarget} ) get_filename_component(Antlr4_InputFileBaseName ${Antlr4_InputFile} NAME_WE ) list( APPEND Antlr4_GeneratorStatusMessage "Common Include-, Source- and Tokenfiles" ) if ( ${Antlr4_GeneratorType} STREQUAL "LEXER") set(Antlr4_LexerBaseName "${Antlr4_InputFileBaseName}") set(Antlr4_ParserBaseName "") else() if ( ${Antlr4_GeneratorType} STREQUAL "PARSER") set(Antlr4_LexerBaseName "") set(Antlr4_ParserBaseName "${Antlr4_InputFileBaseName}") else() if ( ${Antlr4_GeneratorType} STREQUAL "BOTH") set(Antlr4_LexerBaseName "${Antlr4_InputFileBaseName}Lexer") set(Antlr4_ParserBaseName "${Antlr4_InputFileBaseName}Parser") else() message(FATAL_ERROR "The third parameter must be LEXER, PARSER or BOTH") endif () endif () endif () # Prepare list of generated targets list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}.tokens" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}.interp" ) list( APPEND DependentTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}.tokens" ) if ( NOT ${Antlr4_LexerBaseName} STREQUAL "" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_LexerBaseName}.h" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_LexerBaseName}.cpp" ) endif () if ( NOT ${Antlr4_ParserBaseName} STREQUAL "" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_ParserBaseName}.h" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_ParserBaseName}.cpp" ) endif () # process optional arguments ... if ( ( ARGC GREATER_EQUAL 4 ) AND ARGV3 ) set(Antlr4_BuildListenerOption "-listener") list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseListener.h" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseListener.cpp" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Listener.h" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Listener.cpp" ) list( APPEND Antlr4_GeneratorStatusMessage ", Listener Include- and Sourcefiles" ) else() set(Antlr4_BuildListenerOption "-no-listener") endif () if ( ( ARGC GREATER_EQUAL 5 ) AND ARGV4 ) set(Antlr4_BuildVisitorOption "-visitor") list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseVisitor.h" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}BaseVisitor.cpp" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Visitor.h" ) list( APPEND Antlr4_GeneratedTargets "${Antlr4_GeneratedSrcDir}/${Antlr4_InputFileBaseName}Visitor.cpp" ) list( APPEND Antlr4_GeneratorStatusMessage ", Visitor Include- and Sourcefiles" ) else() set(Antlr4_BuildVisitorOption "-no-visitor") endif () if ( (ARGC GREATER_EQUAL 6 ) AND (NOT ${ARGV5} STREQUAL "") ) set(Antlr4_NamespaceOption "-package;${ARGV5}") list( APPEND Antlr4_GeneratorStatusMessage " in Namespace ${ARGV5}" ) else() set(Antlr4_NamespaceOption "") endif () if ( (ARGC GREATER_EQUAL 7 ) AND (NOT ${ARGV6} STREQUAL "") ) set(Antlr4_AdditionalDependencies ${ARGV6}) else() set(Antlr4_AdditionalDependencies "") endif () if ( (ARGC GREATER_EQUAL 8 ) AND (NOT ${ARGV7} STREQUAL "") ) set(Antlr4_LibOption "-lib;${ARGV7}") list( APPEND Antlr4_GeneratorStatusMessage " using Library ${ARGV7}" ) else() set(Antlr4_LibOption "") endif () if(NOT Java_FOUND) message(FATAL_ERROR "Java is required to process grammar or lexer files! - Use 'FIND_PACKAGE(Java COMPONENTS Runtime REQUIRED)'") endif() if(NOT EXISTS "${ANTLR4_JAR_LOCATION}") message(FATAL_ERROR "Unable to find antlr tool. ANTLR4_JAR_LOCATION:${ANTLR4_JAR_LOCATION}") endif() # The call to generate the files add_custom_command( OUTPUT ${Antlr4_GeneratedTargets} # Remove target directory COMMAND ${CMAKE_COMMAND} -E remove_directory ${Antlr4_GeneratedSrcDir} # Create target directory COMMAND ${CMAKE_COMMAND} -E make_directory ${Antlr4_GeneratedSrcDir} COMMAND # Generate files "${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}" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" MAIN_DEPENDENCY "${Antlr4_InputFile}" DEPENDS ${Antlr4_AdditionalDependencies} ) # set output variables in parent scope set( ANTLR4_INCLUDE_DIR_${Antlr4_ProjectTarget} ${Antlr4_GeneratedSrcDir} PARENT_SCOPE) set( ANTLR4_SRC_FILES_${Antlr4_ProjectTarget} ${Antlr4_GeneratedTargets} PARENT_SCOPE) set( ANTLR4_TOKEN_FILES_${Antlr4_ProjectTarget} ${DependentTargets} PARENT_SCOPE) set( ANTLR4_TOKEN_DIRECTORY_${Antlr4_ProjectTarget} ${Antlr4_GeneratedSrcDir} PARENT_SCOPE) # export generated cpp files into list foreach(generated_file ${Antlr4_GeneratedTargets}) if (NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC") set_source_files_properties( ${generated_file} PROPERTIES COMPILE_FLAGS -Wno-overloaded-virtual ) endif () if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") set_source_files_properties( ${generated_file} PROPERTIES COMPILE_FLAGS -wd4251 ) endif () endforeach(generated_file) message(STATUS "Antlr4 ${Antlr4_ProjectTarget} - Building " ${Antlr4_GeneratorStatusMessage} ) endfunction()