##############################################################################
# @file CMakeLists.txt
# Build executables, static and dylibs, packages, build systems, etc., for
# HTML Tidy.
#
# Read this file or use cmake-gui (Windows) or ccmake (everything else) for
# guided build.
#
# @author  Geoff McLane [ubuntu@geoffair.info]
# @author  HTACG, et al (consult git log)
#
# @copyright
#          Copyright (c) 1998-2017 HTACG
# @copyright
#          See tidy.h for license.
#
# @date    Consult git log.
##############################################################################

cmake_minimum_required (VERSION 2.8.12)

set(LIB_NAME tidy)
set(LIBTIDY_DESCRIPTION "${LIB_NAME} - HTML syntax checker")
set(LIBTIDY_URL "https://www.html-tidy.org")

project (${LIB_NAME})


#################################################
# Setup
#################################################

#------------------------------------------------------------------------
# Release Information
#   Release version and date are found in `version.txt`; update *that*
#   file when required. It will be read into variable `versionFile`
#   (stripping any newlines or spaces). This file must be formatted into
#   two lines: the dot-separated MAJOR.MINOR.POINT version, followed by
#   the date separated YEAR.MONTH.DAY release date.
#------------------------------------------------------------------------
file(READ version.txt versionFile)

if (NOT versionFile)
    message(FATAL_ERROR "Unable to determine libtidy version. version.txt file is missing.")
endif()

string(STRIP "${versionFile}" VERSION_TEXT)
string(REGEX REPLACE "(.*)[\r\n|\n](.*)" "\\1" LIBTIDY_VERSION ${VERSION_TEXT})
string(REGEX REPLACE "(.*)[\r\n|\n](.*)" "\\2" LIBTIDY_DATE ${VERSION_TEXT})

# Establish version number
if (LIBTIDY_VERSION)
    string(REPLACE "." ";" VERSION_LIST ${LIBTIDY_VERSION})
    list(GET VERSION_LIST 0 TIDY_MAJOR_VERSION)
    list(GET VERSION_LIST 1 TIDY_MINOR_VERSION)
    list(GET VERSION_LIST 2 TIDY_POINT_VERSION)
    set(TIDY_SO_VERSION "${TIDY_MAJOR_VERSION}${TIDY_MINOR_VERSION}")
else ()
    message(FATAL_ERROR "*** FAILED to get a VERSION from version.txt!")
endif ()   
 
# Establish version date
if (LIBTIDY_DATE)
    string(REPLACE "." ";" DATE_LIST ${LIBTIDY_DATE})
    list(GET DATE_LIST 0 tidy_YEAR)
    list(GET DATE_LIST 1 tidy_MONTH)
    list(GET DATE_LIST 2 tidy_DAY)
else ()
    message(FATAL_ERROR "*** FAILED to get a DATE from version.txt!")
endif ()

# Establish SOVERSION. Tidy uses a weird form of semantic versioning,
# wherein even minor versions are stable versions with SONAMEs, and
# odd minor versions are `next` versions that should NOT be released,
# are NOT stable, and should NOT have a valid SONAME.
if (TIDY_SO_VERSION)
    math(EXPR NO_SONAME "${TIDY_SO_VERSION} % 2")
    if ( NO_SONAME EQUAL 0)
        message("-> TIDY_SO_VERSION = ${TIDY_SO_VERSION}. This is an EVEN (stable) release.")
    else ()
        message("-> TIDY_SO_VERSION = ${TIDY_SO_VERSION}. This is an ODD (development) release.")
    endif ()
else ()
    message(FATAL_ERROR "*** FAILED to build a TIDY_SO_VERSION!")
endif ()


#------------------------------------------------------------------------
# Library Types and Linking
#   By default, *both* static and dynamic library types are built. The
#   shared library can be turned off if not needed. The console program
#   can be configured for static linking or dynamic linking.
#------------------------------------------------------------------------
set( LIB_TYPE STATIC )  # set default message

option( BUILD_SHARED_LIB "Set OFF to NOT build shared library"     ON  )

# Issue #326 - Allow linkage choice of console app tidy
option( TIDY_CONSOLE_SHARED "Set ON to link with shared(DLL) lib." OFF )

