207 lines
5.3 KiB
CMake
207 lines
5.3 KiB
CMake
if(${CMAKE_VERSION} VERSION_GREATER "3.3")
|
|
cmake_policy(SET CMP0063 NEW)
|
|
endif()
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
set(LIBRARY "libcmark-gfm")
|
|
set(STATICLIBRARY "libcmark-gfm_static")
|
|
set(HEADERS
|
|
cmark-gfm.h
|
|
cmark-gfm-extension_api.h
|
|
parser.h
|
|
buffer.h
|
|
node.h
|
|
iterator.h
|
|
chunk.h
|
|
references.h
|
|
footnotes.h
|
|
map.h
|
|
utf8.h
|
|
scanners.h
|
|
inlines.h
|
|
houdini.h
|
|
cmark_ctype.h
|
|
render.h
|
|
registry.h
|
|
syntax_extension.h
|
|
plugin.h
|
|
)
|
|
set(LIBRARY_SOURCES
|
|
cmark.c
|
|
node.c
|
|
iterator.c
|
|
blocks.c
|
|
inlines.c
|
|
scanners.c
|
|
scanners.re
|
|
utf8.c
|
|
buffer.c
|
|
references.c
|
|
footnotes.c
|
|
map.c
|
|
render.c
|
|
man.c
|
|
xml.c
|
|
html.c
|
|
commonmark.c
|
|
plaintext.c
|
|
latex.c
|
|
houdini_href_e.c
|
|
houdini_html_e.c
|
|
houdini_html_u.c
|
|
cmark_ctype.c
|
|
arena.c
|
|
linked_list.c
|
|
syntax_extension.c
|
|
registry.c
|
|
plugin.c
|
|
${HEADERS}
|
|
)
|
|
|
|
include_directories(. ${CMAKE_CURRENT_BINARY_DIR})
|
|
include_directories(
|
|
${PROJECT_BINARY_DIR}/extensions
|
|
)
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmark-gfm_version.h.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/cmark-gfm_version.h)
|
|
|
|
include (GenerateExportHeader)
|
|
|
|
include("../CheckFileOffsetBits.cmake")
|
|
CHECK_FILE_OFFSET_BITS()
|
|
|
|
# Check integrity of node structure when compiled as debug:
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DCMARK_DEBUG_NODES -DDEBUG")
|
|
set(CMAKE_LINKER_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG}")
|
|
|
|
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE} -pg")
|
|
set(CMAKE_LINKER_PROFILE "${CMAKE_LINKER_FLAGS_RELEASE} -pg")
|
|
|
|
# -fvisibility=hidden
|
|
set(CMAKE_C_VISIBILITY_PRESET hidden)
|
|
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
|
|
|
|
if (CMARK_SHARED)
|
|
add_library(${LIBRARY} SHARED ${LIBRARY_SOURCES})
|
|
# Include minor version and patch level in soname for now.
|
|
set_target_properties(${LIBRARY} PROPERTIES
|
|
OUTPUT_NAME "cmark-gfm"
|
|
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.gfm.${PROJECT_VERSION_GFM}
|
|
VERSION ${PROJECT_VERSION})
|
|
|
|
set_property(TARGET ${LIBRARY}
|
|
APPEND PROPERTY MACOSX_RPATH true)
|
|
|
|
# Avoid name clash between PROGRAM and LIBRARY pdb files.
|
|
set_target_properties(${LIBRARY} PROPERTIES PDB_NAME cmark-gfm_dll)
|
|
|
|
generate_export_header(${LIBRARY}
|
|
BASE_NAME ${PROJECT_NAME})
|
|
|
|
list(APPEND CMARK_INSTALL ${LIBRARY})
|
|
endif()
|
|
|
|
if (CMARK_STATIC)
|
|
add_library(${STATICLIBRARY} STATIC ${LIBRARY_SOURCES})
|
|
set_target_properties(${STATICLIBRARY} PROPERTIES
|
|
COMPILE_FLAGS -DCMARK_GFM_STATIC_DEFINE
|
|
POSITION_INDEPENDENT_CODE ON
|
|
AUTOMOC OFF
|
|
AUTOUIC OFF
|
|
AUTORCC OFF)
|
|
|
|
if (MSVC)
|
|
set_target_properties(${STATICLIBRARY} PROPERTIES
|
|
OUTPUT_NAME "cmark-gfm_static"
|
|
VERSION ${PROJECT_VERSION})
|
|
else()
|
|
set_target_properties(${STATICLIBRARY} PROPERTIES
|
|
OUTPUT_NAME "cmark-gfm"
|
|
VERSION ${PROJECT_VERSION})
|
|
endif(MSVC)
|
|
|
|
if (NOT CMARK_SHARED)
|
|
generate_export_header(${STATICLIBRARY}
|
|
BASE_NAME ${PROJECT_NAME})
|
|
endif()
|
|
|
|
list(APPEND CMARK_INSTALL ${STATICLIBRARY})
|
|
endif()
|
|
|
|
|
|
if(NOT MSVC OR CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
|
|
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
|
|
include(InstallRequiredSystemLibraries)
|
|
endif()
|
|
|
|
set(libdir lib${LIB_SUFFIX})
|
|
|
|
|
|
if(CMARK_SHARED OR CMARK_STATIC)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libcmark-gfm.pc.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/libcmark-gfm.pc @ONLY)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libcmark-gfm.pc
|
|
DESTINATION ${libdir}/pkgconfig)
|
|
|
|
install(FILES
|
|
cmark-gfm.h
|
|
cmark-gfm-extension_api.h
|
|
${CMAKE_CURRENT_BINARY_DIR}/cmark-gfm_export.h
|
|
${CMAKE_CURRENT_BINARY_DIR}/cmark-gfm_version.h
|
|
DESTINATION include
|
|
)
|
|
endif()
|
|
|
|
# Feature tests
|
|
include(CheckIncludeFile)
|
|
include(CheckCSourceCompiles)
|
|
include(CheckCSourceRuns)
|
|
include(CheckSymbolExists)
|
|
CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H)
|
|
CHECK_C_SOURCE_COMPILES(
|
|
"int main() { __builtin_expect(0,0); return 0; }"
|
|
HAVE___BUILTIN_EXPECT)
|
|
CHECK_C_SOURCE_COMPILES("
|
|
int f(void) __attribute__ (());
|
|
int main() { return 0; }
|
|
" HAVE___ATTRIBUTE__)
|
|
|
|
CONFIGURE_FILE(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
|
|
|
# Always compile with warnings
|
|
if(MSVC)
|
|
# Force to always compile with W4
|
|
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
|
|
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
|
else()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
|
|
endif()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX /wd4706 /wd4204 /wd4221 /wd4100 /D_CRT_SECURE_NO_WARNINGS")
|
|
elseif(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-parameter -std=c99 -pedantic")
|
|
endif()
|
|
|
|
# Compile as C++ under MSVC older than 12.0
|
|
if(MSVC AND MSVC_VERSION LESS 1800)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /TP")
|
|
endif()
|
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Ubsan")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
|
|
endif()
|
|
|
|
if(CMARK_LIB_FUZZER)
|
|
set(FUZZ_HARNESS "cmark-fuzz")
|
|
add_executable(${FUZZ_HARNESS} ../test/cmark-fuzz.c ${LIBRARY_SOURCES})
|
|
target_link_libraries(${FUZZ_HARNESS} "${CMAKE_LIB_FUZZER_PATH}")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-coverage=trace-pc-guard")
|
|
|
|
# cmark is written in C but the libFuzzer runtime is written in C++ which
|
|
# needs to link against the C++ runtime. Explicitly link it into cmark-fuzz
|
|
set_target_properties(${FUZZ_HARNESS} PROPERTIES LINK_FLAGS "-lstdc++")
|
|
endif()
|