Commit a6499cdf authored by Axel Beckert's avatar Axel Beckert

Imported Upstream version 0.9.2

parent b9c78f38
......@@ -21,3 +21,5 @@ Médéric Boquien <medericboquien at users.sourceforge.net>
Alain Coulais <alaingdl at users.sourceforge.net> (tests, bugs)
Sylwester Arabas <slayoo@users.sourceforge.net>
... see doc/udg/chapters/credits.tex for a more complete list
#
# copyright : (c) 2010 Maxime Lenoir and Alain Coulais
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# tested with 2.4 and doesn't seem to run.
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(GDL)
set(VERSION "0.9 CVS")
# we hope a 0.9.2 very soon !
# set(VERSION "0.9.2 CVS")
set(VERSION "0.9.2")
enable_testing()
include(CheckIncludeFile)
......@@ -38,6 +49,9 @@ set(WXWIDGETSDIR "" CACHE PATH "Specify WxWidgets directory tree")
set(UDUNITS OFF CACHE BOOL "Enable UDUNITS-2 ?")
set(UDUNITSDIR "" CACHE PATH "Specify the UDUNITS-2 directory tree")
set(PSLIB ON CACHE BOOL "Enable pslib ?")
set(PSLIBDIR "" CACHE PATH "Specify the pslib directory tree")
set(GRIB OFF CACHE BOOL "Enable Grib ?")
set(GRIBDIR "" CACHE PATH "Specifiy the GRIB directory tree")
......@@ -115,6 +129,7 @@ check_include_file(strings.h HAVE_STRINGS_H)
check_include_file(sys/stat.h HAVE_SYS_STAT_H)
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
check_include_file(unistd.h HAVE_UNISTD_H)
check_include_file(ext/stdio_filebuf.h HAVE_EXT_STDIO_FILEBUF_H)
# dlfcn.h
check_include_file(dlfcn.h HAVE_DLFCN_H)
......@@ -128,6 +143,10 @@ check_library_exists(m nexttoward "" HAVE_NEXTTOWARD)
# mpi
check_include_file(mpi.h HAVE_MPI_H)
# SA: whithout it compilation of antlr fails if there's a conflicting
# version of antlr in system-wide directories
include_directories(src)
# Ncurses MANDATORY
# -DNCURSESDIR=DIR
set(CMAKE_PREFIX_PATH ${NCURSESDIR})
......@@ -306,7 +325,7 @@ if(NETCDF)
message(FATAL_ERROR "NetCDF installation seems not to be usable.\n"
"This suggests a conflicting netCDF-HDF4 installation e.g.\n"
"- Uninstalling HDF4 after installation of NetCDF.\n"
"- Installing NetDCF before HDF4.")
"- Installing NetCDF before HDF4.")
endif(HAVE_NETCDFCPP_H)
set(CMAKE_REQUIRED_INCLUDES)
else(NETCDF_FOUND)
......@@ -451,15 +470,13 @@ if(PYTHON OR PYTHON_MODULE)
endif(PYTHONVERSION)
set(USE_PYTHON ${PYTHONLIBS_FOUND})
if(PYTHONLIBS_FOUND)
set(CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_DIRS})
check_include_file(numarray/libnumarray.h HAVE_LIBNUMARRAY_H)
if(NOT HAVE_LIBNUMARRAY_H)
message(FATAL_ERROR "Python numarray package was not found.\n"
find_package(Numpy QUIET)
if(NOT PYTHON_NUMPY_FOUND)
message(FATAL_ERROR "Python numpy package was not found.\n"
"${PYTHONMSG} ${PYTHON_MODULEMSG}")
endif(NOT HAVE_LIBNUMARRAY_H)
endif(NOT PYTHON_NUMPY_FOUND)
set(LIBRARIES ${LIBRARIES} ${PYTHON_LIBRARIES})
include_directories(${PYTHON_INCLUDE_DIRS})
set(CMAKE_REQUIRED_INCLUDES)
else(PYTHONLIBS_FOUND)
message(FATAL_ERROR "Python is required but was not found.\n"
"Use -DPYTHONDIR=DIR to specify the Python directory tree.\n"
......@@ -485,6 +502,23 @@ if(UDUNITS)
endif(UDUNITS_FOUND)
endif(UDUNITS)
# pslib
# -DPSLIB=ON|OFF
# -DPSLIBDIR=DIR
if(PSLIB)
set(CMAKE_PREFIX_PATH ${PSLIBDIR})
find_package(libps QUIET)
set(USE_PSLIB ${LIBPS_FOUND})
if(LIBPS_FOUND)
set(LIBRARIES ${LIBRARIES} ${LIBPS_LIBRARIES})
include_directories(${LIBPS_INCLUDE_DIR})
else(LIBPS_FOUND)
message(FATAL_ERROR "pslib is required but was not found.\n"
"Use -DPSLIBDIR=DIR to specify the pslib directory tree.\n"
"Use -DPSLIB=OFF to not use it.")
endif(LIBPS_FOUND)
endif(PSLIB)
# grib
# -DGRIB=ON|OFF
# -DGRIBDIR=DIR
......@@ -545,7 +579,7 @@ install(FILES ${CMAKE_SOURCE_DIR}/AUTHORS ${CMAKE_SOURCE_DIR}/README DESTINATION
install(FILES ${CMAKE_SOURCE_DIR}/doc/gdl.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1)
# substitute variables in configure.h.cmake and move it to configure.h
configure_file(${CMAKE_SOURCE_DIR}/config.h.cmake ${CMAKE_SOURCE_DIR}/config.h)
configure_file(${CMAKE_SOURCE_DIR}/config.h.cmake ${CMAKE_BINARY_DIR}/config.h)
# create a link src/gdl -> ${BUILD}/.../gdl
if(NOT PYTHON_MODULE)
......@@ -577,6 +611,10 @@ IF(NOT CMAKE_BUILD_TYPE)
FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
# AC, 12-oct-2011, solved by Marc
# set_target_properties(gdl PROPERTIES LINK_FLAGS "-Wl,-z,muldefs")
# set_target_properties(gdl PROPERTIES LINK_FLAGS "-z muldefs")
#
if(CMAKE_BUILD_TYPE STREQUAL None OR NOT CMAKE_BUILD_TYPE)
set(FLAGS ${CMAKE_CXX_FLAGS})
......@@ -620,6 +658,7 @@ module(UDUNITS "UDUNITS-2 ")
module(GRIB "GRIB ")
set(GSHHS_LIBRARIES ${GSHHS_INCLUDE_DIR})
module(GSHHS "GSHHS ")
module(PSLIB "pslib ")
module(X11 "Xlib ")
message("")
message(STATUS "Mandatory modules")
......
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
find_library(FFTW_LIBRARY NAMES fftw3)
find_library(FFTWF_LIBRARY NAMES fftw3f)
set(FFTW_LIBRARIES ${FFTW_LIBRARY} ${FFTWF_LIBRARY})
......
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
find_library(GSL_LIBRARY NAMES gsl)
find_library(GSLCBLAS_LIBRARY NAMES gslcblas)
set(GSL_LIBRARIES ${GSL_LIBRARY} ${GSLCBLAS_LIBRARY})
......
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
find_library(GRIB_LIBRARIES NAMES grib_api)
find_path(GRIB_INCLUDE_DIR NAMES grib_api.h)
include(FindPackageHandleStandardArgs)
......
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# HDF_LIBRARIES
# HDF_EXTRA_LIBRARIES
find_package(JPEG)
......
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
find_library(LIBPROJ4_LIBRARIES NAMES proj4)
find_path(LIBPROJ4_INCLUDE_DIR NAMES lib_proj.h)
include(FindPackageHandleStandardArgs)
......
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
find_path(NETCDFPKG netcdf.pc PATH_SUFFIXES lib lib/pkgconfig)
include(FindPackageHandleStandardArgs)
if(NETCDFPKG)
......@@ -5,18 +16,17 @@ if(NETCDFPKG)
include(FindPkgConfig)
pkg_check_modules(NETCDF netcdf)
if(NETCDF_FOUND)
set(NETCDF_INCLUDE_DIR ${NETCDF_INCLUDE_DIRS})
find_package_handle_standard_args(NETCDF DEFAULT_MSG NETCDF_LIBRARIES)
endif(NETCDF_FOUND)
else(NETCDFPKG) # no netcdf.pc file
find_library(NETCDF_LIBRARIES NAMES netcdf)
find_path(NETCDF_INCLUDE_DIR NAMES netcdfcpp.h)
find_package_handle_standard_args(NETCDF DEFAULT_MSG NETCDF_LIBRARIES NETCDF_INCLUDE_DIR)
find_path(NETCDF_INCLUDE_DIRS NAMES netcdfcpp.h PATH_SUFFIXES netcdf-3)
find_package_handle_standard_args(NETCDF DEFAULT_MSG NETCDF_LIBRARIES NETCDF_INCLUDE_DIRS)
endif(NETCDFPKG)
mark_as_advanced(
NETCDFPKG
NETCDF
NETCDF_INCLUDE_DIR
NETCDF_INCLUDE_DIRS
NETCDF_LIBRARIES
)
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# - Find numpy
# Find the native numpy includes
# This module defines
# PYTHON_NUMPY_INCLUDE_DIR, where to find numpy/arrayobject.h, etc.
# PYTHON_NUMPY_FOUND, If false, do not try to use numpy headers.
if (PYTHON_NUMPY_INCLUDE_DIR)
# in cache already
set (PYTHON_NUMPY_FIND_QUIETLY TRUE)
endif (PYTHON_NUMPY_INCLUDE_DIR)
INCLUDE(FindPythonInterp)
IF(PYTHON_EXECUTABLE)
EXEC_PROGRAM ("${PYTHON_EXECUTABLE}"
ARGS "-c 'import numpy; print numpy.get_include()'"
OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIR
RETURN_VALUE PYTHON_NUMPY_NOT_FOUND)
if (PYTHON_NUMPY_INCLUDE_DIR)
set (PYTHON_NUMPY_FOUND TRUE)
set (PYTHON_NUMPY_INCLUDE_DIR ${PYTHON_NUMPY_INCLUDE_DIR} CACHE STRING "Numpy include path")
else (PYTHON_NUMPY_INCLUDE_DIR)
set(PYTHON_NUMPY_FOUND FALSE)
endif (PYTHON_NUMPY_INCLUDE_DIR)
ENDIF(PYTHON_EXECUTABLE)
if (PYTHON_NUMPY_FOUND)
if (NOT PYTHON_NUMPY_FIND_QUIETLY)
message (STATUS "Numpy headers found")
endif (NOT PYTHON_NUMPY_FIND_QUIETLY)
else (PYTHON_NUMPY_FOUND)
if (PYTHON_NUMPY_FIND_REQUIRED)
message (FATAL_ERROR "Numpy headers missing")
endif (PYTHON_NUMPY_FIND_REQUIRED)
endif (PYTHON_NUMPY_FOUND)
MARK_AS_ADVANCED (PYTHON_NUMPY_INCLUDE_DIR)
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
find_library(PLPLOT_LIBRARY NAMES plplotd)
find_library(PLPLOTCXX_LIBRARY NAMES plplotcxxd)
set(PLPLOT_LIBRARIES ${PLPLOT_LIBRARY} ${PLPLOTCXX_LIBRARY})
......
# - Find python libraries
# This module finds if Python is installed and determines where the
# include files and libraries are. It also determines what the name of
# the library is. This code sets the following variables:
#
# PYTHONLIBS_FOUND - have the Python libs been found
# PYTHON_LIBRARIES - path to the python library
# PYTHON_INCLUDE_PATH - path to where Python.h is found (deprecated)
# PYTHON_INCLUDE_DIRS - path to where Python.h is found
# PYTHON_DEBUG_LIBRARIES - path to the debug library
#
#=============================================================================
# Copyright 2001-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distributed this file outside of CMake, substitute the full
# License text for the above reference.)
include(FindPackageHandleStandardArgs)
INCLUDE(CMakeFindFrameworks)
# Search for the python framework on Apple.
CMAKE_FIND_FRAMEWORKS(Python)
# add version support
if(PythonLibs_FIND_VERSION_EXACT)
set(VERSIONS ${PythonLibs_FIND_VERSION})
else(PythonLibs_FIND_VERSION_EXACT)
set(VERSIONS ${PythonLibs_FIND_VERSION} 3.1 2.6 2.5 2.4 2.3 2.2 2.1 2.0 1.6 1.5)
endif(PythonLibs_FIND_VERSION_EXACT)
FOREACH(_CURRENT_VERSION ${VERSIONS})
STRING(REPLACE "." "" _CURRENT_VERSION_NO_DOTS ${_CURRENT_VERSION})
IF(WIN32)
FIND_LIBRARY(PYTHON_DEBUG_LIBRARY
NAMES python${_CURRENT_VERSION_NO_DOTS}_d python
PATHS
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs/Debug
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs )
ENDIF(WIN32)
FIND_LIBRARY(PYTHON_LIBRARY
NAMES python${_CURRENT_VERSION_NO_DOTS} python${_CURRENT_VERSION}
PATHS
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs
# Avoid finding the .dll in the PATH. We want the .lib.
NO_SYSTEM_ENVIRONMENT_PATH
)
# Look for the static library in the Python config directory
FIND_LIBRARY(PYTHON_LIBRARY
NAMES python${_CURRENT_VERSION_NO_DOTS} python${_CURRENT_VERSION}
# Avoid finding the .dll in the PATH. We want the .lib.
NO_SYSTEM_ENVIRONMENT_PATH
# This is where the static library is usually located
PATH_SUFFIXES python${_CURRENT_VERSION}/config
)
# For backward compatibility, honour value of PYTHON_INCLUDE_PATH, if
# PYTHON_INCLUDE_DIR is not set.
IF(DEFINED PYTHON_INCLUDE_PATH AND NOT DEFINED PYTHON_INCLUDE_DIR)
SET(PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_PATH}" CACHE PATH
"Path to where Python.h is found" FORCE)
ENDIF(DEFINED PYTHON_INCLUDE_PATH AND NOT DEFINED PYTHON_INCLUDE_DIR)
SET(PYTHON_FRAMEWORK_INCLUDES)
IF(Python_FRAMEWORKS AND NOT PYTHON_INCLUDE_DIR)
FOREACH(dir ${Python_FRAMEWORKS})
SET(PYTHON_FRAMEWORK_INCLUDES ${PYTHON_FRAMEWORK_INCLUDES}
${dir}/Versions/${_CURRENT_VERSION}/include/python${_CURRENT_VERSION})
ENDFOREACH(dir)
ENDIF(Python_FRAMEWORKS AND NOT PYTHON_INCLUDE_DIR)
FIND_PATH(PYTHON_INCLUDE_DIR
NAMES Python.h
PATHS
${PYTHON_FRAMEWORK_INCLUDES}
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include
PATH_SUFFIXES
python${_CURRENT_VERSION}
)
# For backward compatibility, set PYTHON_INCLUDE_PATH, but make it internal.
SET(PYTHON_INCLUDE_PATH "${PYTHON_INCLUDE_DIR}" CACHE INTERNAL
"Path to where Python.h is found (deprecated)")
ENDFOREACH(_CURRENT_VERSION)
MARK_AS_ADVANCED(
PYTHON_DEBUG_LIBRARY
PYTHON_LIBRARY
PYTHON_INCLUDE_DIR
)
# We use PYTHON_INCLUDE_DIR, PYTHON_LIBRARY and PYTHON_DEBUG_LIBRARY for the
# cache entries because they are meant to specify the location of a single
# library. We now set the variables listed by the documentation for this
# module.
SET(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
SET(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
SET(PYTHON_DEBUG_LIBRARIES "${PYTHON_DEBUG_LIBRARY}")
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PythonLibs DEFAULT_MSG PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
# PYTHON_ADD_MODULE(<name> src1 src2 ... srcN) is used to build modules for python.
# PYTHON_WRITE_MODULES_HEADER(<filename>) writes a header file you can include
# in your sources to initialize the static python modules
GET_PROPERTY(_TARGET_SUPPORTS_SHARED_LIBS
GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
FUNCTION(PYTHON_ADD_MODULE _NAME )
OPTION(PYTHON_ENABLE_MODULE_${_NAME} "Add module ${_NAME}" TRUE)
OPTION(PYTHON_MODULE_${_NAME}_BUILD_SHARED
"Add module ${_NAME} shared" ${_TARGET_SUPPORTS_SHARED_LIBS})
# Mark these options as advanced
MARK_AS_ADVANCED(PYTHON_ENABLE_MODULE_${_NAME}
PYTHON_MODULE_${_NAME}_BUILD_SHARED)
IF(PYTHON_ENABLE_MODULE_${_NAME})
IF(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
SET(PY_MODULE_TYPE MODULE)
ELSE(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
SET(PY_MODULE_TYPE STATIC)
SET_PROPERTY(GLOBAL APPEND PROPERTY PY_STATIC_MODULES_LIST ${_NAME})
ENDIF(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
SET_PROPERTY(GLOBAL APPEND PROPERTY PY_MODULES_LIST ${_NAME})
ADD_LIBRARY(${_NAME} ${PY_MODULE_TYPE} ${ARGN})
# TARGET_LINK_LIBRARIES(${_NAME} ${PYTHON_LIBRARIES})
ENDIF(PYTHON_ENABLE_MODULE_${_NAME})
ENDFUNCTION(PYTHON_ADD_MODULE)
FUNCTION(PYTHON_WRITE_MODULES_HEADER _filename)
GET_PROPERTY(PY_STATIC_MODULES_LIST GLOBAL PROPERTY PY_STATIC_MODULES_LIST)
GET_FILENAME_COMPONENT(_name "${_filename}" NAME)
STRING(REPLACE "." "_" _name "${_name}")
STRING(TOUPPER ${_name} _nameUpper)
SET(_filenameTmp "${_filename}.in")
FILE(WRITE ${_filenameTmp} "/*Created by cmake, do not edit, changes will be lost*/\n")
FILE(APPEND ${_filenameTmp}
"#ifndef ${_nameUpper}
#define ${_nameUpper}
#include <Python.h>
#ifdef __cplusplus
extern \"C\" {
#endif /* __cplusplus */
")
FOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filenameTmp} "extern void init${PYTHON_MODULE_PREFIX}${_currentModule}(void);\n\n")
ENDFOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filenameTmp}
"#ifdef __cplusplus
}
#endif /* __cplusplus */
")
FOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filenameTmp} "int ${_name}_${_currentModule}(void) \n{\n static char name[]=\"${PYTHON_MODULE_PREFIX}${_currentModule}\"; return PyImport_AppendInittab(name, init${PYTHON_MODULE_PREFIX}${_currentModule});\n}\n\n")
ENDFOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filenameTmp} "void ${_name}_LoadAllPythonModules(void)\n{\n")
FOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filenameTmp} " ${_name}_${_currentModule}();\n")
ENDFOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filenameTmp} "}\n\n")
FILE(APPEND ${_filenameTmp} "#ifndef EXCLUDE_LOAD_ALL_FUNCTION\nvoid CMakeLoadAllPythonModules(void)\n{\n ${_name}_LoadAllPythonModules();\n}\n#endif\n\n#endif\n")
# with CONFIGURE_FILE() cmake complains that you may not use a file created using FILE(WRITE) as input file for CONFIGURE_FILE()
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_filenameTmp}" "${_filename}" OUTPUT_QUIET ERROR_QUIET)
ENDFUNCTION(PYTHON_WRITE_MODULES_HEADER)
#
# copyright : (c) 2010 Maxime Lenoir, Alain Coulais,
# Sylwester Arabas and Orion Poplawski
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.