if (TIDY_CONSOLE_SHARED)
    if (NOT BUILD_SHARED_LIB)
        message(FATAL_ERROR "Enable shared build for this tidy linkage!")
    endif ()
endif ()


#------------------------------------------------------------------------
# Miscellaneous Options
#------------------------------------------------------------------------
option( BUILD_TAB2SPACE     "Set ON to build utility app, tab2space"  OFF )
option( BUILD_SAMPLE_CODE   "Set ON to build the sample code"         OFF )
option( TIDY_COMPAT_HEADERS "Set ON to include compatibility headers" OFF )


#------------------------------------------------------------------------
# Man Page
#   Allow building with non-default man page directory.
#------------------------------------------------------------------------
if (NOT MAN_INSTALL_DIR)
    set(MAN_INSTALL_DIR share/man/man1)
endif ()


#------------------------------------------------------------------------
# Localization
#   Allow building without extra language support.
#------------------------------------------------------------------------
option( SUPPORT_LOCALIZATIONS "Set OFF to build without additional languages." ON )

if (SUPPORT_LOCALIZATIONS)
    add_definitions ( -DSUPPORT_LOCALIZATIONS=1 )
else ()
    add_definitions ( -DSUPPORT_LOCALIZATIONS=0 )
endif ()


#------------------------------------------------------------------------
# Console Application
#   Allow building without console support, which mostly prevents
#   console strings from existing in the library. Note that this will
#   prevent the console application from being built, since it can't be
#   linked.
#------------------------------------------------------------------------
option( SUPPORT_CONSOLE_APP "Set OFF to build libraries only without console application support." ON )

if (SUPPORT_CONSOLE_APP)
    add_definitions ( -DSUPPORT_CONSOLE_APP=1 )
else ()
    add_definitions ( -DSUPPORT_CONSOLE_APP=0 )
endif ()


#------------------------------------------------------------------------
# Diagnostics
#   Enable building with logs, some memory diagnostics.
#------------------------------------------------------------------------
option( ENABLE_DEBUG_LOG    "Set ON to output debugging messages."          OFF )
option( ENABLE_ALLOC_DEBUG  "Set ON to output node allocation diagnostics." OFF )
option( ENABLE_MEMORY_DEBUG "Set ON to output some memory diagnostics."     OFF )

if ( ENABLE_DEBUG_LOG )
    add_definitions( -DENABLE_DEBUG_LOG )
    message(STATUS "*** Debug Logging is enabled.")  
else ()
    message(STATUS "*** Debug Logging is NOT enabled.")  
endif ()

if (ENABLE_ALLOC_DEBUG)
    add_definitions ( -DDEBUG_ALLOCATION )  # see lexer.c for details
    message(STATUS "*** Note, lexer.c node allocation diagnostics are ON")
endif ()
    
if (ENABLE_MEMORY_DEBUG)
    add_definitions ( -DDEBUG_MEMORY )  # see alloc.c for details
    message(STATUS "*** Note, alloc.c memory diagnostics are ON")
endif ()
    
if (WIN32)
    option( ENABLE_CRTDBG_MEMORY "Set ON to enable the Windows CRT debug library." OFF )
    
    if (ENABLE_CRTDBG_MEMORY)
        add_definitions ( -D_CRTDBG_MAP_ALLOC )  # see tidy.c for details
        message(STATUS "*** Note, tidy.c Windows CRT memory debug is ON")
    endif ()
endif ()


#------------------------------------------------------------------------
# Complier Flags
#   Setup other compiler-specific and platform-specific compiler flags.
#------------------------------------------------------------------------
if(CMAKE_COMPILER_IS_GNUCXX)
    set( WARNING_FLAGS -Wall )
endif(CMAKE_COMPILER_IS_GNUCXX)

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 
   set( WARNING_FLAGS "-Wall -Wno-overloaded-virtual" )
endif() 

