# CMake script for PAPPSOms++ library
# Author: Olivier Langella
# Created: 03/03/2015
# Rework: April 2020 (Coronavirus confinement)

message(\n${BoldRed}"Now configuring src/ for ${PROJECT_NAME}${ColourReset}\n")


configure_file (${CMAKE_UTILS_PATH}/src-pappsomspp-config.h.cmake.in ${CMAKE_BINARY_DIR}/src/config.h)


add_definitions(-DWITHOUT_MZ5)


########################################################
# Files
set(CPP_FILES
  pappsomspp/utils.cpp
  pappsomspp/mzrange.cpp
  pappsomspp/precision.cpp

  pappsomspp/amino_acid/aa.cpp
  pappsomspp/amino_acid/aabase.cpp
  pappsomspp/amino_acid/aacode.cpp
  pappsomspp/amino_acid/aamodification.cpp
  pappsomspp/amino_acid/aastringcodec.cpp
  pappsomspp/amino_acid/aastringcodemassmatching.cpp


  pappsomspp/massspectrum/massspectrumid.cpp
  pappsomspp/massspectrum/massspectrum.cpp
  pappsomspp/massspectrum/qualifiedmassspectrum.cpp


  pappsomspp/fasta/fastafileindexer.cpp
  pappsomspp/fasta/fastareader.cpp
  pappsomspp/fasta/fastaoutputstream.cpp

  pappsomspp/grouping/grpexperiment.cpp
  pappsomspp/grouping/grppeptide.cpp
  pappsomspp/grouping/grpprotein.cpp
  pappsomspp/grouping/grpgroup.cpp
  pappsomspp/grouping/grpsubgroup.cpp
  pappsomspp/grouping/grppeptideset.cpp
  pappsomspp/grouping/grpmappeptidetogroup.cpp
  pappsomspp/grouping/grpmappeptidetosubgroupset.cpp
  pappsomspp/grouping/grpsubgroupset.cpp
  pappsomspp/grouping/grpgroupingmonitor.cpp

  pappsomspp/msfile/msfileaccessor.cpp
  pappsomspp/msfile/msfilereader.cpp
  pappsomspp/msfile/mzformatenumstr.cpp
  pappsomspp/msfile/pwizmsfilereader.cpp
  pappsomspp/msfile/timsmsfilereader.cpp
  pappsomspp/msfile/xymsfilereader.cpp
  pappsomspp/msfile/bafasciifilereader.cpp

  pappsomspp/msrun/spectrumcollectionhandlerinterface.cpp
  pappsomspp/msrun/alignment/msrunretentiontime.cpp
  pappsomspp/msrun/alignment/template.cpp
  pappsomspp/msrun/output/mzxmloutput.cpp
  pappsomspp/msrun/output/mgfoutput.cpp
  pappsomspp/msrun/msrundatasettreenode.cpp
  pappsomspp/msrun/msrundatasettree.cpp
  pappsomspp/msrun/msrunid.cpp
  pappsomspp/msrun/msrunreader.cpp
  pappsomspp/msrun/msrunreadconfig.cpp
  pappsomspp/msrun/private/pwizmsrunreader.cpp
  pappsomspp/msrun/private/timsmsrunreader.cpp
  pappsomspp/msrun/private/timsmsrunreaderbase.cpp
  pappsomspp/msrun/private/timsmsrunreaderdia.cpp
  pappsomspp/msrun/private/timsframesmsrunreader.cpp
  pappsomspp/msrun/private/timsmsrunreaderms2.cpp
  pappsomspp/msrun/private/timsmsrunreaderms2selected.cpp
  pappsomspp/msrun/xiccoord/ionmobilitygrid.cpp
  pappsomspp/msrun/xiccoord/xiccoord.cpp
  pappsomspp/msrun/xiccoord/xiccoordtims.cpp
  pappsomspp/msrun/xymsrunreader.cpp
  pappsomspp/msrun/bafasciimsrunreader.cpp

  pappsomspp/obo/obopsimod.cpp
  pappsomspp/obo/obopsimodterm.cpp
  pappsomspp/obo/filterobopsimodsink.cpp
  pappsomspp/obo/filterobopsimodtermaccession.cpp
  pappsomspp/obo/filterobopsimodtermlabel.cpp
  pappsomspp/obo/filterobopsimodtermdiffmono.cpp
  pappsomspp/obo/filterobopsimodtermname.cpp

  pappsomspp/peptide/ion.cpp
  pappsomspp/peptide/peptideinterface.cpp
  pappsomspp/peptide/peptide.cpp
  pappsomspp/peptide/peptidefragment.cpp
  pappsomspp/peptide/peptidefragmention.cpp
  pappsomspp/peptide/peptidefragmentionlistbase.cpp
  pappsomspp/peptide/peptidenaturalisotope.cpp
  pappsomspp/peptide/peptidenaturalisotopelist.cpp
  pappsomspp/peptide/peptidenaturalisotopeaverage.cpp
  pappsomspp/peptide/peptideproformaparser.cpp
  pappsomspp/peptide/peptiderawfragmentmasses.cpp
  pappsomspp/peptide/peptidestrparser.cpp


  pappsomspp/processing/combiners/mzintegrationparams.cpp
  pappsomspp/processing/combiners/integrationscopebase.cpp
  pappsomspp/processing/combiners/integrationscope.cpp
  pappsomspp/processing/combiners/integrationscoperect.cpp
  pappsomspp/processing/combiners/integrationscoperhomb.cpp
  pappsomspp/processing/combiners/selectionpolygon.cpp
  pappsomspp/processing/combiners/tracecombiner.cpp
  pappsomspp/processing/combiners/traceminuscombiner.cpp
  pappsomspp/processing/combiners/tracepluscombiner.cpp
  pappsomspp/processing/combiners/massdatacombinerinterface.cpp
  pappsomspp/processing/combiners/massspectrumcombiner.cpp
  pappsomspp/processing/combiners/massspectrumpluscombiner.cpp
  pappsomspp/processing/combiners/massspectrumminuscombiner.cpp

  pappsomspp/processing/compartraces/cosinesimilarity.cpp

  pappsomspp/processing/detection/tracedetectionzivy.cpp
  pappsomspp/processing/detection/tracedetectionmoulon.cpp
  pappsomspp/processing/detection/tracepeak.cpp
  pappsomspp/processing/detection/tracepeaklist.cpp

  pappsomspp/processing/filters/filterchargedeconvolution.cpp
  pappsomspp/processing/filters/filtercomplementionenhancer.cpp
  pappsomspp/processing/filters/filterexclusionmz.cpp
  pappsomspp/processing/filters/filterlocalmaximum.cpp
  pappsomspp/processing/filters/filtermorpho.cpp
  pappsomspp/processing/filters/filternameinterface.cpp
  pappsomspp/processing/filters/filterpass.cpp
  pappsomspp/processing/filters/filterpeakdelta.cpp
  pappsomspp/processing/filters/filterremovec13.cpp
  pappsomspp/processing/filters/filterresample.cpp
  pappsomspp/processing/filters/filtersuite.cpp
  pappsomspp/processing/filters/filtersuitestring.cpp
  pappsomspp/processing/filters/filtertandemremovec13.cpp
  pappsomspp/processing/filters/filtertriangle.cpp
  pappsomspp/processing/filters/savgolfilter.cpp
  pappsomspp/processing/filters/filterflooramplitudepercentage.cpp
  pappsomspp/processing/filters/filterceilingamplitudepercentage.cpp
  pappsomspp/processing/filters/filterlowintensitysignalremoval.cpp
  pappsomspp/processing/filters/filternormalizeintensities.cpp

  pappsomspp/processing/specglob/experimentalspectrum.cpp
  pappsomspp/processing/specglob/peptidemodel.cpp
  pappsomspp/processing/specglob/peptidespectrum.cpp
  pappsomspp/processing/specglob/posttreatment.cpp
  pappsomspp/processing/specglob/scorevalues.cpp
  pappsomspp/processing/specglob/spectralalignment.cpp

  pappsomspp/processing/specself/selfspectrum.cpp
  pappsomspp/processing/specself/selfspectrumdatapoint.cpp

  pappsomspp/processing/spectree/bucket.cpp
  pappsomspp/processing/spectree/bucketclustering.cpp
  pappsomspp/processing/spectree/itemcart.cpp
  pappsomspp/processing/spectree/spectree.cpp
  pappsomspp/processing/spectree/specxtractinterface.cpp

  pappsomspp/processing/tandemwrapper/tandemwrapperrun.cpp
  pappsomspp/processing/tandemwrapper/wraptandeminput.cpp
  pappsomspp/processing/tandemwrapper/wraptandemresults.cpp
  pappsomspp/processing/tandemwrapper/xtandempresetreader.cpp

  pappsomspp/processing/uimonitor/uimonitortext.cpp
  pappsomspp/processing/uimonitor/uimonitortextpercent.cpp

  pappsomspp/processing/xml/mzidentmlwriter.cpp
  pappsomspp/processing/xml/xmlstreamreaderinterface.cpp

  pappsomspp/protein/enzyme.cpp
  pappsomspp/protein/peptidesizefilter.cpp
  pappsomspp/protein/peptidebuilder.cpp
  pappsomspp/protein/peptidevariablemodificationbuilder.cpp
  pappsomspp/protein/peptidevariablemodificationreplacement.cpp
  pappsomspp/protein/peptidefixedmodificationbuilder.cpp
  pappsomspp/protein/peptidemodificatorbase.cpp
  pappsomspp/protein/peptidemodificatortee.cpp
  pappsomspp/protein/peptidemethioninremove.cpp
  pappsomspp/protein/peptidemodificatorpipeline.cpp
  pappsomspp/protein/peptidesemienzyme.cpp
  pappsomspp/protein/protein.cpp
  pappsomspp/protein/proteinintegercode.cpp
  pappsomspp/protein/proteinpresenceabsencematrix.cpp

  pappsomspp/psm/deepprot/deepprotenum.cpp
  pappsomspp/psm/experimental/ionisotoperatioscore.cpp
  pappsomspp/psm/features/psmfeatures.cpp
  pappsomspp/psm/morpheus/morpheusscore.cpp
  pappsomspp/psm/peakionmatch.cpp
  pappsomspp/psm/peakionisotopematch.cpp
  pappsomspp/psm/peptidespectrummatch.cpp
  pappsomspp/psm/peptideisotopespectrummatch.cpp
  pappsomspp/psm/xtandem/xtandemhyperscore.cpp
  pappsomspp/psm/xtandem/xtandemhyperscorebis.cpp
  pappsomspp/psm/xtandem/xtandemspectrumprocess.cpp

  pappsomspp/trace/datapoint.cpp
  pappsomspp/trace/linearregression.cpp
  pappsomspp/trace/maptrace.cpp
  pappsomspp/trace/trace.cpp

  pappsomspp/vendors/tims/mobilitytraces/timsframemobilitytraces.cpp
  pappsomspp/vendors/tims/mzcalibration/cardano.cpp
  pappsomspp/vendors/tims/mzcalibration/mzcalibrationinterface.cpp
  pappsomspp/vendors/tims/mzcalibration/mzcalibrationmodel1.cpp
  pappsomspp/vendors/tims/mzcalibration/mzcalibrationstore.cpp
  pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp
  pappsomspp/vendors/tims/xicextractor/timsxicextractorinterface.cpp
  pappsomspp/vendors/tims/timsbindec.cpp
  pappsomspp/vendors/tims/timsdata.cpp
  pappsomspp/vendors/tims/timsdatafastmap.cpp
  pappsomspp/vendors/tims/timsddaprecursors.cpp
  pappsomspp/vendors/tims/timsdiaslices.cpp
  pappsomspp/vendors/tims/timsframe.cpp
  pappsomspp/vendors/tims/timsframerawdatachunck.cpp
  pappsomspp/vendors/tims/timsframebase.cpp
  pappsomspp/vendors/tims/timsframetype1.cpp
  pappsomspp/vendors/tims/timsms2centroidfilter.cpp

  pappsomspp/xic/xic.cpp
  pappsomspp/xic/qualifiedxic.cpp
  pappsomspp/xic/xicpeptideinterface.cpp
  pappsomspp/xic/xicpeptidefragmention.cpp
  pappsomspp/xic/xicpeptidefragmentionnaturalisotope.cpp


  pappsomspp/xicextractor/private/msrunslice.cpp
  pappsomspp/xicextractor/private/msrunxicextractor.cpp
  pappsomspp/xicextractor/private/msrunxicextractordisk.cpp
  pappsomspp/xicextractor/private/msrunxicextractordiskbuffer.cpp
  pappsomspp/xicextractor/msrunxicextractorfactory.cpp
  pappsomspp/xicextractor/msrunxicextractorinterface.cpp
)

