# CMake script for PAPPSOms++ library
# Author: Olivier Langella
# Created: 03/03/2015
# Rework: April 2020 (Coronavirus confinement)
# Major rework of the whole project structure, Filippo Rusconi, summer 2025

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

add_definitions(-DWITHOUT_MZ5)

########################################################
# Files
set(CPP_FILES
    types.cpp
    utils.cpp
    mzrange.cpp
    precision.cpp
    amino_acid/aa.cpp
    amino_acid/aabase.cpp
    amino_acid/aacode.cpp
    amino_acid/aamodification.cpp
    amino_acid/aastringcodec.cpp
    amino_acid/aastringcodemassmatching.cpp
    amino_acid/atomnumberinterface.cpp
    amino_acid/chemicalformula.cpp
    massspectrum/massspectrumid.cpp
    massspectrum/massspectrum.cpp
    massspectrum/qualifiedmassspectrum.cpp
    fasta/fastafileindexer.cpp
    fasta/fastareader.cpp
    fasta/fastaoutputstream.cpp
    grouping/grpexperiment.cpp
    grouping/grppeptide.cpp
    grouping/grpprotein.cpp
    grouping/grpgroup.cpp
    grouping/grpsubgroup.cpp
    grouping/grppeptideset.cpp
    grouping/grpmappeptidetogroup.cpp
    grouping/grpmappeptidetosubgroupset.cpp
    grouping/grpsubgroupset.cpp
    grouping/grpgroupingmonitor.cpp
    masschroq/input/jsoninput.cpp
    masschroq/input/precursorparser.cpp
    masschroq/output/cboroutputstream.cpp
    masschroq/alignmentmethod.cpp
    masschroq/mbrpeptidemeasurements.cpp
    masschroq/msrun.cpp
    masschroq/msrungroup.cpp
    masschroq/msrunpeptidelist.cpp
    masschroq/peptide.cpp
    masschroq/peptidebase.cpp
    masschroq/peptidelabel.cpp
    masschroq/peptidemeasurements.cpp
    masschroq/peptidemeasurementsbase.cpp
    masschroq/peptideobservation.cpp
    masschroq/precursor.cpp
    masschroq/protein.cpp
    masschroq/quantificationmethod.cpp
    masschroq/utils.cpp
    msfile/msfileaccessor.cpp
    msfile/msfilereader.cpp
    msfile/mzformatenumstr.cpp
    msfile/pwizmsfilereader.cpp
    msfile/timsmsfilereader.cpp
    msfile/xymsfilereader.cpp
    msfile/bafasciifilereader.cpp
    msrun/spectrumcollectionhandlerinterface.cpp
    msrun/alignment/msrunretentiontime.cpp
    msrun/alignment/template.cpp
    msrun/output/mzxmloutput.cpp
    msrun/output/mgfoutput.cpp
    msrun/msrundatasettreenode.cpp
    msrun/msrundatasettree.cpp
    msrun/msrunid.cpp
    msrun/msrunreader.cpp
    msrun/msrunreadconfig.cpp
    msrun/private/pwizmsrunreader.cpp
    msrun/private/timsmsrunreader.cpp
    msrun/private/timsmsrunreaderbase.cpp
    msrun/private/timsmsrunreaderdia.cpp
    msrun/private/timsframesmsrunreader.cpp
    msrun/private/timsmsrunreaderms2.cpp
    msrun/private/timsmsrunreaderms2selected.cpp
    msrun/xiccoord/ionmobilitygrid.cpp
    msrun/xiccoord/xiccoord.cpp
    msrun/xiccoord/xiccoordtims.cpp
    msrun/xymsrunreader.cpp
    msrun/bafasciimsrunreader.cpp
    obo/filterobopsimodmap.cpp
    obo/filterobopsimodsink.cpp
    obo/filterobopsimodtermaccession.cpp
    obo/filterobopsimodtermdiffmono.cpp
    obo/filterobopsimodtermlabel.cpp
    obo/filterobopsimodtermname.cpp
    obo/obopsimod.cpp
    obo/obopsimodterm.cpp
    obo/obopsims.cpp
    obo/obounimod.cpp
    peptide/ion.cpp
    peptide/peptideinterface.cpp
    peptide/peptide.cpp
    peptide/peptidefragment.cpp
    peptide/peptidefragmention.cpp
    peptide/peptidefragmentionlistbase.cpp
    peptide/peptidenaturalisotope.cpp
    peptide/peptidenaturalisotopelist.cpp
    peptide/peptidenaturalisotopeaverage.cpp
    peptide/peptideproformaparser.cpp
    peptide/peptiderawfragmentmasses.cpp
    peptide/peptidestrparser.cpp
    processing/cbor/cborstreamreader.cpp
    processing/cbor/cborstreamreaderinterface.cpp
    processing/cbor/cborstreamwriter.cpp
    processing/cbor/jsonstreamwriter.cpp
    processing/cbor/psm/cborscanmapbase.cpp
    processing/cbor/psm/psmcbor2json.cpp
    processing/cbor/psm/psmcborutils.cpp
    processing/cbor/psm/psmfileappend.cpp
    processing/cbor/psm/psmfilereaderbase.cpp
    processing/cbor/psm/psmfilescanprocess.cpp
    processing/cbor/psm/psmfilescanprocessandcopy.cpp
    processing/cbor/psm/psmproteinmap.cpp
    processing/cbor/psm/evalscan/psmfeatures.cpp
    processing/cbor/psm/evalscan/psmfeaturesscan.cpp
    processing/cbor/psm/evalscan/psmionseries.cpp
    processing/cbor/psm/evalscan/psmspecglob.cpp
    processing/cbor/psm/evalscan/psmspecglobscan.cpp
    processing/cbor/psm/evalscan/psmspecpeptidoms.cpp
    processing/cbor/psm/mzidentml/mzidentmlreader.cpp
    processing/cbor/psm/sage/sagefilereader.cpp
    processing/cbor/psm/sage/sagereader.cpp
    processing/cbor/psm/sage/sagetsvhandler.cpp
    processing/combiners/mzintegrationparams.cpp
    processing/combiners/integrationscopebase.cpp
    processing/combiners/integrationscope.cpp
    processing/combiners/integrationscoperect.cpp
    processing/combiners/integrationscoperhomb.cpp
    processing/combiners/selectionpolygon.cpp
    processing/combiners/tracecombiner.cpp
    processing/combiners/traceminuscombiner.cpp
    processing/combiners/tracepluscombiner.cpp
    processing/combiners/massdatacombinerinterface.cpp
    processing/combiners/massspectrumcombiner.cpp
    processing/combiners/massspectrumpluscombiner.cpp
    processing/combiners/massspectrumminuscombiner.cpp
    processing/compartraces/cosinesimilarity.cpp
    processing/detection/tracedetectionzivy.cpp
    processing/detection/tracedetectionmoulon.cpp
    processing/detection/tracepeak.cpp
    processing/detection/tracepeaklist.cpp
    processing/filters/filterchargedeconvolution.cpp
    processing/filters/filtercomplementionenhancer.cpp
    processing/filters/filterexclusionmz.cpp
    processing/filters/filterlocalmaximum.cpp
    processing/filters/filtermorpho.cpp
    processing/filters/filternameinterface.cpp
    processing/filters/filterpass.cpp
    processing/filters/filterpeakdelta.cpp
    processing/filters/filterremovec13.cpp
    processing/filters/filterresample.cpp
    processing/filters/filtersuite.cpp
    processing/filters/filtersuitestring.cpp
    processing/filters/filtertandemremovec13.cpp
    processing/filters/filtertriangle.cpp
    processing/filters/savgolfilter.cpp
    processing/filters/filterflooramplitudepercentage.cpp
    processing/filters/filterceilingamplitudepercentage.cpp
    processing/filters/filterlowintensitysignalremoval.cpp
    processing/filters/filternormalizeintensities.cpp
    processing/project/projectparameters.cpp
    processing/specglob/experimentalspectrum.cpp
    processing/specglob/peptidemodel.cpp
    processing/specglob/peptidespectrum.cpp
    processing/specglob/posttreatment.cpp
    processing/specglob/scorevalues.cpp
    processing/specglob/spectralalignment.cpp
    processing/specpeptidoms/correctiontree.cpp
    processing/specpeptidoms/locationsaver.cpp
    processing/specpeptidoms/peptidemodel.cpp
    processing/specpeptidoms/scenario.cpp
    processing/specpeptidoms/scorevalues.cpp
    processing/specpeptidoms/semiglobalalignment.cpp
    processing/specpeptidoms/spomsprotein.cpp
    processing/specpeptidoms/spomsspectrum.cpp
    processing/specself/selfspectrum.cpp
    processing/specself/selfspectrumdatapoint.cpp
    processing/spectree/bucket.cpp
    processing/spectree/bucketclustering.cpp
    processing/spectree/itemcart.cpp
    processing/spectree/spectree.cpp
    processing/spectree/specxtractinterface.cpp
    processing/tandemwrapper/tandemwrapperrun.cpp
    processing/tandemwrapper/wraptandeminput.cpp
    processing/tandemwrapper/wraptandemresults.cpp
    processing/tandemwrapper/xtandempresetreader.cpp
    processing/uimonitor/uimonitortext.cpp
    processing/uimonitor/uimonitortextpercent.cpp
    processing/xml/mzidentmlwriter.cpp
    processing/xml/xmlstreamreaderinterface.cpp
    protein/enzyme.cpp
    protein/peptidesizefilter.cpp
    protein/peptidebuilder.cpp
    protein/peptidevariablemodificationbuilder.cpp
    protein/peptidevariablemodificationreplacement.cpp
    protein/peptidefixedmodificationbuilder.cpp
    protein/peptidemodificatorbase.cpp
    protein/peptidemodificatortee.cpp
    protein/peptidemethioninremove.cpp
    protein/peptidemodificatorpipeline.cpp
    protein/peptidesemienzyme.cpp
    protein/protein.cpp
    protein/proteinintegercode.cpp
    protein/proteinpresenceabsencematrix.cpp
    psm/deepprot/deepprotenum.cpp
    psm/experimental/ionisotoperatioscore.cpp
    psm/features/psmfeatures.cpp
    psm/morpheus/morpheusscore.cpp
    psm/peakionmatch.cpp
    psm/peakionisotopematch.cpp
    psm/peptidespectrummatch.cpp
    psm/peptideisotopespectrummatch.cpp
    psm/xtandem/xtandemhyperscore.cpp
    psm/xtandem/xtandemhyperscorebis.cpp
    psm/xtandem/xtandemspectrumprocess.cpp
    trace/datapoint.cpp
    trace/linearregression.cpp
    trace/maptrace.cpp
    trace/trace.cpp
    vendors/tims/mobilitytraces/timsframemobilitytraces.cpp
    vendors/tims/mzcalibration/cardano.cpp
    vendors/tims/mzcalibration/mzcalibrationinterface.cpp
    vendors/tims/mzcalibration/mzcalibrationmodel1.cpp
    vendors/tims/mzcalibration/mzcalibrationstore.cpp
    vendors/tims/xicextractor/timsdirectxicextractor.cpp
    vendors/tims/xicextractor/timsxicextractorinterface.cpp
    vendors/tims/timsbindec.cpp
    vendors/tims/timsdata.cpp
    vendors/tims/timsdatafastmap.cpp
    vendors/tims/timsddaprecursors.cpp
    vendors/tims/timsdiaslices.cpp
    vendors/tims/timsframe.cpp
    vendors/tims/timsframerawdatachunck.cpp
    vendors/tims/timsframebase.cpp
    vendors/tims/timsframetype1.cpp
    vendors/tims/timsms2centroidfilter.cpp
    xic/xic.cpp
    xic/qualifiedxic.cpp
    xic/xicpeptideinterface.cpp
    xic/xicpeptidefragmention.cpp
    xic/xicpeptidefragmentionnaturalisotope.cpp
    xicextractor/private/msrunslice.cpp
    xicextractor/private/msrunxicextractor.cpp
    xicextractor/private/msrunxicextractordisk.cpp
    xicextractor/private/msrunxicextractordiskbuffer.cpp
    xicextractor/msrunxicextractorfactory.cpp
    xicextractor/msrunxicextractorinterface.cpp
    #
    # Scripting
    js_qml/jsclassregistrar.cpp
    js_qml/pappsojsqml.cpp
    js_qml/datapointjs.cpp
    js_qml/qpointfjs.cpp
    js_qml/tracejs.cpp
    js_qml/massspectrumjs.cpp
)