if(WIN32 AND MSVC)
    # C4996: The compiler encountered a deprecated declaration.
    # C4090: 'function' : different 'const' qualifiers
    # C4244: '=' : conversion from '__int64' to 'uint', possible loss of data
    # C4267: 'function' : conversion from 'size_t' to 'uint', possible loss of data
    foreach(warning 4996 4090 4244 4267)
        set(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
    endforeach()
    
    set( MSVC_FLAGS "-DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS" )

    # to distinguish between debug and release lib in windows
    set( CMAKE_DEBUG_POSTFIX "d" ) # little effect in unix
else()
    # add any gcc flags
endif()

set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS} ${MSVC_FLAGS} -D_REENTRANT" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS} ${MSVC_FLAGS} -D_REENTRANT" )
set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MSVC_LD_FLAGS}" )


#------------------------------------------------------------------------
# Static Windows Runtime
#   Option to statically link to the Windows runtime. Maybe only 
#   applies to WIN32/MSVC.
#------------------------------------------------------------------------
if (MSVC)
    option( USE_STATIC_RUNTIME "Set ON to change /MD(DLL) to /MT(static)" OFF )
    if (USE_STATIC_RUNTIME)
        set(CompilerFlags
            CMAKE_CXX_FLAGS
            CMAKE_CXX_FLAGS_DEBUG
            CMAKE_CXX_FLAGS_RELEASE
            CMAKE_C_FLAGS
            CMAKE_C_FLAGS_DEBUG
            CMAKE_C_FLAGS_RELEASE
            )
        foreach(CompilerFlag ${CompilerFlags})
            string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
        endforeach()    
        message(STATUS "Using /MT STATIC runtime")
    else ()
        message(STATUS "Using /MD DYNAMIC runtime")
    endif ()
endif ()


#------------------------------------------------------------------------
# Macro Values
#   These additional macros are set in Tidy's source code. It is *very*
#   seldom that you would ever have to change any of these in order to
#   achieve a functioning build.
#------------------------------------------------------------------------
add_definitions ( -DLIBTIDY_VERSION="${LIBTIDY_VERSION}" )
add_definitions ( -DRELEASE_DATE="${tidy_YEAR}/${tidy_MONTH}/${tidy_DAY}" )

# Optionally specify an extra version point for pre-release/debug versions.
if (TIDY_RC_NUMBER)
    add_definitions ( -DRC_NUMBER="${TIDY_RC_NUMBER}" )
endif ()

# If your OS doesn't have native ISO2022 support, then build with this flag.
if (NO_NATIVE_ISO2022_SUPPORT)
    add_definitions ( -DNO_NATIVE_ISO2022_SUPPORT=1 )
endif ()

# If your OS doesn't have library function access(), build with this flag.
if (NO_ACCESS_SUPPORT)
    add_definitions ( -DNO_ACCESS_SUPPORT=1 )
endif ()

# Delete me? Not used in Tidy source!
add_definitions ( -DHAVE_CONFIG_H ) 


#------------------------------------------------------------------------
# Runtime Configuration File Support
#   By default on Unix-like systems when building for the console program,
#   support runtime configuration files in /etc/ and in ~/. To prevent this,
#   set ENABLE_CONFIG_FILES to NO. Specify -DTIDY_CONFIG_FILE and/or 
#   -DTIDY_USER_CONFIG_FILE to override the default paths in tidyplatform.h.
# @note: this section refactored to support #584.
#------------------------------------------------------------------------
if ( UNIX AND SUPPORT_CONSOLE_APP )

  option ( ENABLE_CONFIG_FILES "Set to OFF to disable Tidy runtime configuration file support" ON )

    # All Unixes support getpwnam(); undef'd in tidyplatform.h if necessary.
    add_definitions( -DSUPPORT_GETPWNAM=1 )

else ()

  option ( ENABLE_CONFIG_FILES "Set to ON to enable Tidy runtime configuration file support" OFF )
  
  if ( SUPPORT_GETPWNAM )
    add_definitions( -DSUPPORT_GETPWNAM=1 )
  endif ()
  
endif ()