set(pappsomspp_RCCS libpappsomsppresources.qrc)
# generate rules for building source files from the resources
qt6_add_resources(pappsomspp_RCC_SRCS ${pappsomspp_RCCS})

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)


#############################################################
# Build the static lib
add_library(pappsomspp-static STATIC ${CPP_FILES} ${pappsomspp_RCC_SRCS})

set_target_properties(pappsomspp-static
  PROPERTIES OUTPUT_NAME pappsomspp
  CLEAN_DIRECT_OUTPUT 1
  LINK_FLAGS -Wl,--whole-archive
)

target_include_directories(pappsomspp-static PUBLIC
  ${CMAKE_BINARY_DIR}/src
  ${PwizLite_INCLUDE_DIRS}
  ${liblzf_INCLUDE_DIRS}
)

message(STATUS "${BoldGreen}Setting definition -DPMSPP_LIBRARY for symbol DLL export.${ColourReset}")
target_compile_definitions(pappsomspp-static PRIVATE -DPMSPP_LIBRARY)

target_link_libraries(pappsomspp-static
  Boost::iostreams
  Boost::filesystem
  Boost::thread
  Boost::chrono
  PwizLite::PwizLite
  SQLite::SQLite3
  Qt6::Svg
  Qt6::Sql
  Qt6::Concurrent
  Qt6::Xml
  Qt6::Core5Compat
  Qt6::Core
  ZLIB::ZLIB
  Zstd::Zstd
  liblzf::liblzf
  hdf5::hdf5_cpp
)


