cmake_minimum_required (VERSION 3.2)

if (NOT DEFINED CMAKE_BUILD_TYPE)
  set (CMAKE_BUILD_TYPE Release CACHE STRING "Build type")
endif ()

project (swig)

if (POLICY CMP0074)
  cmake_policy (SET CMP0074 NEW)
endif()

file (STRINGS configure.ac line LIMIT_COUNT 1 REGEX "AC_INIT\\(.*\\)" )
if (line MATCHES "AC_INIT\\(\\[(.*)\\],[ \t]*\\[(.*)\\],[ \t]*\\[(.*)\\]\\)" )
  set (SWIG_VERSION ${CMAKE_MATCH_2})
  set (PACKAGE_BUGREPORT ${CMAKE_MATCH_3})
else ()
  message (SEND_ERROR "Could not parse version from configure.ac")
endif ()

set (SWIG_ROOT ${PROJECT_SOURCE_DIR})

set (SWIG_LIB share/swig/${SWIG_VERSION})

# Project wide configuration variables
# ------------------------------------

set (SWIG_SOURCE_DIR ${SWIG_ROOT}/Source CACHE INTERNAL "Path of swig sources" FORCE)

set (PACKAGE_NAME swig)
set (PACKAGE_VERSION ${SWIG_VERSION})

# Configure
# ---------

list (APPEND CMAKE_MODULE_PATH ${SWIG_ROOT}/Tools/cmake)

include (CheckIncludeFiles)
include (CheckIncludeFile)
include (CheckIncludeFileCXX)
include (CheckTypeSize)
include (CheckSymbolExists)
include (CheckFunctionExists)
include (CheckLibraryExists)
include (CheckCSourceCompiles)

# HACK: didn't get the bool check working for Visual Studio 2008
if (MSVC)
  set(HAVE_BOOL 1)
else()
  set (CMAKE_EXTRA_INCLUDE_FILES stdbool.h)
  check_type_size ("bool" HAVE_BOOL)
  set (CMAKE_EXTRA_INCLUDE_FILES)
endif()

check_include_file ("inttypes.h" HAVE_INTTYPES_H)
check_include_file ("stddef.h" HAVE_STDDEF_H)
check_include_file ("stdint.h" HAVE_STDINT_H)
check_include_file ("stdio.h" HAVE_STDIO_H)
check_include_file ("stdlib.h" HAVE_STDLIB_H)
check_include_file ("string.h" HAVE_STRING_H)
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_files ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)

check_include_file_cxx ("boost/shared_ptr.hpp" HAVE_BOOST)
check_library_exists (dl dlopen "" HAVE_LIBDL)
check_function_exists (popen HAVE_POPEN)

if (MSVC)
  set (CMAKE_CXX_FLAGS "/EHsc ${CMAKE_CXX_FLAGS}")
endif ()

set (PCRE_REQUIRED_ARG "REQUIRED" CACHE STRING "required arg")
find_package (PCRE ${PCRE_REQUIRED_ARG})
if (PCRE_FOUND)
  set (HAVE_PCRE 1)
  include_directories (${PCRE_INCLUDE_DIRS})
endif()

if (WIN32)
  file (TO_NATIVE_PATH ${CMAKE_INSTALL_PREFIX}/${SWIG_LIB} SWIG_LIB_WIN_UNIX)
  string (REGEX REPLACE "\\\\" "\\\\\\\\" SWIG_LIB_WIN_UNIX "${SWIG_LIB_WIN_UNIX}")
endif ()
configure_file (${SWIG_ROOT}/Tools/cmake/swigconfig.h.in
                ${CMAKE_CURRENT_BINARY_DIR}/Source/Include/swigconfig.h)

find_package (BISON REQUIRED)


# Compiler flags
# --------------

