cmake_minimum_required(VERSION 3.15)
 
project(giflib
    VERSION 6.1.3
    DESCRIPTION "A library for reading and writing GIF images"
    LANGUAGES C
)
 
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)  # gnu99, matching upstream Makefile
 
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
 
# ---------------------------------------------------------------------------
# Options
# ---------------------------------------------------------------------------
option(BUILD_SHARED_LIBS  "Build shared library"           ON)
option(GIFLIB_BUILD_UTILS "Build and install CLI utilities" ON)
 
# ---------------------------------------------------------------------------
# Library
# ---------------------------------------------------------------------------
add_library(gif
    dgif_lib.c
    egif_lib.c
    gif_err.c
    gif_font.c
    gif_hash.c
    gifalloc.c
    qprintf.c               # provides GifQprintf, used by utilities
    quantize.c              # provides GifQuantizeBuffer, part of public API
    openbsd-reallocarray.c  # no-op if platform already has reallocarray
)
 
target_include_directories(gif
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
 
if(NOT MSVC)
    target_compile_options(gif PRIVATE -Wall -Wno-format-truncation)
endif()
 
set_target_properties(gif PROPERTIES POSITION_INDEPENDENT_CODE ON)
 
if(WIN32)
    target_compile_definitions(gif PRIVATE _CRT_SECURE_NO_WARNINGS)
endif()
 
# SOVERSION 7 is the ABI major since giflib 5.0 — distinct from project version
set_target_properties(gif PROPERTIES
    VERSION     7.0.0
    SOVERSION   7
    OUTPUT_NAME gif
    # Export all symbols on Windows — giflib has no __declspec(dllexport).
    # Without this MSVC generates no import lib (gif.lib) at all.
    WINDOWS_EXPORT_ALL_SYMBOLS ON
)
 
 
 
# ---------------------------------------------------------------------------
# Utilities
# ---------------------------------------------------------------------------
if(GIFLIB_BUILD_UTILS)
    # On Windows, find getopt from getopt-win32 conda-forge package
    if(WIN32)
        find_library(GETOPT_LIB NAMES getopt)
        find_path(GETOPT_INCLUDE NAMES getopt.h PATH_SUFFIXES getopt)
    endif()
 
    foreach(_tool gifbuild gifclrmp giffix giftext giftool)
        add_executable(${_tool} ${_tool}.c getarg.c)
        target_include_directories(${_tool} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
        target_link_libraries(${_tool} PRIVATE gif)
        if(WIN32)
            # giftool.c includes <getopt.h> — not available in MSVC stdlib
            target_include_directories(${_tool} PRIVATE ${GETOPT_INCLUDE})
            target_link_libraries(${_tool} PRIVATE ${GETOPT_LIB})
        else()
            # gifclrmp.c calls pow() — libm is separate on Linux, implicit on macOS
            target_link_libraries(${_tool} PRIVATE m)
        endif()
    endforeach()
 
    install(TARGETS gifbuild gifclrmp giffix giftext giftool
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    )
endif()
 
# ---------------------------------------------------------------------------
# Install
# ---------------------------------------------------------------------------
install(TARGETS gif
    EXPORT      giflibTargets
    LIBRARY     DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE     DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME     DESTINATION ${CMAKE_INSTALL_BINDIR}
)
 
install(FILES gif_lib.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
 
# ---------------------------------------------------------------------------
# CMake package config
# ---------------------------------------------------------------------------
install(EXPORT giflibTargets
    FILE        giflibTargets.cmake
    NAMESPACE   giflib::
    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/giflib"
)
 
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/giflibConfig.cmake.in"
"@PACKAGE_INIT@\n\
include(\"\${CMAKE_CURRENT_LIST_DIR}/giflibTargets.cmake\")\n\
check_required_components(giflib)\n"
)
 
configure_package_config_file(
    "${CMAKE_CURRENT_BINARY_DIR}/giflibConfig.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/giflibConfig.cmake"
    INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/giflib"
)
 
write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/giflibConfigVersion.cmake"
    VERSION     ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
)
 
install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/giflibConfig.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/giflibConfigVersion.cmake"
    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/giflib"
)
 