ADD_DEFINITIONS("-I ${PFTOOLS_SOURCE_DIR}/src/C/include/")

################################## SSE 2 #####################################
ADD_SUBDIRECTORY(sse2)

################################# SSE 4.1 ####################################
ADD_SUBDIRECTORY(sse41)

################################## UTILS #####################################
ADD_SUBDIRECTORY(utils)

########################### REGULAR EXPRESSION ###############################
ADD_LIBRARY(REGEXP OBJECT utils/pfregexp.c)
IF(USE_PCRE)
  SET_PROPERTY(SOURCE utils/pfregexp.c APPEND PROPERTY INCLUDE_DIRECTORIES "${PCRE_INCLUDE_DIRS}")
  SET_PROPERTY(SOURCE prg/pfsearch.c APPEND PROPERTY INCLUDE_DIRECTORIES "${PCRE_INCLUDE_DIRS}")
ENDIF(USE_PCRE)


################################ LIBRARY #####################################
SET(PFTOOLS_LIB_SOURCES
    library/version.c
    library/heuristicInline.c
    library/profileInline.c
)
FOREACH(file IN LISTS LIBRARY_SSE2_SOURCES)
  SET(PFTOOLS_LIB_SOURCES ${PFTOOLS_LIB_SOURCES} sse2/${file})
  SET_SOURCE_FILES_PROPERTIES( sse2/${file} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_SSE2_FLAGS}")
ENDFOREACH(file)
FOREACH(file IN LISTS LIBRARY_SSE41_SOURCES)
  SET(PFTOOLS_LIB_SOURCES ${PFTOOLS_LIB_SOURCES} sse41/${file})
  SET_SOURCE_FILES_PROPERTIES( sse41/${file} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_SSE41_FLAGS}")
ENDFOREACH(file)
FOREACH(file IN LISTS LIBRARY_PROFILE_SOURCES)
  SET(PFTOOLS_LIB_SOURCES ${PFTOOLS_LIB_SOURCES} utils/${file})
ENDFOREACH(file)
FOREACH(file IN LISTS LIBRARY_SEQUENCE_SOURCES)
  SET(PFTOOLS_LIB_SOURCES ${PFTOOLS_LIB_SOURCES} utils/${file})
ENDFOREACH(file)
FOREACH(file IN LISTS LIBRARY_OUTPUT_FORMAT_SOURCES)
  SET(PFTOOLS_LIB_SOURCES ${PFTOOLS_LIB_SOURCES} utils/${file})
ENDFOREACH(file)
FOREACH(file IN LISTS LIBRARY_CALIBRATION_SOURCES)
  SET(PFTOOLS_LIB_SOURCES ${PFTOOLS_LIB_SOURCES} utils/${file})
ENDFOREACH(file)


IF(BUILD_SHARED_LIBS)
  ADD_LIBRARY(pftools_shared SHARED ${PFTOOLS_LIB_SOURCES})
  SET_TARGET_PROPERTIES(pftools_shared PROPERTIES LINKER_LANGUAGE C
				      SOVERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}"
				      LIBRARY_OUTPUT_NAME "pftools"
				      COMPILE_FLAGS "-DBUILD_LIBRARY -DUSINGDLL"
  )
ENDIF(BUILD_SHARED_LIBS)
IF(BUILD_STATIC_LIBS)
  ADD_LIBRARY(pftools STATIC ${PFTOOLS_LIB_SOURCES})
  SET_TARGET_PROPERTIES(pftools PROPERTIES LINKER_LANGUAGE C
				LIBRARY_OUTPUT_NAME "pftools"
				COMPILE_FLAGS "-DBUILD_LIBRARY"
  )
ENDIF(BUILD_STATIC_LIBS)

################################ PROGRAM #####################################
ADD_EXECUTABLE(pfsearchV3
	prg/pfsearch.c
	$<TARGET_OBJECTS:PROFILES>
	$<TARGET_OBJECTS:SEQUENCES>
	$<TARGET_OBJECTS:SSE2>
	$<TARGET_OBJECTS:SSE41>
	$<TARGET_OBJECTS:OUTPUT_FORMAT>
	$<TARGET_OBJECTS:REGEXP>
	$<TARGET_OBJECTS:SYSTEM>
)

ADD_EXECUTABLE(pfscanV3
	prg/pfscan.c
	$<TARGET_OBJECTS:PROFILES>
	$<TARGET_OBJECTS:SEQUENCES>
	$<TARGET_OBJECTS:REGEXP>
	$<TARGET_OBJECTS:SSE2>
	$<TARGET_OBJECTS:SSE41>
	$<TARGET_OBJECTS:OUTPUT_FORMAT>
	$<TARGET_OBJECTS:SYSTEM>
)

IF(USE_PCRE)
  TARGET_LINK_LIBRARIES(pfsearchV3 ${PCRE_LIBRARY})
  TARGET_LINK_LIBRARIES(pfscanV3 ${PCRE_LIBRARY})
ENDIF(USE_PCRE)

ADD_EXECUTABLE(pfcalibrateV3
	prg/pfcalibrate.c
	$<TARGET_OBJECTS:SSE2>
	$<TARGET_OBJECTS:SSE41>
	$<TARGET_OBJECTS:PROFILES>
	$<TARGET_OBJECTS:SEQUENCES_EXTRA>
	$<TARGET_OBJECTS:SEQUENCES>
	$<TARGET_OBJECTS:CALIBRATION>
	$<TARGET_OBJECTS:quantile>
	$<TARGET_OBJECTS:SYSTEM>
)