if ( ENABLE_CONFIG_FILES )

    message(STATUS "*** Building support for runtime configuration files.")

    add_definitions( -DTIDY_ENABLE_CONFIG_FILES )
    
    # define a default here so we can pass to XSL.
    if ( NOT TIDY_CONFIG_FILE )
        set( TIDY_CONFIG_FILE "/etc/tidy.conf" )
    endif ()

    # define a default here so we can pass to XSL.
    if ( NOT TIDY_USER_CONFIG_FILE )
        set( TIDY_USER_CONFIG_FILE "~/.tidyrc" )
    endif ()

    # do *not* add these unless ENABLE_CONFIG_FILES!
    add_definitions( -DTIDY_CONFIG_FILE="${TIDY_CONFIG_FILE}" )
    add_definitions( -DTIDY_USER_CONFIG_FILE="${TIDY_USER_CONFIG_FILE}" )

endif ()
  

#------------------------------------------------------------------------
# Shared Library
#   Setup whether or not we will build the shared library.
#------------------------------------------------------------------------
if(BUILD_SHARED_LIB)
   set(LIB_TYPE SHARED)
   message(STATUS "*** Also building DLL library ${LIB_TYPE}, version ${LIBTIDY_VERSION}, date ${LIBTIDY_DATE}")
else()
   message(STATUS "*** Only building static library ${LIB_TYPE}, version ${LIBTIDY_VERSION}, date ${LIBTIDY_DATE}")
endif()


#################################################
# Build
#################################################

#------------------------------------------------------------------------
# File Locations and File Lists
#   Setup whether or not we will build the shared library.
#------------------------------------------------------------------------
include_directories ( "${PROJECT_SOURCE_DIR}/include" "${PROJECT_SOURCE_DIR}/src" )

set ( SRCDIR src )
set ( INCDIR include )

set ( CFILES
        ${SRCDIR}/access.c       ${SRCDIR}/attrs.c        ${SRCDIR}/istack.c
        ${SRCDIR}/parser.c       ${SRCDIR}/tags.c         ${SRCDIR}/entities.c
        ${SRCDIR}/lexer.c        ${SRCDIR}/pprint.c       ${SRCDIR}/charsets.c
        ${SRCDIR}/clean.c        ${SRCDIR}/message.c      ${SRCDIR}/config.c
        ${SRCDIR}/alloc.c        ${SRCDIR}/attrdict.c     ${SRCDIR}/buffio.c
        ${SRCDIR}/fileio.c       ${SRCDIR}/streamio.c     ${SRCDIR}/tagask.c
        ${SRCDIR}/tmbstr.c       ${SRCDIR}/utf8.c         ${SRCDIR}/tidylib.c
        ${SRCDIR}/mappedio.c     ${SRCDIR}/gdoc.c         ${SRCDIR}/language.c
        ${SRCDIR}/messageobj.c   ${SRCDIR}/sprtf.c )
        
set ( HFILES
        ${INCDIR}/tidyplatform.h ${INCDIR}/tidy.h         ${INCDIR}/tidyenum.h
        ${INCDIR}/tidybuffio.h )

if (TIDY_COMPAT_HEADERS)
    set ( HFILES ${HFILES}      ${INCDIR}/buffio.h        ${INCDIR}/platform.h )
endif ()

set ( LIBHFILES
        ${SRCDIR}/access.h       ${SRCDIR}/attrs.h        ${SRCDIR}/attrdict.h ${SRCDIR}/charsets.h
        ${SRCDIR}/clean.h        ${SRCDIR}/config.h       ${SRCDIR}/entities.h
        ${SRCDIR}/fileio.h       ${SRCDIR}/forward.h      ${SRCDIR}/lexer.h
        ${SRCDIR}/mappedio.h     ${SRCDIR}/message.h      ${SRCDIR}/parser.h
        ${SRCDIR}/pprint.h       ${SRCDIR}/streamio.h     ${SRCDIR}/tags.h
        ${SRCDIR}/tmbstr.h       ${SRCDIR}/utf8.h         ${SRCDIR}/tidy-int.h
        ${SRCDIR}/version.h      ${SRCDIR}/gdoc.h         ${SRCDIR}/language.h
        ${SRCDIR}/language_en.h  ${SRCDIR}/sprtf.h )
  

#------------------------------------------------------------------------
# Target Locations
#------------------------------------------------------------------------
if (NOT LIB_INSTALL_DIR)
    set(LIB_INSTALL_DIR lib${LIB_SUFFIX})
endif ()

