# -*- cmake -*-
############################################################################
# Copyright (c) 2015 Saint Petersburg State University
# Copyright (c) 2011-2014 Saint Petersburg Academic University
# All Rights Reserved
# See file LICENSE for details.
############################################################################

# Hard prerequisites
cmake_minimum_required(VERSION 2.8.12)

# allow more human readable "if then else" constructs
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE) 

# modules to find additional libraries (like zlib, boost and etc)
# Add path for custom modules
set(CMAKE_MODULE_PATH
  ${CMAKE_MODULE_PATH}
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
# Define various dirs
set(SPADES_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(SPADES_MODULES_DIR ${SPADES_MAIN_SRC_DIR}/common)
set(SPADES_MAIN_INCLUDE_DIR ${SPADES_MAIN_SRC_DIR}/include)
set(SPADES_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(SPADES_TOOLS_BINARY_DIR ${SPADES_BINARY_DIR}/bin)
set(SPADES_BUILT_INCLUDE_DIR ${SPADES_BINARY_DIR}/include)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${SPADES_TOOLS_BINARY_DIR})
set(EXT_DIR "${CMAKE_SOURCE_DIR}/../ext")
set(SPADES_CFG_DIR "${CMAKE_SOURCE_DIR}/../configs")

# Uncomment for gprof profiling
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
#SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
#SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")

# Everything option-dependent
include(options)

# Sanity check our source directory to make sure that we are not trying to
# generate an in-tree build 
if ((CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) OR
    (CMAKE_SOURCE_DIR STREQUAL "${CMAKE_BINARY_DIR}/src"))
  message(FATAL_ERROR "In-source builds are not allowed.
Please create a directory and run cmake from there, passing the path
to this source directory as the last argument.
This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
Please delete them.")
endif()

# Handle commond deps
include(deps)

# Add flags if necessary
include(flags)

# Handle common includes
include(includes)

# Handle common libs
include(libs)

include(GetGitRevisionDescription)
get_git_head_revision(SPADES_GIT_REFSPEC SPADES_GIT_SHA1)
if ((NOT SPADES_GIT_REFSPEC) OR (SPADES_GIT_REFSPEC STREQUAL "GITDIR-NOTFOUND"))
  set(SPADES_GIT_REFSPEC "N/A")
endif()
if (NOT SPADES_GIT_SHA1)
  set(SPADES_GIT_SHA1 "N/A")
endif()

message("Building SPAdes from ${SPADES_GIT_REFSPEC}, sha: ${SPADES_GIT_SHA1}")

configure_file("${SPADES_MAIN_INCLUDE_DIR}/config.hpp.in"
               "${SPADES_BUILT_INCLUDE_DIR}/config.hpp")
configure_file("${SPADES_MAIN_INCLUDE_DIR}/version.hpp.in"
               "${SPADES_BUILT_INCLUDE_DIR}/version.hpp")

# Build external dependencies (if any)
add_subdirectory("${EXT_DIR}/src" "${Project_BINARY_DIR}/ext")
add_subdirectory("${EXT_DIR}/tools" "${Project_BINARY_DIR}/ext_tools")

# Setup warnings
add_compile_options(-Wall -Wextra -Wconversion -Wno-sign-conversion -Wno-long-long -Wwrite-strings)
if (NOT OPENMP_FOUND)
  add_compile_options(-Wno-unknown-pragmas)
endif()

# sub projects
add_subdirectory(common)
add_subdirectory(projects)
add_subdirectory(spades_pipeline)


# Main pipeline script
install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/../spades.py"
        DESTINATION bin
        COMPONENT runtime)
install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/../dipspades.py"
        DESTINATION bin
        COMPONENT runtime)
install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/../metaspades.py"
        DESTINATION bin
        COMPONENT runtime)
install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/../plasmidspades.py"
        DESTINATION bin
        COMPONENT runtime)
install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/../rnaspades.py"
        DESTINATION bin
        COMPONENT runtime)
install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/../truspades.py"
        DESTINATION bin
        COMPONENT runtime)

install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../spades_init.py"
        DESTINATION bin
        COMPONENT runtime)
# FIXME: Should we just configure spades_init instead?
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../VERSION"
        DESTINATION share/spades
        COMPONENT runtime)
# Test datasets
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../test_dataset"
        DESTINATION share/spades)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../test_dataset_truspades"
        DESTINATION share/spades)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../test_dataset_plasmid"
        DESTINATION share/spades)
# manual, LICENSE, and GPLv2
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../manual.html"
        DESTINATION share/spades
        COMPONENT runtime)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../manual.md"
        DESTINATION share/spades
        COMPONENT runtime)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../dipspades_manual.html"
        DESTINATION share/spades
        COMPONENT runtime)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../truspades_manual.html"
        DESTINATION share/spades
        COMPONENT runtime)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../rnaspades_manual.html"
        DESTINATION share/spades
        COMPONENT runtime)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE"
        DESTINATION share/spades
        COMPONENT runtime)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../GPLv2.txt"
        DESTINATION share/spades
        COMPONENT runtime)

# Random stuff
include(CMakeListsInternal.txt)

# Packaging
include(pack)

# Workaround for poor CLion users
file(GLOB_RECURSE clion_all_headers
  ${CMAKE_SOURCE_DIR}/*.hpp ${CMAKE_SOURCE_DIR}/*.h)
add_custom_target(all_clion SOURCES ${clion_all_headers})
