# OpenVAS
# $Id$
# Description: Top-level cmake control for the Administrator.
#
# Authors:
# Matthew Mundell <matthew.mundell@greenbone.net>
# Michael Wiegand <michael.wiegand@greenbone.net>
#
# Copyright:
# Copyright (C) 2009, 2010 Greenbone Networks GmbH
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2,
# or, at your option, any later version as published by the Free
# Software Foundation
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

message ("-- Configuring the OpenVAS Administrator...")

project (openvas-administrator C)

cmake_minimum_required (VERSION 2.6)

if (POLICY CMP0005)
  cmake_policy (SET CMP0005 OLD)
endif (POLICY CMP0005)

if (NOT CMAKE_BUILD_TYPE)
  set (CMAKE_BUILD_TYPE Debug)
endif (NOT CMAKE_BUILD_TYPE)

## Retrieve svn revision (at configure time)
#  Not using Subversion_WC_INFO, as it would have to connect to the repo
find_program (SVN_EXECUTABLE svn DOC "subversion command line client")

macro (Subversion_GET_REVISION dir variable)
  execute_process (COMMAND ${SVN_EXECUTABLE} info ${CMAKE_SOURCE_DIR}/${dir}
                   OUTPUT_VARIABLE ${variable}
                   OUTPUT_STRIP_TRAILING_WHITESPACE)
  string (REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
          "\\2" ${variable} "${${variable}}")
endmacro (Subversion_GET_REVISION)

if (NOT CMAKE_BUILD_TYPE MATCHES "Release")
  if (EXISTS ".svn/")
    if (SVN_EXECUTABLE)
      Subversion_GET_REVISION(. ProjectRevision)
      set (SVN_REVISION ".SVN.r${ProjectRevision}")
    else (SVN_EXECUTABLE)
      set (SVN_REVISION ".SVN")
    endif (SVN_EXECUTABLE)
  endif (EXISTS ".svn/")
endif (NOT CMAKE_BUILD_TYPE MATCHES "Release")


## CPack configuration

