project(CLucene)
cmake_minimum_required(VERSION 2.4)

INCLUDE(CheckIncludeFile)
INCLUDE(CheckIncludeFileCXX)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckTypeSize)

CHECK_INCLUDE_FILE_CXX(algorithm    _CL_HAVE_ALGORITHM)
CHECK_INCLUDE_FILE_CXX(ext/hash_map _CL_HAVE_EXT_HASH_MAP)
CHECK_INCLUDE_FILE_CXX(ext/hash_set _CL_HAVE_EXT_HASH_SET)
CHECK_INCLUDE_FILE_CXX(functional   _CL_HAVE_FUNCTIONAL)
CHECK_INCLUDE_FILE_CXX(hash_map     _CL_HAVE_HASH_MAP)
CHECK_INCLUDE_FILE_CXX(hash_set     _CL_HAVE_HASH_SET)
CHECK_INCLUDE_FILE_CXX(list         _CL_HAVE_LIST)
CHECK_INCLUDE_FILE_CXX(map          _CL_HAVE_MAP)
CHECK_INCLUDE_FILE_CXX(set          _CL_HAVE_SET)
CHECK_INCLUDE_FILE_CXX(stdexcept    _CL_HAVE_STDEXCEPT)
CHECK_INCLUDE_FILE_CXX(vector       _CL_HAVE_VECTOR)

CHECK_INCLUDE_FILE(ctype.h      _CL_HAVE_CTYPE_H)
CHECK_INCLUDE_FILE(dirent.h     _CL_HAVE_DIRENT_H)
CHECK_INCLUDE_FILE(dlfcn.h      _CL_HAVE_DLFCN_H)
CHECK_INCLUDE_FILE(errno.h      _CL_HAVE_ERRNO_H)
CHECK_INCLUDE_FILE(fcntl.h      _CL_HAVE_FCNTL_H)
CHECK_INCLUDE_FILE(inttypes.h   _CL_HAVE_INTTYPES_H)
CHECK_INCLUDE_FILE(math.h       _CL_HAVE_MATH_H)
CHECK_INCLUDE_FILE(memory.h     _CL_HAVE_MEMORY_H)
CHECK_INCLUDE_FILE(ndir.h       _CL_HAVE_NDIR_H)
CHECK_INCLUDE_FILE(stdarg.h     _CL_HAVE_STDARG_H)
CHECK_INCLUDE_FILE(stdint.h     _CL_HAVE_STDINT_H)
CHECK_INCLUDE_FILE(stdlib.h     _CL_HAVE_STDLIB_H)
CHECK_INCLUDE_FILE(string.h     _CL_HAVE_STRING_H)
CHECK_INCLUDE_FILE(strings.h    _CL_HAVE_STRINGS_H)
CHECK_INCLUDE_FILE(sys/dir.h    _CL_HAVE_SYS_DIR_H)
CHECK_INCLUDE_FILE(sys/ndir.h   _CL_HAVE_SYS_NDIR_H)
CHECK_INCLUDE_FILE(sys/stat.h   _CL_HAVE_SYS_STAT_H)
CHECK_INCLUDE_FILE(sys/timeb.h  _CL_HAVE_SYS_TIMEB_H)
CHECK_INCLUDE_FILE(sys/types.h  _CL_HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILE(tchar.h      _CL_HAVE_TCHAR_H)
CHECK_INCLUDE_FILE(unistd.h     _CL_HAVE_UNISTD_H)
CHECK_INCLUDE_FILE(wchar.h      _CL_HAVE_WCHAR_H)

CHECK_FUNCTION_EXISTS(getpagesize _CL_HAVE_GETPAGESIZE)
CHECK_FUNCTION_EXISTS(lltoa       _CL_HAVE_LLTOA)
CHECK_FUNCTION_EXISTS(lltow       _CL_HAVE_LLTOW)
CHECK_FUNCTION_EXISTS(nanosleep   _CL_HAVE_NANOSLEEP)
CHECK_FUNCTION_EXISTS(printf      _CL_HAVE_PRINTF)
CHECK_FUNCTION_EXISTS(snprintf    _CL_HAVE_SNPRINTF)
CHECK_FUNCTION_EXISTS(snwprintf   _CL_HAVE_SNWPRINTF)
CHECK_FUNCTION_EXISTS(strlwr      _CL_HAVE_STRLWR)
CHECK_FUNCTION_EXISTS(strtoll     _CL_HAVE_STRTOLL)
CHECK_FUNCTION_EXISTS(strupr      _CL_HAVE_STRUPR)
CHECK_FUNCTION_EXISTS(tell        _CL_HAVE_TELL)
CHECK_FUNCTION_EXISTS(vsnwprintf  _CL_HAVE_VSNWPRINTF)
CHECK_FUNCTION_EXISTS(wcscasecmp  _CL_HAVE_WCSCASECMP)
CHECK_FUNCTION_EXISTS(wcscat      _CL_HAVE_WCSCAT)
CHECK_FUNCTION_EXISTS(wcschr      _CL_HAVE_WCSCHR)
CHECK_FUNCTION_EXISTS(wcscmp      _CL_HAVE_WCSCMP)
CHECK_FUNCTION_EXISTS(wcscpy      _CL_HAVE_WCSCPY)
CHECK_FUNCTION_EXISTS(wcscspn     _CL_HAVE_WCSCSPN)
CHECK_FUNCTION_EXISTS(wcsicmp     _CL_HAVE_WCSICMP)
CHECK_FUNCTION_EXISTS(wcslen      _CL_HAVE_WCSLEN)
CHECK_FUNCTION_EXISTS(wcsncmp     _CL_HAVE_WCSNCMP)
CHECK_FUNCTION_EXISTS(wcsncpy     _CL_HAVE_WCSNCPY)
CHECK_FUNCTION_EXISTS(wcsstr      _CL_HAVE_WCSSTR)
CHECK_FUNCTION_EXISTS(wcstod      _CL_HAVE_WCSTOD)
CHECK_FUNCTION_EXISTS(wcstoll     _CL_HAVE_WCSTOLL)
CHECK_FUNCTION_EXISTS(wcsupr      _CL_HAVE_WCSUPR)
CHECK_FUNCTION_EXISTS(wprintf     _CL_HAVE_WPRINTF)
CHECK_FUNCTION_EXISTS(_filelength _CL_HAVE__FILELENGTH)

if( _CL_HAVE_MATH_H )
  SET( CMAKE_EXTRA_INCLUDE_FILES math.h )
  CHECK_TYPE_SIZE(float_t  _CL_HAVE_FLOAT_T)
endif( _CL_HAVE_MATH_H )

CHECK_TYPE_SIZE(intptr_t _CL_HAVE_INTPTR_T)




SET(_CL_HAVE_WCHAR_T ${_CL_HAVE_WCHAR_H})
SET(_CL_HAVE_NAMESPACES 1)

IF(WIN32)
  SET(_CL_HAVE_WINDOWS_H 1)
ENDIF(WIN32)

configure_file(${CMAKE_SOURCE_DIR}/CLucene/clucene-config.h.cmake
               ${CMAKE_BINARY_DIR}/CLucene/clucene-config.h)

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/CLucene
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_BINARY_DIR}
)

