# In order to maintain compatibility with older platforms which may not have a
# recent version of CMake (i.e. are running CMake <3.3), we cannot simply use
# the `add_compile_options` with a generator expression.  This uses the
# `target_compile_options` with `PRIVATE` to add the flags only to the targets
# so that CMark may be used in projects with non-C languages.
function(cmark_add_compile_options target)
    if(MSVC)
        target_compile_definitions(${target} PRIVATE _CRT_SECURE_NO_WARNINGS)
    else()
        target_compile_options(
            ${target}
            PRIVATE
                -Wall
                -Wextra
                -pedantic
                $<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>
        )
    endif()
    if(CMAKE_BUILD_TYPE STREQUAL Profile)
        target_compile_options(${target} PRIVATE -pg)
    endif()
    if(CMAKE_BUILD_TYPE STREQUAL Ubsan)
        target_compile_options(${target} PRIVATE -fsanitize=undefined)
    endif()
    if(CMARK_LIB_FUZZER)
        if(target MATCHES fuzz)
            target_compile_options(${target} PRIVATE -fsanitize=fuzzer)
            target_link_options(${target} PRIVATE -fsanitize=fuzzer)
        else()
            target_compile_options(${target} PRIVATE -fsanitize=fuzzer-no-link)
            target_link_options(${target} PRIVATE -fsanitize=fuzzer-no-link)
        endif()
    endif()
endfunction()

# Check integrity of node structure when compiled as debug
add_compile_options($<$<CONFIG:Debug>:-DCMARK_DEBUG_NODES>)

configure_file(cmark-rc_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/cmark-rc_version.h)
# configure_file(libcmark.pc.in
#   ${CMAKE_CURRENT_BINARY_DIR}/libcmark-rc.pc
#   @ONLY)

add_library(
    cmark-rc
    blocks.c
    buffer.c
    cmark.c
    cmark-rc.h
    cmark_ctype.c
    commonmark.c
    houdini_href_e.c
    houdini_html_e.c
    houdini_html_u.c
    html.c
    inlines.c
    iterator.c
    latex.c
    man.c
    node.c
    references.c
    render.c
    scanners.c
    scanners.re
    utf8.c
    xml.c
)
cmark_add_compile_options(cmark-rc)
set_target_properties(
    cmark-rc
    PROPERTIES
        OUTPUT_NAME
            "cmark-rc"
        # Avoid name clash between PROGRAM and LIBRARY pdb files.
        PDB_NAME
            libcmark-rc
        POSITION_INDEPENDENT_CODE
            YES
        # Include minor version and patch level in soname for now.
        SOVERSION
            ${PROJECT_VERSION}
        VERSION
            ${PROJECT_VERSION}
)
if(NOT BUILD_SHARED_LIBS)
    target_compile_definitions(cmark-rc PUBLIC CMARK_STATIC_DEFINE)
endif()
target_include_directories(
    cmark-rc
    INTERFACE
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
)

generate_export_header(cmark-rc BASE_NAME cmark-rc)

# FIXME(compnerd) this should be removed, but exists solely to allow a migration
# path for OSS Fuzz.
add_custom_target(cmark_static DEPENDS cmark-rc)

# add_executable(cmark_exe
#   main.c)
# cmark_add_compile_options(cmark_exe)
# set_target_properties(cmark_exe PROPERTIES
#   OUTPUT_NAME "cmark-rc"
#   INSTALL_RPATH "${Base_rpath}")
# target_link_libraries(cmark_exe PRIVATE
#   cmark-rc)

install(
    TARGETS
        cmark-rc
    EXPORT textautogenerate-cmark-rc-copy-targets
    RUNTIME
        DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY
        DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE
        DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libcmark-rc.pc
#   DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

# install(FILES
#   cmark-rc.h
#   ${CMAKE_CURRENT_BINARY_DIR}/cmark-rc_export.h
#   ${CMAKE_CURRENT_BINARY_DIR}/cmark-rc_version.h
#   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
#   )

# # generate cmark-config.cmake and cmark-config-version.cmake files
# configure_package_config_file(
#   "cmarkConfig.cmake.in"
#   "${CMAKE_CURRENT_BINARY_DIR}/generated/cmark-rc-config.cmake"
#   INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/cmark")
# write_basic_package_version_file(
#   "${CMAKE_CURRENT_BINARY_DIR}/generated/cmark-rc-config-version.cmake"
#   VERSION ${PROJECT_VERSION}
#   COMPATIBILITY SameMajorVersion)
# # install config and version file
# install(
#   FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/cmark-rc-config.cmake"
#         "${CMAKE_CURRENT_BINARY_DIR}/generated/cmark-rc-config-version.cmake"
#   DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/cmark-rc"
# )
# install targets file
install(
    EXPORT "textautogenerate-cmark-rc-copy-targets"
    NAMESPACE "cmark-rc::"
    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/textautogenerate-cmark-rc-copy"
)
set_target_properties(
    cmark-rc
    PROPERTIES
        OUTPUT_NAME
            textautogenerate-cmark-rc-copy
        VERSION
            "0.31.0"
        SOVERSION
            "0"
)

install(
    TARGETS
        cmark-rc
        ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}
    LIBRARY
        NAMELINK_SKIP
)