if (NOT BIN_INSTALL_DIR)
    set(BIN_INSTALL_DIR bin)
endif ()

if (NOT INCLUDE_INSTALL_DIR)
    set(INCLUDE_INSTALL_DIR include)
endif ()


#------------------------------------------------------------------------
# Static Library
#   The static library always builds.
#------------------------------------------------------------------------
set(name tidy-static)
add_library ( ${name} STATIC ${CFILES} ${HFILES} ${LIBHFILES} )
target_include_directories( ${name} PUBLIC "${PROJECT_SOURCE_DIR}/include")
if (WIN32)
    set_target_properties( ${name} PROPERTIES 
                           OUTPUT_NAME ${LIB_NAME}_static ) 
else ()
    set_target_properties( ${name} PROPERTIES 
                           OUTPUT_NAME ${LIB_NAME} )

endif ()
if (NOT TIDY_CONSOLE_SHARED) # user wants default static linkage
    list ( APPEND add_LIBS ${name} )
endif ()    
install(TARGETS ${name}
        RUNTIME DESTINATION ${BIN_INSTALL_DIR}
        ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
        LIBRARY DESTINATION ${LIB_INSTALL_DIR}
        )
install( FILES ${HFILES} DESTINATION ${INCLUDE_INSTALL_DIR} )

#------------------------------------------------------------------------
# Dynamic Library
#   If the user option is still on.
#------------------------------------------------------------------------
if (BUILD_SHARED_LIB)
    set(name tidy-share)
    if (UNIX AND APPLE)
        set(CMAKE_MACOSX_RPATH 1)
    endif ()
    add_library ( ${name} SHARED ${CFILES} ${HFILES} ${LIBHFILES} )
    target_include_directories( ${name} PUBLIC "${PROJECT_SOURCE_DIR}/include")
    set_target_properties( ${name} PROPERTIES 
                                   OUTPUT_NAME ${LIB_NAME} )
    set_target_properties( ${name} PROPERTIES
                                   VERSION   ${LIBTIDY_VERSION}
                                   SOVERSION ${TIDY_SO_VERSION}
                                   NO_SONAME ${NO_SONAME} )
    set_target_properties( ${name} PROPERTIES 
                                   COMPILE_FLAGS "-DBUILD_SHARED_LIB -DBUILDING_SHARED_LIB")
    install(TARGETS ${name}
        RUNTIME DESTINATION ${BIN_INSTALL_DIR}
        ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
        LIBRARY DESTINATION ${LIB_INSTALL_DIR}
        )
    if(MSVC)
        install(FILES $<TARGET_PDB_FILE:tidy-share> DESTINATION ${LIB_INSTALL_DIR} OPTIONAL)
    endif()
    if (TIDY_CONSOLE_SHARED) # user wants shared/dll linkage
        list ( APPEND add_LIBS ${name} )
    endif ()    
endif ()


#------------------------------------------------------------------------
# Main Executable
#   The main executable will be linked with either the static or the
#   shared library.
#------------------------------------------------------------------------
if (SUPPORT_CONSOLE_APP)
    set(name ${LIB_NAME})
    set ( BINDIR console )
    add_executable( ${name} ${BINDIR}/tidy.c )
    target_link_libraries( ${name} ${add_LIBS} )
    if (MSVC)
        set_target_properties( ${name} PROPERTIES DEBUG_POSTFIX d )
    endif ()
    if (APPLE)
        string(TIMESTAMP CURRENT_YEAR "%Y")
        configure_file(
            ${CMAKE_CURRENT_SOURCE_DIR}/console/Info.plist.in 
            ${CMAKE_CURRENT_BINARY_DIR}/Info.plist
        )
        target_link_options(${name} PRIVATE LINKER:-sectcreate,__TEXT,__info_plist,Info.plist)
    endif ()
    if (NOT TIDY_CONSOLE_SHARED)
        set_target_properties( ${name} PROPERTIES 
                                       COMPILE_FLAGS "-DTIDY_STATIC" )
    endif ()
    install (TARGETS ${name} DESTINATION bin)
endif ()