set(clucene_SRCS
   CLucene/analysis/standard/StandardAnalyzer.cpp
   CLucene/analysis/standard/StandardFilter.cpp
   CLucene/analysis/standard/StandardTokenizer.cpp

   CLucene/analysis/AnalysisHeader.cpp
   CLucene/analysis/Analyzers.cpp

   CLucene/config/gunichartables.cpp
   CLucene/config/repl_lltot.cpp
   CLucene/config/repl_tcslwr.cpp
   CLucene/config/repl_tcscasecmp.cpp
   CLucene/config/threads.cpp
   CLucene/config/utf8.cpp

   CLucene/debug/condition.cpp
   CLucene/debug/error.cpp
#   CLucene/debug/mempool.cpp
   CLucene/debug/memtracking.cpp

   CLucene/document/DateField.cpp
   CLucene/document/Document.cpp
   CLucene/document/Field.cpp

   CLucene/index/CompoundFile.cpp
   CLucene/index/DocumentWriter.cpp
   CLucene/index/FieldInfos.cpp
   CLucene/index/FieldsReader.cpp
   CLucene/index/FieldsWriter.cpp
   CLucene/index/IndexModifier.cpp
   CLucene/index/IndexReader.cpp
   CLucene/index/IndexWriter.cpp
   CLucene/index/MultiReader.cpp
   CLucene/index/SegmentInfos.cpp
   CLucene/index/SegmentMergeInfo.cpp
   CLucene/index/SegmentMergeQueue.cpp
   CLucene/index/SegmentMerger.cpp
   CLucene/index/SegmentReader.cpp
   CLucene/index/SegmentTermDocs.cpp
   CLucene/index/SegmentTermEnum.cpp
   CLucene/index/SegmentTermPositions.cpp
   CLucene/index/SegmentTermVector.cpp
   CLucene/index/Term.cpp
   CLucene/index/TermInfo.cpp
   CLucene/index/TermInfosReader.cpp
   CLucene/index/TermInfosWriter.cpp
   CLucene/index/TermVectorReader.cpp
   CLucene/index/TermVectorWriter.cpp

   CLucene/queryParser/Lexer.cpp
   CLucene/queryParser/MultiFieldQueryParser.cpp
   CLucene/queryParser/QueryParser.cpp
   CLucene/queryParser/QueryParserBase.cpp
   CLucene/queryParser/QueryToken.cpp
   CLucene/queryParser/TokenList.cpp

   CLucene/search/BooleanQuery.cpp
   CLucene/search/BooleanScorer.cpp
   CLucene/search/CachingWrapperFilter.cpp
   CLucene/search/ChainedFilter.cpp
   CLucene/search/ConjunctionScorer.cpp
   CLucene/search/DateFilter.cpp
   CLucene/search/ExactPhraseScorer.cpp
   CLucene/search/Explanation.cpp
   CLucene/search/FieldCache.cpp
   CLucene/search/FieldCacheImpl.cpp
   CLucene/search/FieldDocSortedHitQueue.cpp
   CLucene/search/FieldSortedHitQueue.cpp
   CLucene/search/FilteredTermEnum.cpp
   CLucene/search/FuzzyQuery.cpp
   CLucene/search/HitQueue.cpp
   CLucene/search/Hits.cpp
   CLucene/search/IndexSearcher.cpp
   CLucene/search/MultiSearcher.cpp
   CLucene/search/MultiTermQuery.cpp
   CLucene/search/PhrasePositions.cpp
   CLucene/search/PhraseQuery.cpp
   CLucene/search/PhraseScorer.cpp
   CLucene/search/PrefixQuery.cpp
   CLucene/search/QueryFilter.cpp
   CLucene/search/RangeFilter.cpp
   CLucene/search/RangeQuery.cpp
   CLucene/search/SearchHeader.cpp
   CLucene/search/Similarity.cpp
   CLucene/search/SloppyPhraseScorer.cpp
   CLucene/search/Sort.cpp
   CLucene/search/TermQuery.cpp
   CLucene/search/TermScorer.cpp
   CLucene/search/WildcardQuery.cpp
   CLucene/search/WildcardTermEnum.cpp

   CLucene/store/FSDirectory.cpp
   CLucene/store/IndexInput.cpp
   CLucene/store/IndexOutput.cpp
   CLucene/store/Lock.cpp
   CLucene/store/MMapInput.cpp
   CLucene/store/RAMDirectory.cpp
   CLucene/store/TransactionalRAMDirectory.cpp

   CLucene/util/BitSet.cpp
   CLucene/util/dirent.cpp
   CLucene/util/Equators.cpp
   CLucene/util/FastCharStream.cpp
   CLucene/util/fileinputstream.cpp
   CLucene/util/MD5Digester.cpp
   CLucene/util/Misc.cpp
   CLucene/util/Reader.cpp
   CLucene/util/StringBuffer.cpp
   CLucene/util/StringIntern.cpp
   CLucene/util/ThreadLocal.cpp
   CLucene/StdHeader.cpp
)