# FIXME: should check that this still required. It was years ago.
if(WIN32 OR _WIN32)

  target_link_libraries(pappsomspp-static
    stdc++
  )
endif()


#############################################################
# Build the shared lib
add_library(pappsomspp-shared SHARED ${CPP_FILES} ${pappsomspp_RCC_SRCS})

set_target_properties(pappsomspp-shared
  PROPERTIES OUTPUT_NAME pappsomspp
  CLEAN_DIRECT_OUTPUT 1
  VERSION ${PAPPSOMSPP_VERSION}
  SOVERSION ${PAPPSOMSPP_VERSION_MAJOR}
  LINK_FLAGS "${LINKER_FLAGS}"
)

target_include_directories(pappsomspp-shared PUBLIC
  ${CMAKE_BINARY_DIR}/src
  ${PwizLite_INCLUDE_DIRS}
  ${liblzf_INCLUDE_DIRS}
)

message(STATUS "${BoldGreen}Setting definition -DPMSPP_LIBRARY for symbol DLL export.${ColourReset}")
target_compile_definitions(pappsomspp-shared PRIVATE -DPMSPP_LIBRARY)

target_link_libraries(pappsomspp-shared
  PwizLite::PwizLite
  Boost::iostreams
  Boost::filesystem
  Boost::thread
  Boost::chrono
  SQLite::SQLite3
  Qt6::PrintSupport
  Qt6::Gui
  Qt6::Svg
  Qt6::Sql
  Qt6::Concurrent
  Qt6::Xml
  Qt6::Core5Compat
  Qt6::Core
  ZLIB::ZLIB
  Zstd::Zstd
  liblzf::liblzf
  hdf5::hdf5_cpp
)

# Should check that this still required. It was years ago.
if(WIN32 OR _WIN32)

  target_link_libraries(pappsomspp-shared
    stdc++
  )

endif()


# Install libs

install(TARGETS pappsomspp-shared
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  # This one is for WIN32
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(TARGETS pappsomspp-static
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})


# Install headers
install(DIRECTORY pappsomspp/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pappsomspp
  FILES_MATCHING PATTERN "*.h"
  PATTERN "*.hpp")

add_subdirectory("pappsomspp/widget")