ADD_EXECUTABLE(pfindex
	prg/pfindex.c
	$<TARGET_OBJECTS:SEQUENCES>
)

IF(USE_PDF AND USE_PLPLOT)
    IF(BUILD_hpdf)
      ADD_DEPENDENCIES(pfcalibrateV3 libHaru)
      IF(BUILD_PLplot)
				ADD_DEPENDENCIES(pfcalibrateV3 PLplot)
      ENDIF(BUILD_PLplot)
    ENDIF(BUILD_hpdf)
    TARGET_LINK_LIBRARIES(pfcalibrateV3 ${hpdf_LIBRARY} ${PLplot_LIBRARIES})
ENDIF(USE_PDF AND USE_PLPLOT)
SET_TARGET_PROPERTIES(pfcalibrateV3 PROPERTIES LINKER_LANGUAGE C)


ADD_EXECUTABLE(pfdump utils/io.c $<TARGET_OBJECTS:REGEXP>)
SET_PROPERTY(TARGET pfdump APPEND PROPERTY COMPILE_DEFINITIONS _TEST)


IF(USE_PCRE)
  TARGET_LINK_LIBRARIES(pfdump ${PCRE_LIBRARY})
ENDIF(USE_PCRE)

ADD_EXECUTABLE(pfpam
	       utils/pam.c
	       utils/io.c
	       utils/random.c
	      )
SET_PROPERTY(TARGET pfpam APPEND PROPERTY COMPILE_DEFINITIONS _PFPAM)

ADD_EXECUTABLE(pfemit
	       utils/generatesequences.c
	       $<TARGET_OBJECTS:PROFILES>
	       utils/random.c
	      )
SET_PROPERTY(TARGET pfemit APPEND PROPERTY COMPILE_DEFINITIONS _PFEMIT)
TARGET_LINK_LIBRARIES(pfemit m)

ADD_EXECUTABLE(pfsplit prg/split.c)

SET(THREAD_SOURCES ${THREAD_SOURCES} prg/pfsearch.c prg/pfcalibrate.c prg/pfscan.c)
SET(THREAD_EXECUTABLES ${THREAD_EXECUTABLES} pfsearchV3 pfscanV3 pfcalibrateV3)
SET(EXECUTABLES ${THREAD_EXECUTABLES} pfemit pfpam pfdump pfindex)

IF(USE_AFFINITY)
  SET_PROPERTY(TARGET ${THREAD_EXECUTABLES} APPEND PROPERTY COMPILE_DEFINITIONS __USE_AFFINITY__)
ENDIF(USE_AFFINITY)

# IF(USE_RPATH AND NOT STANDALONE)
#   SET_PROPERTY(TARGET ${EXECUTABLES} PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
# ENDIF(USE_RPATH AND NOT STANDALONE)

IF(STANDALONE)
  SET_PROPERTY(TARGET ${EXECUTABLES} APPEND PROPERTY LINK_FLAGS -static)
ENDIF(STANDALONE)

IF(CMAKE_COMPILER_IS_INTELCC)
  FOREACH(target IN LISTS THREAD_EXECUTABLES)
     TARGET_LINK_LIBRARIES(${target} imf m)
  ENDFOREACH()
ELSE(CMAKE_COMPILER_IS_INTELCC)
  FOREACH(target IN LISTS THREAD_EXECUTABLES)
     TARGET_LINK_LIBRARIES(${target} m)
  ENDFOREACH()
ENDIF(CMAKE_COMPILER_IS_INTELCC)

IF(THREADS_HAVE_PTHREAD_ARG)
  SET_PROPERTY(SOURCE ${THREAD_SOURCES}
               APPEND PROPERTY COMPILE_FLAGS -pthread
               APPEND PROPERTY LINK_FLAGS -pthread)
ELSE(THREADS_HAVE_PTHREAD_ARG)
  FOREACH(target IN LISTS THREAD_EXECUTABLES)
     TARGET_LINK_LIBRARIES(${target} ${CMAKE_THREAD_LIBS_INIT})
  ENDFOREACH()
ENDIF(THREADS_HAVE_PTHREAD_ARG)

#########################################################################################
# Tests
IF(BUILD_TESTING)
	INCLUDE(${PROJECT_SOURCE_DIR}/cmake/tests/TestSuite_pfsearchV3.cmake)
ENDIF(BUILD_TESTING)

#########################################################################################
# Installation
INSTALL(TARGETS ${EXECUTABLES}
        DESTINATION bin
        COMPONENT Applications
)
IF(BUILD_SHARED_LIBS)
  INSTALL(TARGETS pftools_shared LIBRARY
	  DESTINATION lib
	  COMPONENT dev
  )
ENDIF(BUILD_SHARED_LIBS)
IF(BUILD_STATIC_LIBS)
  INSTALL(TARGETS pftools
	  DESTINATION lib LIBRARY
	  COMPONENT dev
  )
ENDIF(BUILD_STATIC_LIBS)
IF(BUILD_SHARED_LIBS OR BUILD_STATIC_LIBS)
  INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/../../pfConfig.h
                include/pfProfile.h
                include/pfSequence.h
                include/pfRegexp.h
                include/pfProfileInline.h
                include/pfHeuristicInline.h
                include/pfSequenceInline.h
          DESTINATION include/pftools/
          COMPONENT dev
          )
ENDIF(BUILD_SHARED_LIBS OR BUILD_STATIC_LIBS)