set(clucene_HDRS
   CLucene/analysis/standard/StandardAnalyzer.h
   CLucene/analysis/standard/StandardFilter.h
   CLucene/analysis/standard/StandardTokenizer.h
   CLucene/analysis/standard/StandardTokenizerConstants.h

   CLucene/analysis/AnalysisHeader.h
   CLucene/analysis/Analyzers.h

   CLucene/config/Compiler.h
   CLucene/config/CompilerBcb.h
   CLucene/config/CompilerGcc.h
   CLucene/config/CompilerMsvc.h
   CLucene/config/define_std.h
   CLucene/config/gunichartables.h
   CLucene/config/PlatformMac.h
   CLucene/config/PlatformUnix.h
   CLucene/config/PlatformWin32.h
   CLucene/config/repl_wchar.h
   CLucene/config/threadCSection.h

   CLucene/debug/condition.h
   CLucene/debug/error.h
   CLucene/debug/mem.h
   #debug/pool.h

   CLucene/document/DateField.h
   CLucene/document/Document.h
   CLucene/document/Field.h

   CLucene/index/CompoundFile.h
   CLucene/index/DocumentWriter.h
   CLucene/index/FieldInfo.h
   CLucene/index/FieldInfos.h
   CLucene/index/FieldsReader.h
   CLucene/index/FieldsWriter.h
   CLucene/index/IndexModifier.h
   CLucene/index/IndexReader.h
   CLucene/index/IndexWriter.h
   CLucene/index/MultiReader.h
   CLucene/index/SegmentHeader.h
   CLucene/index/SegmentInfos.h
   CLucene/index/SegmentMergeInfo.h
   CLucene/index/SegmentMergeQueue.h
   CLucene/index/SegmentMerger.h
   CLucene/index/SegmentTermEnum.h
   CLucene/index/Term.h
   CLucene/index/TermInfo.h
   CLucene/index/TermInfosReader.h
   CLucene/index/TermInfosWriter.h
   CLucene/index/Terms.h
   CLucene/index/TermVector.h

   CLucene/queryParser/Lexer.h
   CLucene/queryParser/MultiFieldQueryParser.h
   CLucene/queryParser/QueryParser.h
   CLucene/queryParser/QueryParserBase.h
   #queryParser/QueryParserConstants.h
   CLucene/queryParser/QueryToken.h
   CLucene/queryParser/TokenList.h

   CLucene/search/BooleanClause.h
   CLucene/search/BooleanQuery.h
   CLucene/search/BooleanScorer.h
   CLucene/search/CachingWrapperFilter.h
   CLucene/search/ChainedFilter.h
   CLucene/search/Compare.h
   CLucene/search/ConjunctionScorer.h
   CLucene/search/DateFilter.h
   CLucene/search/ExactPhraseScorer.h
   CLucene/search/Explanation.h
   CLucene/search/FieldCache.h
   CLucene/search/FieldCacheImpl.h
   CLucene/search/FieldDoc.h
   CLucene/search/FieldDocSortedHitQueue.h
   CLucene/search/FieldSortedHitQueue.h
   CLucene/search/Filter.h
   CLucene/search/FilteredTermEnum.h
   CLucene/search/FuzzyQuery.h
   CLucene/search/HitQueue.h
   CLucene/search/IndexSearcher.h
   CLucene/search/MultiSearcher.h
   CLucene/search/MultiTermQuery.h
   CLucene/search/PhrasePositions.h
   CLucene/search/PhraseQuery.h
   CLucene/search/PhraseQueue.h
   CLucene/search/PhraseScorer.h
   CLucene/search/PrefixQuery.h
   CLucene/search/QueryFilter.h
   CLucene/search/RangeFilter.h
   CLucene/search/RangeQuery.h
   #search/ScoreDoc.h
   CLucene/search/Scorer.h
   CLucene/search/SearchHeader.h
   CLucene/search/Similarity.h
   CLucene/search/SloppyPhraseScorer.h
   CLucene/search/Sort.h
   CLucene/search/TermQuery.h
   CLucene/search/TermScorer.h
   CLucene/search/WildcardQuery.h
   CLucene/search/WildcardTermEnum.h

   CLucene/store/Directory.h
   CLucene/store/FSDirectory.h
   CLucene/store/IndexInput.h
   CLucene/store/IndexOutput.h
   CLucene/store/InputStream.h
   CLucene/store/Lock.h
   CLucene/store/OutputStream.h
   CLucene/store/RAMDirectory.h
   CLucene/store/TransactionalRAMDirectory.h

   CLucene/util/Arrays.h
   CLucene/util/BitSet.h
   CLucene/util/bufferedstream.h
   CLucene/util/dirent.h
   CLucene/util/Equators.h
   CLucene/util/FastCharStream.h
   CLucene/util/fileinputstream.h
   CLucene/util/inputstreambuffer.h
   CLucene/util/jstreamsconfig.h
   CLucene/util/MD5Digester.h
   CLucene/util/Misc.h
   CLucene/util/PriorityQueue.h
   CLucene/util/Reader.h
   CLucene/util/streambase.h
   CLucene/util/stringreader.h
   CLucene/util/StringBuffer.h
   CLucene/util/StringIntern.h
   CLucene/util/ThreadLocal.h
   CLucene/util/VoidList.h
   CLucene/util/VoidMap.h
)

