cmake_minimum_required(VERSION 3.12)

# CMake script for pwizlite library
# Author: Filippo Rusconi
# Created: 29/05/2020

############################################################
############################################################
# Basic information about project

set(PROJECT pwizlite)
project(${PROJECT} CXX C)

set(PWIZLITE_VERSION_MAJOR "3")
set(PWIZLITE_VERSION_MINOR "0")
set(PWIZLITE_VERSION_PATCH "3")
set(PWIZLITE_VERSION "${PWIZLITE_VERSION_MAJOR}.${PWIZLITE_VERSION_MINOR}.${PWIZLITE_VERSION_PATCH}")
# This VERSION is parseable by the makeOrigTarball script.
set(VERSION 3.0.3)

message(STATUS "${BoldYellow}CMAKE_LIBRARY_ARCHITECTURE: ${CMAKE_LIBRARY_ARCHITECTURE}${ColourReset}")

# This line MUST be located prior to include'ing GNUInstallDirs !!!
# if CMAKE_INSTALL_PREFIX is /usr/local (default), then
# the CMAKE_LIBRARY_ARCHITECTURE above is not honoured when
# computing the CMAKE_INSTALL_FULL_LIBDIR.

set(CMAKE_INSTALL_PREFIX /usr)
message(STATUS "Set CMAKE_INSTALL_PREFIX to ${CMAKE_INSTALL_PREFIX}")

include(GNUInstallDirs)

message(STATUS "Install directory prefix: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "CMAKE_INSTALL_FULL_LIBDIR: ${CMAKE_INSTALL_FULL_LIBDIR}")
message(STATUS "CMAKE_INSTALL_FULL_INCLUDEDIR: ${CMAKE_INSTALL_FULL_INCLUDEDIR}")

# Add folder where are supportive functions
set(CMAKE_UTILS_PATH ${CMAKE_SOURCE_DIR}/CMakeStuff)
set(CMAKE_TOOLCHAINS_PATH ${CMAKE_UTILS_PATH}/toolchains)
set(CMAKE_MODULE_PATH ${CMAKE_UTILS_PATH}/modules)
#message("CMAKE_MODULE_PATH:" ${CMAKE_MODULE_PATH})

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Include the system's uname that fills in SYSTEM_UNAME_S.
# Sets WIN64 if SYSTEM_UNAME_S is "^.*MING64.*"
include(${CMAKE_UTILS_PATH}/systemUname.cmake)

# Include the various colors we want to use in the output
include(${CMAKE_UTILS_PATH}/outputColors.cmake)

set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)

message("\n${BoldRed}Configuring build for project ${PROJECT}${ColourReset}\n")

# This export will allow using the flags to be used by
# youcompleteme (vim plugin).
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)

if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json" )
    execute_process( COMMAND cmake -E copy_if_different
        ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json
        ${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json
        )
endif()


# We want C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
message(STATUS "Set CMAKE_CXX_STANDARD to 17 (required)")
message(STATUS "${BoldGreen}CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}${ColourReset}")

#############################################################
# We do not want warnings for unknown pragmas:
message(STATUS "Setting definition -Wno-unknown-pragmas.${ColourReset}")
add_definitions(-Wno-unknown-pragmas)
# Enable warnings and possibly treat them as errors
message(STATUS "${BoldGreen}Setting definition -Wall.${ColourReset}")
add_definitions(-Wall)
message(STATUS "${BoldGreen}Setting definition -Wextra.${ColourReset}")
add_definitions(-Wextra)

if(WARN_AS_ERROR)
    message(STATUS "${BoldYellow}Setting definition -Werror.${ColourReset}")
    add_definitions(-Werror)
endif()

message(STATUS "${BoldRed}CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}${ColourReset}")


#############################################################
#############################################################
# Platform-specific CMake configuration
if(MXE)
    include(${CMAKE_TOOLCHAINS_PATH}/mxe-toolchain.cmake)

    # Set the name to the systemUname variable because in this situation that name
    # is not found, it it passed as a flag in the command line.
    set(SYSTEM_UNAME_S "mxe")

elseif(UNIX AND NOT APPLE)

    include(${CMAKE_TOOLCHAINS_PATH}/unix-toolchain.cmake)

elseif(WIN32 OR _WIN32)

    if(WIN10MINGW64)

        include(${CMAKE_TOOLCHAINS_PATH}/win10-mingw64-toolchain.cmake)
    endif()

elseif(APPLE)

    include(${CMAKE_TOOLCHAINS_PATH}/apple-macport-toolchain.cmake)
endif()

message("")
message(STATUS "${BoldGreen}Starting configuration of ${PROJECT}${ColourReset}")
message("")
message(STATUS "${BoldYellow}The build toolchain is: ${SYSTEM_UNAME_S}${ColourReset}")
message("")


#############################################################
#############################################################
# Essential software configuration
message(STATUS "CMAKE_CURRENT_BINARY_DIR: " ${CMAKE_CURRENT_BINARY_DIR})

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING
        "Type of build, options are: None, Debug, Release, RelWithDebInfo, MinSizeRel."
        FORCE)
endif(NOT CMAKE_BUILD_TYPE)

