##############################################################
# Level: trunk/src/cxx/libraries/prime/CMakeLists.txt
##############################################################

flex_target(MyScanner NHX.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.c COMPILE_FLAGS "-Pyytree_" )
bison_target(MyParser NHXparse.y ${CMAKE_CURRENT_BINARY_DIR}/NHXparse.c COMPILE_FLAGS "-d -y -p yytree_" ) 

add_flex_bison_dependency(MyScanner MyParser)


#link_directories( ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES}  )
#link_directories( ${LAPACK_LIBRARIES} )

include_directories( ${MPI_INCLUDE_PATH} )
include_directories( ${MPI_INCLUDE_PATH}/openmpi/ompi/mpi/cxx )

include_directories( /usr/lib/openmpi/include/openmpi/ompi/mpi/cxx )

message("mpilib is ${MPI_INCLUDE_PATH} ")
message("included path is ${CMAKE_INCLUDE_PATH} ")

# Generate XSD sources
#set(XSD_ARGS "cxx-tree" "--generate-ostream" "--generate-serialization")


file(MAKE_DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR}/io)

link_directories( ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES}  )

include_directories( ${CMAKE_CURRENT_BINARY_DIR}  )

set(TREE_SOURCES 	BranchSwapping.cc 
	DiscTree.cc 
	EdgeDiscPtMaps.cc 
	EdgeDiscTree.cc 
	EpochPtMaps.cc 
	EpochPtSet.cc 
	EpochTree.cc 
	InvMRCA.cc 
	Node.cc 
	NodeMap.cc 
	NodeNodeMap.cc 
	RandomTreeGenerator.cc
	StrStrMap.cc 
	Tree.cc 
	TreeAnalysis.cc 
	TreeDiscretizer.cc 
	TreeDiscretizers.cc 
	TreeMCMC.cc 
	TreeIO.cc 
        TreeInputOutput.cc
	TreeIOTraits.cc 
	TreePerturbationEvent.cc 
)

set(HYBRID_TREE_SOURCES 
	HybridBranchSwapping.cc 
	HybridTree.cc 
	HybridTreeIO.cc
	HybridTreeInputOutput.cc ) 

set(SEQ_SOURCES 	CacheSubstitutionModel.cc 
	FastCacheSubstitutionModel.cc 
	MatrixCache.cc 
	TransitionHandler.cc 
	MatrixTransitionHandler.cc 
	SeqIO.cc 
	SequenceGenerator.cc 
	SequenceType.cc 
	SequenceData.cc 
	SubstitutionModel.cc 
	SubstitutionMCMC.cc )

set(HYBRID_MODEL_SOURCES 	BDHybridTreeGenerator.cc 
	BirthDeathInHybridProbs.cc 
	BirthDeathInHybridMCMC.cc 
	HybridBDTreeGenerator.cc 
	HybridGuestTreeMCMC.cc 
	HybridGuestTreeModel.cc 
	HybridHostTreeMCMC.cc 
	HybridHostTreeModel.cc 
	EnumHybridGuestTreeMCMC.cc 
	EnumHybridGuestTreeModel.cc )


set(MODEL_SOURCES	
    BDTreeGenerator.cc
	BirthDeathMCMC.cc 
	BirthDeathProbs.cc 
	CongruentGuestTreeTimeMCMC.cc 
	DiscBirthDeathProbs.cc 
	EdgeDiscBDMCMC.cc 
	EdgeDiscBDProbs.cc 
	EdgeDiscGSR.cc 
	EpochBDTMCMC.cc 
	EpochBDTProbs.cc 
	EpochDLTRS.cc 
	GammaMap.cc 
	GuestTreeModel.cc 
	EnumerateReconciliationModel.cc 
	fastGEM_BirthDeathMCMC.cc 
	fastGEM_BirthDeathProbs.cc 
	fastGEM.cc 
	LambdaMap.cc 
	MaxReconciledTreeModel.cc 
	PerturbationObservable.cc 
	ReconciledTreeModel.cc 
	ReconciledTreeTimeModel.cc 
	ReconciledTreeTimeMCMC.cc 
	ReconciliationModel.cc 
	ReconciliationSampler.cc 
	ReconciliationTimeModel.cc 
	ReconciliationTimeMCMC.cc 
	ReconciliationTimeSampler.cc 
	ReconciliationTreeGenerator.cc 
	DLRSOrthoCalculator.cc
	SetOfNodes.cc 
	TopTimeMCMC.cc
#	DP_ML.cc
#	DPLengthFactorizer.cc
)

set(LSD_SOURCES
  lsd/LSDGeneTreeGenerator.cc
  lsd/LSDModelSelector.cc
  lsd/LSDProbs.cc
  lsd/LSDTimeProbs.cc
  lsd/ApproximateEstimator.cc
)

set(RATEMODEL_SOURCES 	ConstRateModel.cc 
	Density2P_common.cc 
	Density2P_positive.cc 
	Density2PMCMC.cc 
	EdgeRateMCMC.cc
        EdgeRateMCMC_common.cc
	EdgeRateModel_common.cc 
	EdgeWeightHandler.cc 
	EdgeWeightMCMC.cc 
	GammaDensity.cc 
	InvGaussDensity.cc 
	LengthRateModel.cc 
	LogNormDensity.cc 
	NormalDensity.cc 
	UniformDensity.cc 
	VarRateModel.cc 
	SiteRateHandler.cc )