#------------------------------------------------------------------------
# Miscellaneous Targets
#------------------------------------------------------------------------
if (BUILD_TAB2SPACE)
    set(name tab2space)
    add_executable( ${name} ${BINDIR}/tab2space.c )
    if (MSVC)
        set_target_properties( ${name} PROPERTIES DEBUG_POSTFIX d )
    endif ()
    # no INSTALL of this 'local' tool - use depreciated
endif ()

if (BUILD_SAMPLE_CODE)
    set(name test71)
    set(dir console)
    add_executable( ${name} ${dir}/${name}.cxx )
    if (MSVC)
        set_target_properties( ${name} PROPERTIES DEBUG_POSTFIX d )
    endif ()
    target_link_libraries( ${name} ${add_LIBS} )
    # no INSTALL of this 'local' sample
endif ()


#################################################
# Create man pages
#################################################

if (UNIX AND SUPPORT_CONSOLE_APP)
    find_program( XSLTPROC_FOUND xsltproc )
    if (XSLTPROC_FOUND)
        ## NOTE: man name must match exe ie currently `${LIB_NAME}.1` not `tidy.1`
        ## also could use `manpath` command output to determine target install path
        set(TIDY_MANFILE ${LIB_NAME}.1)
        message(STATUS "*** Generating man ${TIDY_MANFILE} custom commands...")
        set(TIDY1XSL ${CMAKE_CURRENT_BINARY_DIR}/tidy1.xsl)
        set(TIDYHELP ${CMAKE_CURRENT_BINARY_DIR}/tidy-help.xml)
        set(TIDYCONFIG ${CMAKE_CURRENT_BINARY_DIR}/tidy-config.xml)
        add_custom_target(man ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}")
        
        ## Populate the @VARIABLES@ in the input file.
        configure_file(
            ${CMAKE_CURRENT_SOURCE_DIR}/man/tidy1.xsl.in
            ${TIDY1XSL}
        )
 
        # Run the built EXE to generate xml output .
        add_custom_command(
            TARGET man
            COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME} -xml-help > ${TIDYHELP}
            COMMENT "Generate ${TIDYHELP}"
            VERBATIM
        )

        # Run the built EXE to generate more xml output.
        add_custom_command(
            TARGET man
            COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME} -xml-config > ${TIDYCONFIG}
            COMMENT "Generate ${TIDYCONFIG}"
            VERBATIM
        )

        # Run xsltproc to generate the install files.
        add_custom_command(
            TARGET man
            DEPENDS ${TIDYHELP}
            COMMAND xsltproc ARGS ${TIDY1XSL} ${TIDYHELP} > ${CMAKE_CURRENT_BINARY_DIR}/${TIDY_MANFILE}
            COMMENT "Generate ${TIDY_MANFILE}"
            VERBATIM
        )

        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${TIDY_MANFILE} DESTINATION ${MAN_INSTALL_DIR})

    else ()
        message(STATUS "*** NOTE: xsltproc NOT FOUND! Can NOT generate man page.")
        message(STATUS "*** You need to install xsltproc in your system.")
    endif ()
endif ()


#################################################
# Create MSI,EXE, DMG, DEB/RPM
#   TODO: Check each of these builds
#################################################

