# Get the name of the current directory but with no path:
#get_filename_component(TARGET ${CMAKE_CURRENT_BINARY_DIR} NAME)

set(TARGET minexpert)
set(MINEXPERT_TARGET ${TARGET})
set(TITLE_TARGET mineXpert)

# Name the target module to be able to get its name in the parent directory.
set_directory_properties(PROPERTIES MINEXPERT_TARGET ${MINEXPERT_TARGET})

# On windows, the binary will be with the .exe extension.
if(SYSTEM_UNAME_S MATCHES "^MINGW.*")
	set(TARGET ${TARGET}.exe)
endif()

message("")
message(STATUS "${BoldGreen}Starting configuring of the ${TARGET} submodule${ColourReset}")
message("")

#############################################################
# Software configuration

message(STATUS "CMAKE_CURRENT_BINARY_DIR: " ${CMAKE_CURRENT_BINARY_DIR})

########################################################
# Files
file(GLOB ../config.h)
file(GLOB ${TARGET}_nongui_SRCS nongui/*.cpp)
file(GLOB ${TARGET}_gui_SRCS gui/*.cpp)
file(GLOB ${TARGET}_SRCS *.cpp)
file(GLOB ${TARGET}_UIS gui/ui/*.ui)

# The desktop file
if(UNIX AND NOT APPLE)
	install(FILES ${TARGET}.desktop
		DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
endif(UNIX AND NOT APPLE)


# The UNIX man page
if(UNIX AND NOT APPLE)

	# Major requirement, generate the man pages right off the docbook xml files.
	message(STATUS "Going to generate ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}.1")

	execute_process(COMMAND docbook-to-man ${TARGET}.xml
		OUTPUT_FILE	${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}.1
		WORKING_DIRECTORY	${CMAKE_CURRENT_SOURCE_DIR})

	install(FILES ${TARGET}.1
		DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1)

endif(UNIX AND NOT APPLE)


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

find_package(Qt5 COMPONENTS Widgets Xml Svg Sql Script)

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

qt5_add_resources(${TARGET}QRC_CPP gui/application.qrc)

add_executable(${TARGET}
	${${TARGET}_nongui_SRCS}
	${${TARGET}_gui_SRCS}
	${${TARGET}_SRCS}
	${${TARGET}_UIS_H}
	${${TARGET}QRC_CPP})

qt5_use_modules(${TARGET} Widgets)
qt5_use_modules(${TARGET} Xml)
qt5_use_modules(${TARGET} Svg)
qt5_use_modules(${TARGET} Sql)
qt5_use_modules(${TARGET} Script)
qt5_use_modules(${TARGET} PrintSupport)

include_directories(
	# For the config.h file generated from config.h.in	
	${CMAKE_BINARY_DIR}

	# For the ui_Xyyyyy.h files
	${CMAKE_CURRENT_BINARY_DIR} 

	${CMAKE_CURRENT_SOURCE_DIR}
	${CMAKE_CURRENT_SOURCE_DIR}/nongui
	${CMAKE_CURRENT_SOURCE_DIR}/gui

	${CMAKE_SOURCE_DIR}/libmass
	${CMAKE_SOURCE_DIR}/libmassgui

	${CMAKE_BINARY_DIR}/libmass
	${CMAKE_BINARY_DIR}/libmassgui

	${Qt5Widgets_INCLUDE_DIRS}
	${Qt5Xml_INCLUDE_DIRS}
	${Qt5Svg_INCLUDE_DIRS}
	${Qt5Sql_INCLUDE_DIRS}
	${Qt5Script_INCLUDE_DIRS}
	${Qt5PrintSupport_INCLUDE_DIRS})


# On GNU/Linux, make sure we have the QCustomPlot library
# installed on the system (on MINGW, we have the
# source files (see above).
if(NOT SYSTEM_UNAME_S MATCHES "^MINGW.*")
	find_package(QCustomPlot)

	if(NOT QCustomPlot_FOUND)
		message(FATAL_ERROR "QCustomPlot not found!")
	endif()
endif()


 ##On MINGW, we need to add the qcustomplot directory
 ##that contains the header file and the tclap headers.
#if(SYSTEM_UNAME_S MATCHES "^MINGW.*")
	#include_directories(${CMAKE_SOURCE_DIR}/qcustomplot)
	#include_directories(${CMAKE_SOURCE_DIR})  for the tclap
#endif()

# Now handle the private libraries for non-gui stuff (libmass.a) and gui stuff
# (libmassgui.a)
set(MASSLIB -Wl,-whole-archive ${CMAKE_BINARY_DIR}/libmass/libmass.a -Wl,-no-whole-archive)
set(MASSGUILIB -Wl,-whole-archive ${CMAKE_BINARY_DIR}/libmassgui/libmassgui.a -Wl,-no-whole-archive)

message(STATUS "libdir: ${CMAKE_BINARY_DIR}/libmass/libmass.a")
message(STATUS "guilibdir: ${CMAKE_BINARY_DIR}/libmassgui/libmassgui.a")


# Use the Widgets module from Qt 5. We craft a variable for this so as to
# transmit it directly to the tests subdirectory that will need it.
# Also, take the opportunity to ask for linking of the libgomp or lomp OPENMP
# library, depending on the compiler.

message(STATUS "Using parallelizing library ${OPENMP_LIBRARY}")

set(required_target_link_libraries
	${MASSLIB}
	${MASSGUILIB}
	${OPENMP_LIBRARY}	
	Qt5::Widgets
	Qt5::Xml
	Qt5::Svg
	Qt5::Sql
	Qt5::Script
	Qt5::PrintSupport)


##############################################################
# libpwiz for reading mass spec data files,
message(STATUS "${BoldYellow}Link against the libpwiz library.${ColourReset}")
if(SYSTEM_UNAME_S MATCHES "^MINGW.*")
	include_directories(/mingw64/include/pwiz)
else()
	include_directories(/usr/include/pwiz)
endif()

set(required_target_link_libraries
	${required_target_link_libraries}
	pwiz)

##############################################################
# libboost_* on mingw
# On MINGW.* we are our own provider of the boost libraries.
if(SYSTEM_UNAME_S MATCHES "^MINGW.*")

	message(STATUS "${BoldYellow}Link against the libboost libraries.${ColourReset}")

	include_directories(${CMAKE_SOURCE_DIR}/../../boost/boost_1_56_0) 

	set(required_target_link_libraries
		${required_target_link_libraries}
		boost_chrono
		boost_filesystem
		boost_iostreams
		boost_program_options
		boost_serialization
		boost_system
		boost_thread
		z)
endif()


# On MINGW.*, we'll need to add the -lstdc++ flag. Don't ask why.
if(SYSTEM_UNAME_S MATCHES "^MINGW.*")
	set(required_target_link_libraries
		${required_target_link_libraries}
		"stdc++")
endif()

# When not on MINGW.*, we can make use the system-wide qcustomplot library.
if(NOT SYSTEM_UNAME_S MATCHES "^MINGW.*")
	set(required_target_link_libraries
		${required_target_link_libraries}
		"qcustomplot")
endif()


#### Debugging stuff
# message(STATUS required_target_link_libraries: ${required_target_link_libraries})
#get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
#foreach(dir ${dirs})
  #message(STATUS "included dir='${dir}'")
#endforeach()


# Finally actually set the liking dependencies to the executable.
target_link_libraries(${TARGET}
	${required_target_link_libraries})


# Add an explicit dependency to libmass and libmassgui so that when invoking
# make from inside the massxpert bin build dir, the dependencies get built, same
# stuff for make ${TARGET}_user_manual.
add_dependencies(${TARGET} mass massgui)


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

install(TARGETS ${TARGET} RUNTIME DESTINATION ${MSXPERTSUITE_BIN_DIR})


#############################################################
##########################
# BUILD OF THE USER MANUAL

if(${BUILD_USER_MANUALS})
	message(STATUS "${TITLE_TARGET} user manual to be built")
	if(NOT SYSTEM_UNAME_S MATCHES "^MINGW64_NT" AND NOT APPLE)
		add_subdirectory(user-manual)
	endif()
endif()


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