#------------------- LIBRARY CONFIGURATION ------------------------------------

set(ANTLR4_CPP_RUNTIME antlr4_cpp_runtime CACHE INTERNAL "")
set(ANTLR4_CPP_RUNTIME_SRC
    src/ANTLRErrorListener.cpp
    src/ANTLRErrorListener.h
    src/ANTLRErrorStrategy.cpp
    src/ANTLRErrorStrategy.h
    src/ANTLRFileStream.cpp
    src/ANTLRFileStream.h
    src/ANTLRInputStream.cpp
    src/ANTLRInputStream.h
    src/BailErrorStrategy.cpp
    src/BailErrorStrategy.h
    src/BaseErrorListener.cpp
    src/BaseErrorListener.h
    src/BufferedTokenStream.cpp
    src/BufferedTokenStream.h
    src/CharStream.cpp
    src/CharStream.h
    src/CommonToken.cpp
    src/CommonToken.h
    src/CommonTokenFactory.cpp
    src/CommonTokenFactory.h
    src/CommonTokenStream.cpp
    src/CommonTokenStream.h
    src/ConsoleErrorListener.cpp
    src/ConsoleErrorListener.h
    src/DefaultErrorStrategy.cpp
    src/DefaultErrorStrategy.h
    src/DiagnosticErrorListener.cpp
    src/DiagnosticErrorListener.h
    src/Exceptions.cpp
    src/Exceptions.h
    src/FailedPredicateException.cpp
    src/FailedPredicateException.h
    src/InputMismatchException.cpp
    src/InputMismatchException.h
    src/IntStream.cpp
    src/IntStream.h
    src/InterpreterRuleContext.cpp
    src/InterpreterRuleContext.h
    src/Lexer.cpp
    src/Lexer.h
    src/LexerInterpreter.cpp
    src/LexerInterpreter.h
    src/LexerNoViableAltException.cpp
    src/LexerNoViableAltException.h
    src/ListTokenSource.cpp
    src/ListTokenSource.h
    src/NoViableAltException.cpp
    src/NoViableAltException.h
    src/Parser.cpp
    src/Parser.h
    src/ParserInterpreter.cpp
    src/ParserInterpreter.h
    src/ParserRuleContext.cpp
    src/ParserRuleContext.h
    src/ProxyErrorListener.cpp
    src/ProxyErrorListener.h
    src/RecognitionException.cpp
    src/RecognitionException.h
    src/Recognizer.cpp
    src/Recognizer.h
    src/RuleContext.cpp
    src/RuleContext.h
    src/RuleContextWithAltNum.cpp
    src/RuleContextWithAltNum.h
    src/RuntimeMetaData.cpp
    src/RuntimeMetaData.h
    src/Token.cpp
    src/Token.h
    src/TokenFactory.h
    src/TokenSource.cpp
    src/TokenSource.h
    src/TokenStream.cpp
    src/TokenStream.h
    src/TokenStreamRewriter.cpp
    src/TokenStreamRewriter.h
    src/UnbufferedCharStream.cpp
    src/UnbufferedCharStream.h
    src/UnbufferedTokenStream.cpp
    src/UnbufferedTokenStream.h
    src/Vocabulary.cpp
    src/Vocabulary.h
    src/WritableToken.cpp
    src/WritableToken.h
    src/antlr4-common.h
    src/antlr4-runtime.h
    src/atn/ATN.cpp
    src/atn/ATN.h
    src/atn/ATNConfig.cpp
    src/atn/ATNConfig.h
    src/atn/ATNConfigSet.cpp
    src/atn/ATNConfigSet.h
    src/atn/ATNDeserializationOptions.cpp
    src/atn/ATNDeserializationOptions.h
    src/atn/ATNDeserializer.cpp
    src/atn/ATNDeserializer.h
    src/atn/ATNSerializer.cpp
    src/atn/ATNSerializer.h
    src/atn/ATNSimulator.cpp
    src/atn/ATNSimulator.h
    src/atn/ATNState.cpp
    src/atn/ATNState.h
    src/atn/ATNType.h
    src/atn/AbstractPredicateTransition.cpp
    src/atn/AbstractPredicateTransition.h
    src/atn/ActionTransition.cpp
    src/atn/ActionTransition.h
    src/atn/AmbiguityInfo.cpp
    src/atn/AmbiguityInfo.h
    src/atn/ArrayPredictionContext.cpp
    src/atn/ArrayPredictionContext.h
    src/atn/AtomTransition.cpp
    src/atn/AtomTransition.h
    src/atn/BasicBlockStartState.cpp
    src/atn/BasicBlockStartState.h
    src/atn/BasicState.cpp
    src/atn/BasicState.h
    src/atn/BlockEndState.cpp
    src/atn/BlockEndState.h
    src/atn/BlockStartState.cpp
    src/atn/BlockStartState.h
    src/atn/ContextSensitivityInfo.cpp
    src/atn/ContextSensitivityInfo.h
    src/atn/DecisionEventInfo.cpp
    src/atn/DecisionEventInfo.h
    src/atn/DecisionInfo.cpp
    src/atn/DecisionInfo.h
    src/atn/DecisionState.cpp
    src/atn/DecisionState.h
    src/atn/EmptyPredictionContext.cpp
    src/atn/EmptyPredictionContext.h
    src/atn/EpsilonTransition.cpp
    src/atn/EpsilonTransition.h
    src/atn/ErrorInfo.cpp
    src/atn/ErrorInfo.h
    src/atn/LL1Analyzer.cpp
    src/atn/LL1Analyzer.h
    src/atn/LexerATNConfig.cpp
    src/atn/LexerATNConfig.h
    src/atn/LexerATNSimulator.cpp
    src/atn/LexerATNSimulator.h
    src/atn/LexerAction.cpp
    src/atn/LexerAction.h
    src/atn/LexerActionExecutor.cpp
    src/atn/LexerActionExecutor.h
    src/atn/LexerActionType.h
    src/atn/LexerChannelAction.cpp
    src/atn/LexerChannelAction.h
    src/atn/LexerCustomAction.cpp
    src/atn/LexerCustomAction.h
    src/atn/LexerIndexedCustomAction.cpp
    src/atn/LexerIndexedCustomAction.h
    src/atn/LexerModeAction.cpp
    src/atn/LexerModeAction.h
    src/atn/LexerMoreAction.cpp
    src/atn/LexerMoreAction.h
    src/atn/LexerPopModeAction.cpp
    src/atn/LexerPopModeAction.h
    src/atn/LexerPushModeAction.cpp
    src/atn/LexerPushModeAction.h
    src/atn/LexerSkipAction.cpp
    src/atn/LexerSkipAction.h
    src/atn/LexerTypeAction.cpp
    src/atn/LexerTypeAction.h
    src/atn/LookaheadEventInfo.cpp
    src/atn/LookaheadEventInfo.h
    src/atn/LoopEndState.cpp
    src/atn/LoopEndState.h
    src/atn/NotSetTransition.cpp
    src/atn/NotSetTransition.h
    src/atn/OrderedATNConfigSet.cpp
    src/atn/OrderedATNConfigSet.h
    src/atn/ParseInfo.cpp
    src/atn/ParseInfo.h
    src/atn/ParserATNSimulator.cpp
    src/atn/ParserATNSimulator.h
    src/atn/PlusBlockStartState.cpp
    src/atn/PlusBlockStartState.h
    src/atn/PlusLoopbackState.cpp
    src/atn/PlusLoopbackState.h
    src/atn/PrecedencePredicateTransition.cpp
    src/atn/PrecedencePredicateTransition.h
    src/atn/PredicateEvalInfo.cpp
    src/atn/PredicateEvalInfo.h
    src/atn/PredicateTransition.cpp
    src/atn/PredicateTransition.h
    src/atn/PredictionContext.cpp
    src/atn/PredictionContext.h
    src/atn/PredictionMode.cpp
    src/atn/PredictionMode.h
    src/atn/ProfilingATNSimulator.cpp
    src/atn/ProfilingATNSimulator.h
    src/atn/RangeTransition.cpp
    src/atn/RangeTransition.h
    src/atn/RuleStartState.cpp
    src/atn/RuleStartState.h
    src/atn/RuleStopState.cpp
    src/atn/RuleStopState.h
    src/atn/RuleTransition.cpp
    src/atn/RuleTransition.h
    src/atn/SemanticContext.cpp
    src/atn/SemanticContext.h
    src/atn/SetTransition.cpp
    src/atn/SetTransition.h
    src/atn/SingletonPredictionContext.cpp
    src/atn/SingletonPredictionContext.h
    src/atn/StarBlockStartState.cpp
    src/atn/StarBlockStartState.h
    src/atn/StarLoopEntryState.cpp
    src/atn/StarLoopEntryState.h
    src/atn/StarLoopbackState.cpp
    src/atn/StarLoopbackState.h
    src/atn/TokensStartState.cpp
    src/atn/TokensStartState.h
    src/atn/Transition.cpp
    src/atn/Transition.h
    src/atn/WildcardTransition.cpp
    src/atn/WildcardTransition.h
    src/dfa/DFA.cpp
    src/dfa/DFA.h
    src/dfa/DFASerializer.cpp
    src/dfa/DFASerializer.h
    src/dfa/DFAState.cpp
    src/dfa/DFAState.h
    src/dfa/LexerDFASerializer.cpp
    src/dfa/LexerDFASerializer.h
    src/misc/InterpreterDataReader.cpp
    src/misc/InterpreterDataReader.h
    src/misc/Interval.cpp
    src/misc/Interval.h
    src/misc/IntervalSet.cpp
    src/misc/IntervalSet.h
    src/misc/MurmurHash.cpp
    src/misc/MurmurHash.h
    src/misc/Predicate.cpp
    src/misc/Predicate.h
    src/support/Any.cpp
    src/support/Any.h
    src/support/Arrays.cpp
    src/support/Arrays.h
    src/support/BitSet.h
    src/support/CPPUtils.cpp
    src/support/CPPUtils.h
    src/support/Declarations.h
    src/support/StringUtils.cpp
    src/support/StringUtils.h
    src/support/guid.cpp
    src/support/guid.h
    src/tree/AbstractParseTreeVisitor.h
    src/tree/ErrorNode.cpp
    src/tree/ErrorNode.h
    src/tree/ErrorNodeImpl.cpp
    src/tree/ErrorNodeImpl.h
    src/tree/IterativeParseTreeWalker.cpp
    src/tree/IterativeParseTreeWalker.h
    src/tree/ParseTree.cpp
    src/tree/ParseTree.h
    src/tree/ParseTreeListener.cpp
    src/tree/ParseTreeListener.h
    src/tree/ParseTreeProperty.h
    src/tree/ParseTreeVisitor.cpp
    src/tree/ParseTreeVisitor.h
    src/tree/ParseTreeWalker.cpp
    src/tree/ParseTreeWalker.h
    src/tree/TerminalNode.cpp
    src/tree/TerminalNode.h
    src/tree/TerminalNodeImpl.cpp
    src/tree/TerminalNodeImpl.h
    src/tree/Trees.cpp
    src/tree/Trees.h
    src/tree/pattern/Chunk.cpp
    src/tree/pattern/Chunk.h
    src/tree/pattern/ParseTreeMatch.cpp
    src/tree/pattern/ParseTreeMatch.h
    src/tree/pattern/ParseTreePattern.cpp
    src/tree/pattern/ParseTreePattern.h
    src/tree/pattern/ParseTreePatternMatcher.cpp
    src/tree/pattern/ParseTreePatternMatcher.h
    src/tree/pattern/RuleTagToken.cpp
    src/tree/pattern/RuleTagToken.h
    src/tree/pattern/TagChunk.cpp
    src/tree/pattern/TagChunk.h
    src/tree/pattern/TextChunk.cpp
    src/tree/pattern/TextChunk.h
    src/tree/pattern/TokenTagToken.cpp
    src/tree/pattern/TokenTagToken.h
    src/tree/xpath/XPath.cpp
    src/tree/xpath/XPath.h
    src/tree/xpath/XPathElement.cpp
    src/tree/xpath/XPathElement.h
    src/tree/xpath/XPathLexer.cpp
    src/tree/xpath/XPathLexer.h
    src/tree/xpath/XPathLexerErrorListener.cpp
    src/tree/xpath/XPathLexerErrorListener.h
    src/tree/xpath/XPathRuleAnywhereElement.cpp
    src/tree/xpath/XPathRuleAnywhereElement.h
    src/tree/xpath/XPathRuleElement.cpp
    src/tree/xpath/XPathRuleElement.h
    src/tree/xpath/XPathTokenAnywhereElement.cpp
    src/tree/xpath/XPathTokenAnywhereElement.h
    src/tree/xpath/XPathTokenElement.cpp
    src/tree/xpath/XPathTokenElement.h
    src/tree/xpath/XPathWildcardAnywhereElement.cpp
    src/tree/xpath/XPathWildcardAnywhereElement.h
    src/tree/xpath/XPathWildcardElement.cpp
    src/tree/xpath/XPathWildcardElement.h
)

add_library(${ANTLR4_CPP_RUNTIME} ${ANTLR4_CPP_RUNTIME_SRC})

target_include_directories(${ANTLR4_CPP_RUNTIME} PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/src
)

if ("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
    target_compile_options(${ANTLR4_CPP_RUNTIME} PRIVATE
        -g -Wall -O0
    )
else()
    target_compile_options(${ANTLR4_CPP_RUNTIME} PRIVATE
        -w -O3
    )
    target_compile_options(${ANTLR4_CPP_RUNTIME} PUBLIC
        -Wno-attributes
    )
endif()
