# Top-level CMakeLists.txt for the CMake-based build and test system
# of the iwidgets software.

# Copyright (C) 2013-2014 Alan W. Irwin

# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU Library General Public License as published
# by the Free Software Foundation; version 2 of the License.
#
# This file 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 Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with this file; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA

# The traditional autoconf build of iwidgets that was created in 2002
# or earlier is completely broken and difficult to understand because
# lots of the install is done in a low-level way.
# Therefore, this is an attempt to replace that build system with a
# rational CMake-based build system that actually works.

# N.B. This "build" system only installs files so
# no compiler is required for this project
project(iwidgets NONE)

message(STATUS "CMake version = ${CMAKE_VERSION}")
message(STATUS "CMAKE_SYSTEM = ${CMAKE_SYSTEM}")
message(STATUS "CMAKE_GENERATOR = ${CMAKE_GENERATOR}")
message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")

cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)

option(BUILD_IWIDGETS_4.1 "Build iwidgets 4.1" OFF)

if(BUILD_IWIDGETS_4.1)
  # install iwidgets 4.1 that is associated with version 4 of itcl and itk.
  # Note the only difference between iwidgets 4.1 and 4.0 source code
  # is a small patch.  We assume that patch has been applied for this case.
  set(ITCL_VERSION 4.0)
  set(VERSION 4.1.0)
else(BUILD_IWIDGETS_4.1)
  # install iwidgets 4.0 that is associated with version 3 of itcl and itk.
  set(ITCL_VERSION 3.2)
  set(VERSION 4.0.1)
endif(BUILD_IWIDGETS_4.1)

set(PACKAGE iwidgets${VERSION})

# Set up install locations.
set(
  CMAKE_INSTALL_SCRIPTS_DIR
  ${CMAKE_INSTALL_PREFIX}/lib/${PACKAGE}
  CACHE PATH "install location for iwidgets scripts."
  )

set(
  CMAKE_INSTALL_DOC_DIR
  ${CMAKE_INSTALL_PREFIX}/share/doc/${PACKAGE}
  CACHE PATH "install location for iwidgets scripts."
  )

set(
  CMAKE_INSTALL_MAN_DIR
  ${CMAKE_INSTALL_PREFIX}/share/man
  CACHE PATH "install location for man documentation"
  )

# Install configured iwidgets.tcl and pkgIndex.tcl.
configure_file(iwidgets.tcl.in iwidgets.tcl @ONLY)
configure_file(pkgIndex.tcl.in pkgIndex.tcl @ONLY)
install(
  FILES
  ${CMAKE_CURRENT_BINARY_DIR}/iwidgets.tcl
  ${CMAKE_CURRENT_BINARY_DIR}/pkgIndex.tcl
  DESTINATION ${CMAKE_INSTALL_SCRIPTS_DIR}
  )

# Install selected files from the generic subdirectory.

file(GLOB generic_FILE_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} generic/*.itk generic/*.itcl generic/tclIndex generic/*.gif)
install(
  FILES
  ${generic_FILE_LIST}
  DESTINATION ${CMAKE_INSTALL_SCRIPTS_DIR}/scripts
  )

# Install some individual files to the documentation directory.
install(
  FILES
  CHANGES ChangeLog README license.terms
  DESTINATION ${CMAKE_INSTALL_DOC_DIR}
  )


# Install demos, demos/images, and demos/html.

file(GLOB demos_FILE_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} demos/*)
list(REMOVE_ITEM demos_FILE_LIST demos/images demos/html)
install(
  FILES
  ${demos_FILE_LIST}
  DESTINATION ${CMAKE_INSTALL_DOC_DIR}/demos
  )

file(GLOB demos_images_FILE_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} demos/images/*)
install(
  FILES
  ${demos_images_FILE_LIST}
  DESTINATION ${CMAKE_INSTALL_DOC_DIR}/demos/images
  )
file(GLOB demos_html_FILE_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} demos/html/*)
install(
  FILES
  ${demos_html_FILE_LIST}
  DESTINATION ${CMAKE_INSTALL_DOC_DIR}/demos/html
  )

# Install transformed man pages using "iwidgets_" filename suffix.
# (All these changes copied exactly from the traditional build system
# except that I use default 644 permissions [which is consistent
# with the permissions of Debian man pages].)

file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc)

find_program(SED_EXECUTABLE sed)
if(NOT SED_EXECUTABLE)
  message(FATAL_ERROR "sed required for build but not found")
endif(NOT SED_EXECUTABLE)

file(GLOB man_FILE_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} doc/*.n)
foreach(manpage ${man_FILE_LIST})
  string(REGEX REPLACE "^doc/" "doc/iwidgets_" processed_manpage ${manpage})
  execute_process(
    COMMAND
    ${SED_EXECUTABLE} -e "/man\\.macros/r ${CMAKE_CURRENT_SOURCE_DIR}/doc/man.macros" -e "/man\\.macros/d"
    INPUT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${manpage}
    OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${processed_manpage}
    )
endforeach(manpage ${man_FILE_LIST})

file(GLOB man_FILE_LIST ${CMAKE_CURRENT_BINARY_DIR}/doc/*.n)
install(
  FILES
  ${man_FILE_LIST}
  DESTINATION ${CMAKE_INSTALL_MAN_DIR}/mann
  )