include_directories (
    ${SWIG_SOURCE_DIR}/CParse
    ${SWIG_SOURCE_DIR}/Include
    ${SWIG_SOURCE_DIR}/DOH
    ${SWIG_SOURCE_DIR}/Swig
    ${SWIG_SOURCE_DIR}/Preprocessor
    ${SWIG_SOURCE_DIR}/Modules
    ${PROJECT_BINARY_DIR}/Source/Include
    ${PROJECT_BINARY_DIR}/Source/CParse
    ${PROJECT_SOURCE_DIR}/Source/Doxygen
)

# generate the parser source code (depends on bison)
file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/Source/CParse)

BISON_TARGET (swig_parser
    ${SWIG_SOURCE_DIR}/CParse/parser.y
    ${PROJECT_BINARY_DIR}/Source/CParse/parser.c
)

# generate swigwarn.swg
file (READ ${SWIG_SOURCE_DIR}/Include/swigwarn.h SWIG_WARN_H)
string (REGEX REPLACE "#define WARN([^ \\t]*)[ \\t]*([0-9]+)" "%define SWIGWARN\\1 \\2 %enddef" SWIG_WARN_SWG ${SWIG_WARN_H})
file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/swigwarn.swg ${SWIG_WARN_SWG})
set_property (SOURCE ${CMAKE_CURRENT_BINARY_DIR}/swigwarn.swg PROPERTY GENERATED 1)

# install lib
install (DIRECTORY ${SWIG_ROOT}/Lib/ DESTINATION ${SWIG_LIB})
install (FILES ${CMAKE_CURRENT_BINARY_DIR}/swigwarn.swg DESTINATION ${SWIG_LIB})

# sources
# ---------
file (GLOB DOH_SOURCES ${SWIG_SOURCE_DIR}/DOH/*.c)
file (GLOB CPARSE_SOURCES ${SWIG_SOURCE_DIR}/CParse/*.c)
list (APPEND CPARSE_SOURCES)
file (GLOB PREPROCESSOR_SOURCES ${SWIG_SOURCE_DIR}/Preprocessor/*.c)
file (GLOB CORE_SOURCES ${SWIG_SOURCE_DIR}/Swig/*.c)
file (GLOB DOXYGEN_SOURCES ${SWIG_SOURCE_DIR}/Doxygen/*.cxx)
file (GLOB MODULES_SOURCES ${SWIG_SOURCE_DIR}/Modules/*.cxx)

add_executable (swig
  ${CPARSE_SOURCES}
  ${DOH_SOURCES}
  ${DOXYGEN_SOURCES}
  ${MODULES_SOURCES}
  ${CORE_SOURCES}
  ${PREPROCESSOR_SOURCES}
  ${PROJECT_BINARY_DIR}/Source/Include/swigconfig.h
  ${SWIG_SOURCE_DIR}/Include/swigwarn.h
  ${PROJECT_BINARY_DIR}/Source/CParse/parser.c
  ${PROJECT_BINARY_DIR}/Source/CParse/parser.h
)
if (PCRE_FOUND)
  target_link_libraries (swig ${PCRE_LIBRARIES})
endif ()
install (TARGETS swig DESTINATION bin)

# 'make package-source' creates tarballs
set (CPACK_PACKAGE_NAME ${PACKAGE_NAME})
set (CPACK_SOURCE_GENERATOR "TGZ;TBZ2")
set (CPACK_SOURCE_IGNORE_FILES "/.git;/build;.*~;${CPACK_SOURCE_IGNORE_FILES}")
set (CPACK_SOURCE_PACKAGE_FILE_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION})
include (CPack)

# few tests
enable_testing ()
add_test (NAME cmd_version COMMAND swig -version)
add_test (NAME cmd_swiglib COMMAND swig -swiglib)
add_test (NAME cmd_external_runtime COMMAND swig -external-runtime ext_rt.h)
set_tests_properties(cmd_external_runtime PROPERTIES ENVIRONMENT "SWIG_LIB=${PROJECT_SOURCE_DIR}/Lib")