set(BITNESS 32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  set(BITNESS 64)
endif()


#------------------------------------------------------------------------
# System Runtime Libraries
#   Need to ensure that system DLLs get included in a binary 
#   distribution, but since it can miss some - seems incomplete - make
#   optional.
#------------------------------------------------------------------------
option( ADD_SYSTEM_RUNTIMES "Set ON to include system runtime DLLS in distribution" OFF )
if (MSVC AND ADD_SYSTEM_RUNTIMES)
    if (NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
      # Visual Studio Express does include redistributable components so
      # squelch the warning.
      set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
    endif ()
    set (CMAKE_INSTALL_DEBUG_LIBRARIES OFF)
    include (InstallRequiredSystemLibraries)
endif ()


#------------------------------------------------------------------------
# Windows
#   MSI - this needs WiX Tooset installed and a path to candle.exe
#   EXE - this needs NSIS tools to be in path
# Everything Else
#   RPM required to build RPM's, and might not be installed by default.
#------------------------------------------------------------------------
if (WIN32)
    set(CPACK_GENERATOR "NSIS;WIX;ZIP")
    set(CPACK_SOURCE_GENERATOR "ZIP")
    set(CPACK_WIX_UPGRADE_GUID "D809598A-B513-4752-B268-0BAC403B00E4")
elseif ( ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
    set(CPACK_GENERATOR "productbuild")
    set(CPACK_SOURCE_GENERATOR "TGZ")
else ()
    set(CPACK_GENERATOR "DEB;RPM")
    set(CPACK_SOURCE_GENERATOR "TGZ")
endif ()


#------------------------------------------------------------------------
# General
#------------------------------------------------------------------------
set(CPACK_PACKAGE_NAME "${LIB_NAME}")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${LIBTIDY_DESCRIPTION}")
set(CPACK_PACKAGE_VENDOR "HTML Tidy Advocacy Community Group")
set(CPACK_PACKAGE_CONTACT "maintainer@htacg.org")

set(CPACK_PACKAGE_VERSION ${LIBTIDY_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR "${TIDY_MAJOR_VERSION}")
set(CPACK_PACKAGE_VERSION_MINOR "${TIDY_MINOR_VERSION}")
set(CPACK_PACKAGE_VERSION_PATCH "${TIDY_POINT_VERSION}")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README/README.html")


#------------------------------------------------------------------------
# Windows: it looks like only the LICENSE.txt file is used by Windows,
#   for either package type (.exe and .msi).
# Linux: none of the files are shown publicly by default when installing
#   from a .deb or .rpm.
# Mac: cannot show HTML; need RTF. CPACK_RESOURCE_FILE_WELCOME isn't
#   needed.
#------------------------------------------------------------------------
if (APPLE)
    set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/build/macos/Installer-License.rtf")
    set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/build/macos/Installer-Introduction.rtf")
else ()
    set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/README/LICENSE.txt")
    set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README/README.html")
    set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_CURRENT_SOURCE_DIR}/README/README.html")
endif ()


#------------------------------------------------------------------------
# Debian
#------------------------------------------------------------------------
set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${LIBTIDY_URL})
set(CPACK_DEBIAN_PACKAGE_SECTION "Libraries")
set(CPACK_SOURCE_IGNORE_FILES "${PROJECT_SOURCE_DIR}/build" )


#------------------------------------------------------------------------
# RPM config
#------------------------------------------------------------------------
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/share/man" "/usr/share/man/man1")
set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/test/;${CMAKE_CURRENT_SOURCE_DIR}/build/;${CMAKE_CURRENT_SOURCE_DIR}/.git/")


#------------------------------------------------------------------------
# Package name configuration
#   The default is LIB_NAME-CPACK_PACKAGE_VERSION-CMAKE_SYSTEM_NAME,
#   but we want to include system name for Unixes, and correct the
#   system name on Apple targets.
#------------------------------------------------------------------------
if (UNIX AND NOT APPLE)
    set(CPACK_PACKAGE_FILE_NAME "${LIB_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${BITNESS}bit")
endif ()
if (APPLE AND NOT IOS)
    if (CMAKE_OSX_ARCHITECTURES)
        set(CPACK_PACKAGE_FILE_NAME "${LIB_NAME}-${CPACK_PACKAGE_VERSION}-macOS-${CMAKE_OSX_ARCHITECTURES}")
        string(REPLACE ";" "+" CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}")
    else ()
        set(CPACK_PACKAGE_FILE_NAME "${LIB_NAME}-${CPACK_PACKAGE_VERSION}-macOS-${BITNESS}bit")
    endif ()
endif ()
if (IOS)
    set(CPACK_PACKAGE_FILE_NAME "${LIB_NAME}-${CPACK_PACKAGE_VERSION}-iOS-${BITNESS}bit")
endif ()


#------------------------------------------------------------------------
# Build the Package
#------------------------------------------------------------------------
include(CPack)


#------------------------------------------------------------------------
# pkg-config
#------------------------------------------------------------------------
configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/${LIB_NAME}.pc.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}.pc"
    @ONLY
    )
    
install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}.pc"
    DESTINATION "${LIB_INSTALL_DIR}/pkgconfig"
    )

# eof
