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_PCRE2)
	SET_PROPERTY(SOURCE utils/pfregexp.c APPEND PROPERTY INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIRS}")
	SET_PROPERTY(SOURCE prg/pfsearch.c APPEND PROPERTY INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIRS}")
ENDIF(USE_PCRE2)
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_PCRE2)
	TARGET_LINK_LIBRARIES(pfsearchV3 ${PCRE2_LIBRARY})
	TARGET_LINK_LIBRARIES(pfscanV3 ${PCRE2_LIBRARY})
ENDIF(USE_PCRE2)
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_PCRE2)
	TARGET_LINK_LIBRARIES(pfdump ${PCRE2_LIBRARY})
ENDIF(USE_PCRE2)
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)