if(MSVC)
    add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -Zc:wchar_t-)
    include_directories(
      analysis/standard
      analysis
      config
      debug
      document
      index
      queryParser
      search
      store
      util
    )
endif(MSVC)

if(WIN32)
  set(CMAKE_DEBUG_POSTFIX "d")
endif(WIN32)

add_library(clucene-core STATIC ${clucene_HDRS} ${clucene_SRCS})

install(TARGETS clucene-core
                RUNTIME DESTINATION bin
                LIBRARY DESTINATION lib
                ARCHIVE DESTINATION lib
)

install(DIRECTORY ${CMAKE_SOURCE_DIR}/Clucene
        DESTINATION include
        PATTERN "*.cpp" EXCLUDE
        PATTERN "*.am" EXCLUDE
        PATTERN "*.in" EXCLUDE
        PATTERN "README" EXCLUDE
        PATTERN "*.v2" EXCLUDE
        PATTERN "*.txt" EXCLUDE
        PATTERN "*.cmake" EXCLUDE
        PATTERN "*.h"
)
install(DIRECTORY ${CMAKE_BINARY_DIR}/Clucene
        DESTINATION include
        PATTERN "*.h"
)

install(FILES ${CMAKE_SOURCE_DIR}/CLucene.h
        DESTINATION include)