set (CPACK_CMAKE_GENERATOR "Unix Makefiles")
set (CPACK_GENERATOR "TGZ")
set (CPACK_INSTALL_CMAKE_PROJECTS ".;openvas-administrator;ALL;/")
set (CPACK_MODULE_PATH "")
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
set (CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README")
set (CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/README")
set (CPACK_SOURCE_GENERATOR "TGZ")
set (CPACK_SOURCE_TOPLEVEL_TAG "")
set (CPACK_SYSTEM_NAME "")
set (CPACK_TOPLEVEL_TAG "")
set (CPACK_PACKAGE_VERSION_MAJOR "1")
set (CPACK_PACKAGE_VERSION_MINOR "0")
set (CPACK_PACKAGE_VERSION_PATCH "1${SVN_REVISION}")
set (CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set (CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${CPACK_PACKAGE_VERSION}")
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${CPACK_PACKAGE_VERSION}")
set (CPACK_PACKAGE_VENDOR "The OpenVAS Project")
set (CPACK_SOURCE_IGNORE_FILES
"/.svn/"
"/_CPack_Packages/"
"/CMakeFiles/"
"cmake$"
"swp$"
"Cache.txt$"
".tar.gz"
"install_manifest.txt"
"Makefile"
"log.conf$"
"Doxyfile$"
"Doxyfile_full$"
"VERSION$"
"/packaging"
)

include (CPack)

## Variables

if (SYSCONF_INSTALL_DIR)
  set (SYSCONFDIR "${SYSCONF_INSTALL_DIR}")
endif (SYSCONF_INSTALL_DIR)

if (NOT SYSCONFDIR)
  set (SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc")
endif (NOT SYSCONFDIR)

if (NOT EXEC_PREFIX)
  set (EXEC_PREFIX "${CMAKE_INSTALL_PREFIX}")
endif (NOT EXEC_PREFIX)

if (NOT BINDIR)
  set (BINDIR "${EXEC_PREFIX}/bin")
endif (NOT BINDIR)

if (NOT SBINDIR)
  set (SBINDIR "${EXEC_PREFIX}/sbin")
endif (NOT SBINDIR)

if (NOT LIBDIR)
  set (LIBDIR "${EXEC_PREFIX}/lib")
endif (NOT LIBDIR)

if (NOT LOCALSTATEDIR)
  set (LOCALSTATEDIR "${CMAKE_INSTALL_PREFIX}/var")
endif (NOT LOCALSTATEDIR)

if (NOT INCLUDEDIR)
  set (INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include")
endif (NOT INCLUDEDIR)

#if (NOT SYSCONFDIR)
#  set (SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc")
#endif (NOT SYSCONFDIR)

set (OPENVAS_STATE_DIR "${LOCALSTATEDIR}/lib/openvas")
set (OPENVAS_LOG_DIR   "${LOCALSTATEDIR}/log/openvas")
set (OPENVAS_PID_DIR   "${LOCALSTATEDIR}/run")
set (OPENVAS_SYSCONF_DIR "${SYSCONFDIR}/openvas")

set (OPENVAS_LIB_INSTALL_DIR    "${LIBDIR}")
set (OPENVAS_HEADER_INSTALL_DIR "${INCLUDEDIR}")
set (OPENVAS_SYNC_SCRIPT_DIR    "${SBINDIR}")
set (OPENVAS_SERVER_CERTIFICATE "${OPENVAS_STATE_DIR}/CA/servercert.pem")
set (OPENVAS_SERVER_KEY         "${OPENVAS_STATE_DIR}/private/CA/serverkey.pem")
set (OPENVAS_CA_CERTIFICATE     "${OPENVAS_STATE_DIR}/CA/cacert.pem")

set (OPENVAS_USERS_DIR          "${OPENVAS_STATE_DIR}/users/")
set (OPENVAS_CONFIG_FILE        "${SYSCONFDIR}/openvas/openvassd.conf")

message ("-- Install prefix: ${CMAKE_INSTALL_PREFIX}")

## Dependency checks
##
## TODO Also check for headers where needed.

message (STATUS "Looking for gnutls...")
find_library (GNUTLS gnutls)
message (STATUS "Looking for gnutls... ${GNUTLS}")
if (NOT GNUTLS)
  message (FATAL_ERROR "The gnutls library is required.")
endif (NOT GNUTLS)

message (STATUS "Looking for pcap...")
find_library (PCAP pcap)
message (STATUS "Looking for pcap... ${PCAP}")
if (NOT PCAP)
  message (FATAL_ERROR "The pcap library is required.")
endif (NOT PCAP)

message (STATUS "Looking for gpgme...")
find_library (GPGME gpgme)
message (STATUS "Looking for gpgme... ${GPGME}")
if (NOT GPGME)
  message (FATAL_ERROR "The gpgme library is required.")
endif (NOT GPGME)

message (STATUS "Looking for openvas_base...")
find_library (OPENVAS_BASE openvas_base)
message (STATUS "Looking for openvas_base... ${OPENVAS_BASE}")
if (NOT OPENVAS_BASE)
  message (FATAL_ERROR "The openvas_base library is required.")
endif (NOT OPENVAS_BASE)

message (STATUS "Looking for glib-2.0...")
find_library (GLIB2 glib-2.0)
message (STATUS "Looking for glib-2.0... ${GLIB2}")
if (NOT GLIB2)
  message (FATAL_ERROR "The glib-2.0 library is required.")
endif (NOT GLIB2)

message (STATUS "Looking for uuid...")
find_library (UUID uuid)
message (STATUS "Looking for uuid... ${UUID}")
if (NOT UUID)
  message (FATAL_ERROR "The uuid library is required.")
endif (NOT UUID)


# TODO This version check of libopenvas is also found in other
# modules (e.g. openvas-manager). Once a better solution is found, it should
# be applied in these modules, too.
# Either
# 1) Move to the next CMake version with built-in version comparison functions
# 2) Use the pkg-config configuration file that kost provided when installing
#    openvas-libraries
# 3) Move following checks in an own CMake- module to reuse. Other parts of
#    the various CMakeLists.txt could be moved in a common ("openvas") module,
#    too.

## Check version of libopenvas
# Obtain libopenvas version number
find_program (PATH_TO_LIBOPENVASCONFIG libopenvas-config DOC "libopenvas-config program"
                        " to retrieve information about installed"
                        " openvas-libraries in the system.")
if (PATH_TO_LIBOPENVASCONFIG)
  # Obtain libopenvas version number
  execute_process (COMMAND libopenvas-config --version
    OUTPUT_VARIABLE LIBOPENVAS_VERSION
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  # Make a (per definition: semicolon separated) list of it
  string (REGEX REPLACE "\\." ";" LO_VER ${LIBOPENVAS_VERSION})
  list (GET LO_VER 0 LO_MAJOR_VER)
  list (GET LO_VER 1 LO_MINOR_VER)
  list (GET LO_VER 2 LO_PATCH_VER)
  set (LIBOPENVAS_SUFFICIENT TRUE)
  # TODO Would like something like set (MIN_LO_VER "3" "0" "1")
  #      which would then make it easier to modify these. However, had serious
  #      issues with the conditionals, thus this clumsy implementation.
  set (LO_MAJOR_MIN_VER 3)
  set (LO_MINOR_MIN_VER 0)
  set (LO_PATCH_MIN_VER 6)
  set (LO_MAJOR_VER_FAIL FALSE)
  set (LO_MINOR_VER_FAIL FALSE)
  set (LO_PATCH_VER_FAIL FALSE)
  if (${LO_MAJOR_VER} LESS ${LO_MAJOR_MIN_VER})
    set (LO_MAJOR_VER_FAIL TRUE)
  endif (${LO_MAJOR_VER} LESS ${LO_MAJOR_MIN_VER})
  if (${LO_MAJOR_VER} EQUAL ${LO_MAJOR_MIN_VER} AND ${LO_MINOR_VER} LESS ${LO_MINOR_MIN_VER})
    set (LO_MINOR_VER_FAIL TRUE)
  endif (${LO_MAJOR_VER} EQUAL ${LO_MAJOR_MIN_VER} AND ${LO_MINOR_VER} LESS ${LO_MINOR_MIN_VER})
  if (${LO_MAJOR_VER} EQUAL ${LO_MAJOR_MIN_VER} AND ${LO_MINOR_VER} EQUAL ${LO_MINOR_MIN_VER} AND ${LO_PATCH_VER} LESS ${LO_PATCH_MIN_VER})
    set (LO_PATCH_VER_FAIL TRUE)
  endif (${LO_MAJOR_VER} EQUAL ${LO_MAJOR_MIN_VER} AND ${LO_MINOR_VER} EQUAL ${LO_MINOR_MIN_VER} AND ${LO_PATCH_VER} LESS ${LO_PATCH_MIN_VER})
  if (LO_MAJOR_VER_FAIL OR LO_MINOR_VER_FAIL OR LO_PATCH_VER_FAIL)
    message (FATAL_ERROR "openvas-libraries version >= ${LO_MAJOR_MIN_VER}.${LO_MINOR_MIN_VER}.${LO_PATCH_MIN_VER} not found.")
  endif (LO_MAJOR_VER_FAIL OR LO_MINOR_VER_FAIL OR LO_PATCH_VER_FAIL)

  # Check if openvas-libraries < 3.2.0, in which case we have to use the old include paths.
  # Can be removed once we require openvas-libraries >= 3.2.0 above.
  set (LO_MAJOR_VER_OLD FALSE)
  set (LO_MINOR_VER_OLD FALSE)
  set (LO_PATCH_VER_OLD FALSE)
  if (${LO_MAJOR_VER} LESS 3)
    set (LO_MAJOR_VER_OLD TRUE)
  endif (${LO_MAJOR_VER} LESS 3)
  if (${LO_MAJOR_VER} EQUAL 3 AND ${LO_MINOR_VER} LESS 2)
    set (LO_MINOR_VER_OLD TRUE)
  endif (${LO_MAJOR_VER} EQUAL 3 AND ${LO_MINOR_VER} LESS 2)
  if (${LO_MAJOR_VER} EQUAL 3 AND ${LO_MINOR_VER} EQUAL 2 AND ${LO_PATCH_VER} LESS 0)
    set (LO_PATCH_VER_OLD TRUE)
  endif (${LO_MAJOR_VER} EQUAL 3 AND ${LO_MINOR_VER} EQUAL 2 AND ${LO_PATCH_VER} LESS 0)
  if (LO_MAJOR_VER_OLD OR LO_MINOR_VER_OLD OR LO_PATCH_VER_OLD)
    set (LO_OLD_INCLUDE_PATH TRUE)
  endif (LO_MAJOR_VER_OLD OR LO_MINOR_VER_OLD OR LO_PATCH_VER_OLD)
else (PATH_TO_LIBOPENVASCONFIG)
   message (FATAL_ERROR "Could not determine openvas-libraries version.")
endif (PATH_TO_LIBOPENVASCONFIG)

## Version

string (REPLACE "
" "" OPENVASAD_VERSION ${CPACK_PACKAGE_VERSION})

# Configure Doxyfile with version number
configure_file (doc/Doxyfile.in doc/Doxyfile)
configure_file (doc/Doxyfile_full.in doc/Doxyfile_full)
configure_file (VERSION.in VERSION)

## Program

set (HARDENING_FLAGS            "-Wformat -Wformat-security -O2 -D_FORTIFY_SOURCE=2 -fstack-protector -Wl,-z,relro -Wl,-z,now")

set (CMAKE_C_FLAGS_DEBUG        "${CMAKE_C_FLAGS_DEBUG}")
set (CMAKE_C_FLAGS              "${CMAKE_C_FLAGS} ${HARDENING_FLAGS} -Wall -Werror")

add_subdirectory (src)

## Documentation

add_subdirectory (doc)

## Tests

enable_testing ()

## End