# generate rules for building source files from the resources
# and the JS reference text also.
qt6_add_resources(QRC_SRCS libpappsomspp_core_resources.qrc)

message("Generated the following resource files: ${QRC_SRCS}")

file(GLOB_RECURSE Core_HEADERS
    LIST_DIRECTORIES false
    RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
    "*.h"
)
message(STATUS "Core header files: ${Core_HEADERS}")

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

#############################################################
# Build the static lib
add_library(
    Core_static STATIC
    ${Core_HEADERS} ${CPP_FILES} ${QRC_SRCS}
)

set_target_properties(
    Core_static
    PROPERTIES EXPORT_NAME "Core_static"
               OUTPUT_NAME pappsomspp-core
               CLEAN_DIRECT_OUTPUT 1
               LINK_FLAGS "-Wl,--whole-archive"
)

target_compile_definitions(Core_static PRIVATE -DPMSPP_LIBRARY)

target_link_libraries(
    Core_static
    PUBLIC Boost::iostreams
           Boost::filesystem
           Boost::thread
           Boost::chrono
           PwizLite::PwizLite
           SQLite3::SQLite3
           Qt6::Svg
           Qt6::Sql
           Qt6::Concurrent
           Qt6::Xml
           Qt6::Core5Compat
           Qt6::Core
           Qt6::Qml
           ZLIB::ZLIB
           Zstd::Zstd
           liblzf::liblzf
           OdsStream::Core
)

