########## libwccl ###############

PROJECT(wccl)

include_directories( ${CMAKE_CURRENT_BINARY_DIR}/include/ )

find_package(Corpus2 1.0.9 REQUIRED)
set(LIBS ${LIBS} ${Corpus2_LIBRARIES})

find_package(PwrUtils 1.0.1 REQUIRED)
set(LIBS ${LIBS} ${PwrUtils_LIBRARY})

link_directories(${Boost_LIBRARY_DIRS})
set(LIBS ${LIBS} ${Boost_LIBRARIES})

find_package(ICU REQUIRED)
include_directories(${ICU_INCLUDE_DIR})
set(LIBS ${LIBS} ${ICU_LIBRARIES} ${ICU_I18N_LIBRARIES})

find_package(ANTLR REQUIRED)
include_directories(${ANTLR_INCLUDE_DIR})

if(WIN32)
# On UNIX this should be included only in final executables
	set(LIBS ${LIBS} ${ANTLR_LIBRARY})
endif(WIN32)

SET(libwccl_STAT_SRC
	exception.cpp
	lexicon/lexfilegrammar.g
	lexicon/lexicon.cpp
	lexicon/lexiconparser.cpp
	lexicon/lexicons.cpp
	ops/formatters.cpp
	ops/functions/bool/iteration.cpp
	ops/functions/bool/iterations/atleast.cpp
	ops/functions/bool/iterations/leftlook.cpp
	ops/functions/bool/iterations/only.cpp
	ops/functions/bool/iterations/rightlook.cpp
	ops/functions/bool/predicate.cpp
	ops/functions/bool/predicates/and.cpp
	ops/functions/bool/predicates/ann.cpp
	ops/functions/bool/predicates/annsub.cpp
	ops/functions/bool/predicates/debug.cpp
	ops/functions/bool/predicates/isinside.cpp
	ops/functions/bool/predicates/isoutside.cpp
	ops/functions/bool/predicates/logicalpredicate.cpp
	ops/functions/bool/predicates/nor.cpp
	ops/functions/bool/predicates/or.cpp
	ops/functions/bool/predicates/pointagreement.cpp
	ops/functions/bool/predicates/regex.cpp
	ops/functions/bool/predicates/strongagreement.cpp
	ops/functions/bool/predicates/weakagreement.cpp
	ops/functions/match/submatch.cpp
	ops/functions/position/firsttoken.cpp
	ops/functions/position/lasttoken.cpp
	ops/functions/position/relativeposition.cpp
	ops/functions/strset/affix.cpp
	ops/functions/strset/getlemmas.cpp
	ops/functions/strset/getorth.cpp
	ops/functions/strset/lextranslator.cpp
	ops/functions/strset/tolower.cpp
	ops/functions/strset/toupper.cpp
	ops/functions/tset/agrfilter.cpp
	ops/functions/tset/catfilter.cpp
	ops/functions/tset/getsymbols.cpp
	ops/functions/tset/getsymbolsinrange.cpp
	ops/match/actions/markmatch.cpp
	ops/match/actions/unmarkmatch.cpp
	ops/match/applyoperator.cpp
	ops/match/conditions/conjconditions.cpp
	ops/match/conditions/isannotatedas.cpp
	ops/match/conditions/longest.cpp
	ops/match/conditions/matchtext.cpp
	ops/match/conditions/oneof.cpp
	ops/match/conditions/optionalmatch.cpp
	ops/match/conditions/repeatedmatch.cpp
	ops/match/conditions/tokencondition.cpp
	ops/matchrule.cpp
	ops/matchrulesequence.cpp
	ops/opsequence.cpp
	ops/tagaction.cpp
	ops/tagactions/delete.cpp
	ops/tagactions/mark.cpp
	ops/tagactions/relabel.cpp
	ops/tagactions/select.cpp
	ops/tagactions/unify.cpp
	ops/tagactions/unmark.cpp
	ops/tagrule.cpp
	ops/tagrulesequence.cpp
	parser/grammar.g
	parser/Parser.cpp
	parser/ParserException.cpp
	sentencecontext.cpp
	values/annotationmatch.cpp
	values/bool.cpp
	values/match.cpp
	values/matchvector.cpp
	values/position.cpp
	values/strset.cpp
	values/tokenmatch.cpp
	values/tset.cpp
	values/value.cpp
	variables.cpp
	wcclfile.cpp
)

SET(libwccl_STAT_SRC ${libwccl_STAT_SRC}
	${PROJECT_BINARY_DIR}/parser/ANTLRLexer.cpp
	${PROJECT_BINARY_DIR}/parser/ANTLRParser.cpp
	${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconLexer.cpp
	${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconParser.cpp
)

include_directories(${PROJECT_BINARY_DIR}/parser)

ADD_CUSTOM_COMMAND(
	OUTPUT ${PROJECT_BINARY_DIR}/parser/ANTLRLexer.cpp
		${PROJECT_BINARY_DIR}/parser/ANTLRLexer.hpp
		${PROJECT_BINARY_DIR}/parser/ANTLRParser.cpp
		${PROJECT_BINARY_DIR}/parser/ANTLRParser.hpp
		${PROJECT_BINARY_DIR}/parser/ANTLRExprTokenTypes.hpp
		${PROJECT_BINARY_DIR}/parser/ANTLRExprTokenTypes.txt
	COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_BINARY_DIR}/parser
	COMMAND runantlr -o parser ${PROJECT_SOURCE_DIR}/parser/grammar.g
	DEPENDS ${PROJECT_SOURCE_DIR}/parser/grammar.g
	COMMENT "-- Generating ANTLR parser cpp/hpp/txt files for WCCL ---")

include_directories(${PROJECT_BINARY_DIR}/lexicon)

ADD_CUSTOM_COMMAND(
	OUTPUT
		${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconLexer.cpp
		${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconLexer.hpp
		${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconParser.cpp
		${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconParser.hpp
		${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconsTokenTypes.hpp
		${PROJECT_BINARY_DIR}/lexicon/ANTLRLexiconsTokenTypes.txt
	COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_BINARY_DIR}/lexicon
	COMMAND runantlr -o lexicon ${PROJECT_SOURCE_DIR}/lexicon/lexfilegrammar.g
	DEPENDS ${PROJECT_SOURCE_DIR}/lexicon/lexfilegrammar.g
	COMMENT "-- Generating ANTLR parser cpp/hpp/txt files for lexicon files ---")
	
	
file(GLOB_RECURSE INCS "*.h")

if(WIN32)
#need to explicitly specify exports/external API for win DLL
#until that's done, build STATIC for WIN32
	add_library(wccl STATIC ${libwccl_STAT_SRC} ${INCS})
else(WIN32)
	add_library(wccl SHARED ${libwccl_STAT_SRC} ${INCS})
endif(WIN32)

target_link_libraries ( wccl ${LIBS})

set_target_properties(wccl PROPERTIES
	VERSION "${ver_major}.${ver_minor}"
	SOVERSION ${ver_major})


if(UNIX)
	install(TARGETS wccl
		LIBRARY DESTINATION lib
	)
	install(
		DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
		DESTINATION include
		FILES_MATCHING PATTERN "*.h"
		PATTERN ".svn" EXCLUDE
		PATTERN "bin" EXCLUDE
		PATTERN "build" EXCLUDE
		PATTERN "CMake*" EXCLUDE
	)
endif(UNIX)