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


########################################################
# Files
set(${TARGET}_nongui_SRCS
  nongui/globals.cpp
  nongui/CleaveOligomer.cpp
  nongui/CleaveOptions.cpp
  nongui/Cleaver.cpp
  nongui/CrossLinkedRegion.cpp
  nongui/FragOptions.cpp
  nongui/Fragmenter.cpp
  nongui/FragmentOligomer.cpp
  nongui/OligomerList.cpp
  nongui/OligomerPair.cpp
  nongui/PkaPhPi.cpp
  nongui/PkaPhPiDataParser.cpp
  nongui/PolChemDefCatParser.cpp
  nongui/MassList.cpp
  nongui/ConfigSetting.cpp
  nongui/ConfigSettings.cpp
  nongui/UserSpec.cpp
)


set(${TARGET}_gui_SRCS
  gui/AboutDlg.cpp
  gui/AbstractMainTaskWindow.cpp
  gui/AbstractPolChemDefDependentDlg.cpp
  gui/AbstractSeqEdWndDependentDlg.cpp
  gui/Application.cpp
  gui/ChemEntVignette.cpp
  gui/ChemEntVignetteRenderer.cpp
  gui/CalculatorChemPadDlg.cpp
  gui/CalculatorChemPadGroupBox.cpp
  gui/CalculatorRecorderDlg.cpp
  gui/CalculatorWnd.cpp
  gui/ChemPadButton.cpp
  gui/CleavageDlg.cpp
  gui/CleaveOligomerTableView.cpp
  gui/CleaveOligomerTableViewMimeData.cpp
  gui/CleaveOligomerTableViewModel.cpp
  gui/CleaveOligomerTableViewSortProxyModel.cpp
  gui/CleaveSpecDefDlg.cpp
  gui/CompositionTreeView.cpp
  gui/CompositionTreeViewItem.cpp
  gui/CompositionTreeViewModel.cpp
  gui/CompositionTreeViewSortProxyModel.cpp
  gui/CompositionsDlg.cpp
  gui/ConfigSettingsDlg.cpp
  gui/CrossLinkerDefDlg.cpp
  gui/DecimalPlacesOptionsDlg.cpp
  gui/FragSpecDefDlg.cpp
  gui/FragmentOligomerTableView.cpp
  gui/FragmentOligomerTableViewMimeData.cpp
  gui/FragmentOligomerTableViewModel.cpp
  gui/FragmentOligomerTableViewSortProxyModel.cpp
  gui/FragmentationDlg.cpp
  gui/IsotopeDefDlg.cpp
  gui/ProgramWindow.cpp
  gui/MassListSorterDlg.cpp
  gui/MassSearchDlg.cpp
  gui/MassSearchOligomerTableView.cpp
  gui/MassSearchOligomerTableViewMimeData.cpp
  gui/MassSearchOligomerTableViewModel.cpp
  gui/MassSearchOligomerTableViewSortProxyModel.cpp
  gui/ModifDefDlg.cpp
  gui/MonomerCodeEvaluator.cpp
  gui/MonomerCrossLinkDlg.cpp
  gui/MonomerDefDlg.cpp
  gui/MonomerModificationDlg.cpp
  gui/MzCalculationDlg.cpp
  gui/MzCalculationTreeView.cpp
  gui/MzCalculationTreeViewItem.cpp
  gui/MzCalculationTreeViewModel.cpp
  gui/MzCalculationTreeViewSortProxyModel.cpp
  gui/MzLabFormulaBasedActionsDlg.cpp
  gui/MzLabInputOligomerTableView.cpp
  gui/MzLabInputOligomerTableViewDlg.cpp
  gui/MzLabInputOligomerTableViewModel.cpp
  gui/MzLabInputOligomerTableViewSortProxyModel.cpp
  gui/MzLabMassBasedActionsDlg.cpp
  gui/MzLabMatchBasedActionsDlg.cpp
  gui/MzLabOutputOligomerTableView.cpp
  gui/MzLabOutputOligomerTableViewDlg.cpp
  gui/MzLabOutputOligomerTableViewModel.cpp
  gui/MzLabOutputOligomerTableViewSortProxyModel.cpp
  gui/MzLabWnd.cpp
  gui/PkaPhPiDlg.cpp
  gui/PolChemDefRendering.cpp
  gui/PolChemDefWnd.cpp
  gui/PolymerModificationDlg.cpp
  gui/RegionSelection.cpp
  gui/SeqToolsDlg.cpp
  gui/SequenceEditorFindDlg.cpp
  gui/SequenceEditorGraphicsView.cpp
  gui/SequenceEditorGraphicsViewKeySequenceHandling.cpp
  gui/SequenceEditorGraphicsViewKeyboardHandling.cpp
  gui/SequenceEditorWnd.cpp
  gui/SequenceImportDlg.cpp
  gui/SequencePurificationDlg.cpp
  gui/SequenceSelection.cpp
)