if(NEEDHDF5)
    target_link_libraries(pappsomspp-static hdf5::hdf5_cpp)
endif(NEEDHDF5)

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

# The install interface that is ${prefix}/include.

target_include_directories(
    Core_static
    PUBLIC # These include directories are for building of this lib.
           $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src>
           # These include directories are for users of this lib.
           $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

get_target_property(Core_static_INCLUDES Core_static INCLUDE_DIRECTORIES)
message(STATUS "Core_static_INCLUDES: ${Core_static_INCLUDES}")

install(
    TARGETS Core_static
    EXPORT PappsoMSppStaticTargets
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    INCLUDES
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

# Export shared targets
install(
    EXPORT PappsoMSppStaticTargets
    FILE PappsoMSppStaticTargets.cmake
    NAMESPACE PappsoMSpp::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pappsomspp
)

export(
    EXPORT PappsoMSppStaticTargets
    FILE "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSppStaticTargets.cmake"
    NAMESPACE PappsoMSpp::
)

#############################################################
# Build the shared lib
add_library(
    Core SHARED
    ${Core_HEADERS} ${CPP_FILES} ${QRC_SRCS}
)

set_target_properties(
    Core
    PROPERTIES EXPORT_NAME "Core"
               OUTPUT_NAME pappsomspp-core
               CLEAN_DIRECT_OUTPUT 1
               VERSION ${PAPPSOMSPP_VERSION}
               SOVERSION ${PAPPSOMSPP_VERSION_MAJOR}
               LINK_FLAGS "-Wl,--no-as-needed ${LINKER_FLAGS}"
               POSITION_INDEPENDENT_CODE ON
)

target_compile_definitions(Core PRIVATE -DPMSPP_LIBRARY)

target_link_libraries(
    Core
    PUBLIC PwizLite::PwizLite
           Boost::iostreams
           Boost::filesystem
           Boost::thread
           Boost::chrono
           SQLite3::SQLite3
           Qt6::PrintSupport
           Qt6::Gui
           Qt6::Svg
           Qt6::Sql
           Qt6::Concurrent
           Qt6::Qml
           Qt6::Xml
           Qt6::Core5Compat
           Qt6::Core
           ZLIB::ZLIB
           Zstd::Zstd
           liblzf::liblzf
           OdsStream::Core
)

if(NEEDHDF5)
    target_link_libraries(pappsomspp-shared hdf5::hdf5_cpp)
endif(NEEDHDF5)

# Should check that this still required. It was years ago.
if(WIN32 OR _WIN32)
    #target_link_libraries(Core stdc++)
endif()

# The INSTALL_INTERFACE that is ${prefix}/include

target_include_directories(
    Core
    PUBLIC # These include directories are for building of this lib.
           $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src>
           # These include directories are for users of this lib.
           $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

get_target_property(Core_INCLUDES Core INCLUDE_DIRECTORIES)
message(STATUS "Core_INCLUDES: ${Core_INCLUDES}")

# Install libs

install(
    TARGETS Core
    EXPORT PappsoMSppSharedTargets
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    INCLUDES
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

# Export shared targets
install(
    EXPORT PappsoMSppSharedTargets
    FILE PappsoMSppSharedTargets.cmake
    NAMESPACE PappsoMSpp::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pappsomspp
)

export(
    EXPORT PappsoMSppSharedTargets
    FILE "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSppSharedTargets.cmake"
    NAMESPACE PappsoMSpp::
)

# Generate and install config files
include(CMakePackageConfigHelpers)

if(UNIX)
    configure_package_config_file(
        ${CMAKE_UTILS_PATH}/modules/PappsoMSppConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSppConfig.cmake"
        INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pappsomspp
    )

    write_basic_package_version_file(
        "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSppConfigVersion.cmake"
        VERSION "${PAPPSOMSPP_VERSION_MAJOR}.${PAPPSOMSPP_VERSION_MINOR}"
        COMPATIBILITY SameMinorVersion
    )

    install(
        FILES "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSppConfig.cmake"
              "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSppConfigVersion.cmake"
              # The SQLite3 database as shipped on Debian has no CMake
              # configuration file.
              ${CMAKE_UTILS_PATH}/modules/FindSQLite3.cmake
              ${CMAKE_UTILS_PATH}/modules/FindZstd.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pappsomspp
    )
endif()

message("\n${BoldGreen}Done configuring src/ for ${PROJECT_NAME}${ColourReset}\n")