if(CMAKE_BUILD_TYPE MATCHES "Release")
    message(STATUS "Compiling in release mode.")
    add_definitions("-DQT_NO_DEBUG_OUTPUT")
endif()

if(CMAKE_BUILD_TYPE MATCHES "Debug")
    message(STATUS "Compiling in debug mode: ${MAKE_TEST}.")
    message(STATUS "Add definition -ggdb3 to format debug output for GDB.")
    add_definitions(-ggdb3)
endif()

if(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
    message(STATUS "Compiling in release with debug info mode.")
endif( CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo" )

message(STATUS "${BoldYellow}CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}.${ColourReset}")


# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Set the CMAKE_PREFIX_PATH for the find_library fonction when using non
# standard install location
if(CMAKE_INSTALL_PREFIX)
    set(CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}" ${CMAKE_PREFIX_PATH})
endif()

# Before going down the directories, create a variable to store
# all the platform-specific library to link to
set(PLATFORM_SPECIFIC_LINK_LIBRARIES "")

# Subdirectories
message(STATUS "Adding subdirectory src for PROJECT: ${PROJECT}")
add_subdirectory(src)



set(CPACK_CMAKE_GENERATOR "Unix Makefiles")
set(CPACK_GENERATOR "STGZ;TGZ;TZ")
set(CPACK_OUTPUT_CONFIG_FILE "./CPackConfig.cmake")
#set(CPACK_PACKAGE_DESCRIPTION_FILE ${LIBODSSTREAM_SOURCE_DIR}/COPYING)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A library that contains a subset of the ProteoWizard libpwiz library with code mainly aimed at loading MS files (XML-based and MGF).")
set(CPACK_PACKAGE_EXECUTABLES "libpwizlite")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "libpwizlite-${PWIZLITE_VERSION}")
set(CPACK_SYSTEM_NAME "Linux-i686")
set(CPACK_PACKAGE_FILE_NAME "libpwizlite-${PWIZLITE_VERSION}-${CPACK_SYSTEM_NAME}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "libpwizlite ${PWIZLITE_VERSION}")
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "libpwizlite ${PWIZLITE_VERSION}")
set(CPACK_PACKAGE_NAME "libpwizlite")
set(CPACK_PACKAGE_VENDOR "PAPPSO")
set(CPACK_PACKAGE_VERSION ${PWIZLITE_VERSION})
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/debian/copyright)
set(CPACK_SOURCE_GENERATOR "TGZ;TZ")
set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "./CPackSourceConfig.cmake")
set(CPACK_SOURCE_STRIP_FILES "")
set(CPACK_SYSTEM_NAME "Linux-i686")
set(CPACK_TOPLEVEL_TAG "Linux-i686")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "libpwizlite-${PWIZLITE_VERSION}")


set(CPACK_SOURCE_IGNORE_FILES 
    ".*\\\\.tar\\\\.gz"
    "moc_.*cxx"
    "\\\\.#.*"
    ".*\\\\.aux"
    ".*\\\\.bbl"
    ".*\\\\.blg"
    ".*\\\\.log"
    ".*\\\\.out"
    ".*\\\\.toc"
    "/devel_archives/"
    "/doc\\\\/html/"
    "/doc\\\\/latex/"
    "Makefile"
    "install_manifest.txt"
    "CMakeCache.txt"
    "CPackConfig.cmake"
    "CPackSourceConfig.cmake"
    "/CMakeFiles/"
    "/_CPack_Packages/"
    "/Debug/"
    "/Release/"
    "/tests/"
    "/\\\\.externalToolBuilders/"
    "/\\\\.git/"
    "/\\\\.kdev4/"
    "/\\\\.settings/"
    "Makefile"
    "\\\\.gitignore"
    "\\\\.cdtbuild"
    "\\\\.cdtproject"
    "\\\\.project"
    "\\\\.cproject"
    "/win32/"
    "/win64/"
    "/build/"
    "/buildwin64/"
    "/cbuild/"
    "/wbuild/"
    "/bin/"
    "/buildmingw/"
    "test\\\\.ods"
    "buildwin32.cmd"
    "libpwizlite.so"
    "OpenDocument-v1.0-os.pdf"
    )


set(CPACK_PACKAGE_EXECUTABLES "libpwizlite" "libpwizlite")


# for debian package :
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Olivier Langella <olivier.langella@u-psud.fr>")
set(DEBIAN_PACKAGE_BUILDS_DEPENDS "Olivier Langella <olivier.langella@u-psud.fr>")


include(CPack)

# to create a TGZ archive of the  source code type shell command
# cpack -G TGZ --config CPackSourceConfig.cmake 


add_custom_target(targz
    cpack -G TGZ --config CPackSourceConfig.cmake && tar xvfz libpwizlite-${PWIZLITE_VERSION}.tar.gz
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    COMMENT "Creating .tar.gz" VERBATIM
    )


add_custom_target(deb
    ln -s libpwizlite-${PWIZLITE_VERSION}.tar.gz libpwizlite_${PWIZLITE_VERSION}.orig.tar.gz && cd libpwizlite-${PWIZLITE_VERSION} && dpkg-buildpackage -sa
    DEPENDS targz
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    COMMENT "Creating Debian package" VERBATIM
    )