set(MCMC_SOURCES   	DummyMCMC.cc 
	MCMCModel.cc 
	StdMCMCModel.cc 
	MCMCObject.cc 
	SimpleMCMC.cc 
	SimpleMCMCPostSample.cc 
	SimpleML.cc 
        mcmc/MCMCSampler.cc
        mcmc/GSRSampler.cc
        mcmc/PosteriorSampler.cc
        SimpleObserver.cc 
        MpiMCMC.cc
	MultiGSR.cc
        MpiMultiGSR.cc
)

set(AUXILIARY_SOURCES	AnError.cc 
	Beep.cc 
	BeepOption.cc 
	Hacks.cc 
	ODESolver.cc 
	PRNG.cc 
	PrimeOptionMap.cc 
	ProbabilityModel.cc 
	DiscreteGamma.cc 
	Probability.cc
        Tokenizer.cc
        TimeEstimator.cc
#	No cc-file:BeepVector.cc
)


set(LINEAR_ALGEBRA_SOURCES 	LA_Vector.cc 
	LA_Matrix.cc 
	LA_DiagonalMatrix.cc
)

set(PARSER_SOURCES NHXnode.c NHXtree.c NHXannotation.c ${FLEX_MyScanner_OUTPUTS} ${BISON_MyParser_OUTPUT_SOURCE}  )

foreach(i ${PARSER_SOURCES})
 set_source_files_properties(${i} PROPERTIES LANGUAGE C)
endforeach(i)


set(library_sources  ${PARSER_SOURCES}
${AUXILIARY_SOURCES} ${TREE_SOURCES} ${RATEMODEL_SOURCES} 
                ${MCMC_SOURCES} ${MODEL_SOURCES} ${HYBRID_TREE_SOURCES} 
                ${HYBRID_MODEL_SOURCES} ${SEQ_SOURCES} 
                ${LINEAR_ALGEBRA_SOURCES}
                ${CT_SOURCES} 
                ${PRIMEXML_SOURCES})

if(prime_dynamic) 
  add_library(prime-phylo SHARED io lsd mcmc ${library_sources})
#  set_target_properties(prime PROPERTIES LINKER_LANGUAGE CXX)

  install(TARGETS prime-phylo  LIBRARY DESTINATION lib/prime-phylo NAMELINK_SKIP)
else()
  add_library(prime-phylo STATIC io lsd mcmc ${library_sources})
  set_property(TARGET prime-phylo PROPERTY LINK_SEARCH_END_STATIC ON )
endif()

# ${MPI_COMPILE_FLAGS} was empty when I ran cmake on the Ferlin cluster /Erik Sjolund

set_source_files_properties(MpiMCMC.cxx PROPERTIES COMPILE_FLAGS "${MPI_CXX_COMPILE_FLAGS}")
set_source_files_properties(MpiMultiGSR.cxx PROPERTIES COMPILE_FLAGS "${MPI_CXX_COMPILE_FLAGS}")

# ${MPI_LINK_FLAGS} had the value "-Wl,--export-dynamic -Wl,--rpath -Wl,/pdc/vol/openmpi/1.2.6/intel/lib" 
# when I ran cmake on the Ferlin cluster. /Erik Sjolund

set_target_properties(prime-phylo PROPERTIES LINK_FLAGS "${MPI_CXX_LINK_FLAGS}" )

# ${LAPACK_LINKER_FLAGS} was empty when I ran cmake on the Ferlin cluster. /Erik Sjolund

set_target_properties(prime-phylo PROPERTIES LINK_FLAGS "${LAPACK_LINKER_FLAGS}" )







# find_target(LAPACK) also sets the variable LAPACK_LINKER_FLAGS
# The variable seems to be empty on my computer system when I uncomment:
# message(FATAL_ERROR  "LAPACK_LINKER_FLAGS=${LAPACK_LINKER_FLAGS}" )
#
# I'm not 100% sure how to use these extra flags, but I think it is possible to add
# them as an argument to target_link_libraries()
# /Erik Sjolund


# It seems to be a bug in FindMPI.cmake that makes us need to run separate_arguments() /Erik Sjolund 2012-02-12
set(MPI_CXX_LIBRARIES_bugfix ${MPI_CXX_LIBRARIES})
if (APPLE)
 separate_arguments(MPI_CXX_LIBRARIES_bugfix UNIX_COMMAND "${MPI_CXX_LIBRARIES}")
endif()

if(${CMAKE_CXX_COMPILER} MATCHES "icpc" )
 target_link_libraries(prime-phylo  ${LAPACK_LIBRARIES} mkl_intel_thread  mkl_core  guide  pthread  ${LIBXML2_LIBRARIES} ${MPI_CXX_LIBRARIES} ${Boost_LIBRARIES} prime-phylo-sfile)
else()
 target_link_libraries(prime-phylo   ${LAPACK_LIBRARIES}  ${LIBXML2_LIBRARIES} ${MPI_CXX_LIBRARIES} ${Boost_LIBRARIES} prime-phylo-sfile)
endif()


# Maybe  ${BLAS_LIBRARIES}  needs to be added to target_link_libraries ?