set(${TARGET}_UIS
  gui/ui/AboutDlg.ui
  gui/ui/AbstractPolChemDefDependentDlg.ui
  gui/ui/CalculatorChemPadDlg.ui
  gui/ui/CalculatorRecorderDlg.ui
  gui/ui/CalculatorWnd.ui
  gui/ui/CleavageDlg.ui
  gui/ui/CleaveSpecDefDlg.ui
  gui/ui/CompositionsDlg.ui
  gui/ui/ConfigSettingsDlg.ui
  gui/ui/CrossLinkerDefDlg.ui
  gui/ui/DecimalPlacesOptionsDlg.ui
  gui/ui/FragSpecDefDlg.ui
  gui/ui/FragmentationDlg.ui
  gui/ui/IsotopeDefDlg.ui
  gui/ui/MassSearchDlg.ui
  gui/ui/ModifDefDlg.ui
  gui/ui/MonomerCrossLinkDlg.ui
  gui/ui/MonomerDefDlg.ui
  gui/ui/MonomerModificationDlg.ui
  gui/ui/MzCalculationDlg.ui
  gui/ui/MzLabFormulaBasedActionsDlg.ui
  gui/ui/MzLabInputOligomerTableViewDlg.ui
  gui/ui/MzLabMassBasedActionsDlg.ui
  gui/ui/MzLabMatchBasedActionsDlg.ui
  gui/ui/MzLabOutputOligomerTableViewDlg.ui
  gui/ui/MzLabWnd.ui
  gui/ui/NumeralsLocaleConverterDlg.ui
  gui/ui/PkaPhPiDlg.ui
  gui/ui/PolChemDefWnd.ui
  gui/ui/PolymerModificationDlg.ui
  gui/ui/SequenceEditorFindDlg.ui
  gui/ui/SequenceEditorWnd.ui
  gui/ui/SequenceImportDlg.ui
  gui/ui/SequencePurificationDlg.ui
)

qt6_wrap_ui(${TARGET}_UIS_H ${${TARGET}_UIS})

qt6_add_resources(${TARGET}_QRC_CPP ../${LOWCASE_PROJECT_NAME}.qrc)

# Instruct CMake to run automatically when needed the following:
set(CMAKE_AUTOMOC ON) # For meta object compiler
set(CMAKE_AUTORCC ON) # Resource files

include_directories(

  # The config file is binary directory-specific !!!
  # For the config.h file generated from config.h.in
  # For the ui_Xyyyyy.h files
  ${CMAKE_CURRENT_BINARY_DIR}

  # For all the source subdirectories
  ${CMAKE_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
)


###############################################################
# Configuration of the binary to be built
###############################################################

# Only now can we add the executable, because we have defined the sources of the
# object library above.

if(WIN32 OR _WIN32)

  add_executable(${TARGET}
    main.cpp
    ${${TARGET}_nongui_SRCS}
    ${${TARGET}_gui_SRCS}
    ${${TARGET}_UIS_H}
    ${${TARGET}_QRC_CPP}
    ${PLATFORM_SPECIFIC_SOURCES}
  )

  # In Debug mode we want the console to be opened so that we can read the debug
  # messages. But in Release mode the console is not desirable (the snippet
  # below removes it).
  if(CMAKE_BUILD_TYPE STREQUAL "Release")
    set_property(TARGET ${TARGET} PROPERTY WIN32_EXECUTABLE true)
  endif()

elseif(UNIX)

  add_executable(${TARGET}
    main.cpp
    ${${TARGET}_nongui_SRCS}
    ${${TARGET}_gui_SRCS}
    ${${TARGET}_UIS_H}
    ${${TARGET}_QRC_CPP}
    ${PLATFORM_SPECIFIC_SOURCES}
  )

endif()


# Finally actually set the linking dependencies to the executable.
# Note that there are so many cross-dependencies that it is virtually unfeasible
# to actually link the binary without resorting to the linker dance steps below.

# Still, I discovered that the order below is good with respect of the symbols
# dependencies resolutions when linking

# The general idea is to first list the libraries that *use* symbols and later
# libraries that *provide* symbols. Which is why all the Qt libs are listed at
# the end and the private libs are listed first.
target_link_libraries(${TARGET}

  -Wl,--whole-archive
  libmass::nongui
  libmass::gui
  -Wl,--no-whole-archive

  -Wl,--no-as-needed
  PappsoMSpp::Core
  -Wl,--as-needed

  -Wl,--no-as-needed
  IsoSpec++::IsoSpec++
  -Wl,--as-needed

  Qt6::Widgets
  Qt6::Svg
  Qt6::SvgWidgets
  Qt6::PrintSupport
  Qt6::Xml
  Qt6::Network
)


if(PROFILE)
  message(STATUS "Profiling is requested, adding linker -pg flag.")
  set (CMAKE_EXE_LINKER_FLAGS "-pg")
endif()

# We want to install the binary arch-dependent target in
# specific situations. To have proper control, we define the arch
# component.
install(TARGETS ${TARGET}
  RUNTIME
  COMPONENT arch
  DESTINATION ${BIN_DIR})


message("")
message(STATUS "${BoldGreen}Finished configuring of ${TARGET}.${ColourReset}")
message("")

