MultiMarkdown-6/CMakeLists.txt

446 lines
11 KiB
CMake
Raw Normal View History

2015-06-13 21:59:00 +03:00
cmake_minimum_required (VERSION 2.6)
# ==================
# Define Our Project
# ==================
2017-01-19 06:43:15 +03:00
set (My_Project_Title "MultiMarkdown 6")
set (My_Project_Description "Lightweight markup processor to produce HTML, LaTeX, and more.")
2016-05-06 18:45:16 +03:00
set (My_Project_Author "Fletcher T. Penney")
set (My_Project_Revised_Date "2017-02-08")
2017-01-19 06:43:15 +03:00
set (My_Project_Version_Major 0)
set (My_Project_Version_Minor 1)
set (My_Project_Version_Patch 4a)
2015-06-13 21:59:00 +03:00
set (My_Project_Version "${My_Project_Version_Major}.${My_Project_Version_Minor}.${My_Project_Version_Patch}")
2017-01-19 06:43:15 +03:00
set (My_Project_Copyright_Date "2016 - 2017")
2015-06-13 21:59:00 +03:00
set (My_Project_Copyright "Copyright © ${My_Project_Copyright_Date} ${My_Project_Author}.")
string(TOUPPER ${My_Project_Title} My_Project_Title_Caps )
string(REGEX REPLACE " " "_" My_Project_Title_Caps ${My_Project_Title_Caps} )
2015-06-13 21:59:00 +03:00
project (${My_Project_Title})
2017-01-19 06:43:15 +03:00
# Enable this if you want to be warned about struct alignment
# add_definitions ("-Wpadded")
# =========================
# Build Submodules (if any)
# =========================
# add_subdirectory(submodules/foo)
# =================
# Configure Project
# =================
2015-06-13 21:59:00 +03:00
# Search for included files here
include_directories( ${PROJECT_SOURCE_DIR}/src )
include_directories( ${PROJECT_SOURCE_DIR}/test )
2015-11-09 15:58:43 +03:00
include_directories(${PROJECT_BINARY_DIR})
2015-06-13 21:59:00 +03:00
# Default is 256 -- needed for localization hash function
add_definitions("-fbracket-depth=264")
2015-06-13 21:59:00 +03:00
# =================
# Macro Definitions
# =================
MACRO(ADD_PUBLIC_HEADER target filename)
# Add filename to public_header_files list, flag it as
# public header for libraries and OS X Frameworks
# This will work for creating one library/framework with public headers
# per project. If you need more than one, you will need to customize
# the workflow as appropriate, since there is only one
# public_header_files list.
SET_TARGET_PROPERTIES(${target} PROPERTIES PUBLIC_HEADER ${filename})
LIST(APPEND public_header_files ${filename})
SET_SOURCE_FILES_PROPERTIES(
${filename}
PROPERTIES
MACOSX_PACKAGE_LOCATION
PUBLIC_HEADER
)
# Set Xcode project to configure public header location to allow
# use when this project is used in another workspace.
# NOTE: You must manually add a "Headers" build phase and add
# the desired public headers to that list for Xcode to use them.
#
# TODO: If anyone knows how to automate that in Cmake, I would be very
2017-01-16 20:04:15 +03:00
# grateful!!
SET_TARGET_PROPERTIES(${target} PROPERTIES
XCODE_ATTRIBUTE_PUBLIC_HEADERS_FOLDER_PATH
"include/$(TARGET_NAME)"
)
SET_TARGET_PROPERTIES(${target} PROPERTIES
XCODE_ATTRIBUTE_PRIVATE_HEADERS_FOLDER_PATH
"$(PUBLIC_HEADERS_FOLDER_PATH)/Private"
)
# Set Xcode target to include settings for OS X and iOS
SET_TARGET_PROPERTIES(${target} PROPERTIES
XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS
"macos iphonesimulator iphoneos"
)
SET_TARGET_PROPERTIES(${target} PROPERTIES
XCODE_ATTRIBUTE_VALID_ARCHITECTURES
"x86_64 i386 armv6 armv7 armv7s arm64"
)
ENDMACRO(ADD_PUBLIC_HEADER)
# The target should be an OS X Bundle with a PList
MACRO(MAKE_TARGET_BUNDLE targetname)
set_target_properties(
${targetname}
PROPERTIES
MACOSX_BUNDLE_INFO_PLIST
${PROJECT_SOURCE_DIR}/templates/plist.in
)
ENDMACRO(MAKE_TARGET_BUNDLE)
MACRO(ADD_LINKED_FRAMEWORK frame)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGES} -framework ${frame}")
ENDMACRO(ADD_LINKED_FRAMEWORK)
2015-06-13 21:59:00 +03:00
# ======================
# Process Template Files
# ======================
file(READ ${PROJECT_SOURCE_DIR}/LICENSE.txt My_Project_License)
2017-01-19 06:43:15 +03:00
string(REGEX REPLACE "\n" "\n\t" My_Project_License_Indented ${My_Project_License})
2015-06-13 21:59:00 +03:00
2017-01-19 06:43:15 +03:00
string(REGEX REPLACE "\"" "\\\\\"" My_Project_License_Escaped ${My_Project_License_Indented})
string(REGEX REPLACE "\n" "\\\\n\"\\\\\n\"" My_Project_License_Literal ${My_Project_License_Escaped})
2015-06-13 21:59:00 +03:00
configure_file (
"${PROJECT_SOURCE_DIR}/templates/template.c.in"
"${PROJECT_BINARY_DIR}/template.c"
)
configure_file (
"${PROJECT_SOURCE_DIR}/templates/template.h.in"
"${PROJECT_BINARY_DIR}/template.h"
)
# Update the project README, to pull in new version #, etc.
2015-06-13 21:59:00 +03:00
configure_file (
"${PROJECT_SOURCE_DIR}/templates/README.md.in"
"${CMAKE_CURRENT_LIST_DIR}/README.md"
2015-06-13 21:59:00 +03:00
)
configure_file (
"${PROJECT_SOURCE_DIR}/templates/version.h.in"
"${PROJECT_BINARY_DIR}/version.h"
)
2015-06-13 21:59:00 +03:00
# ============
# Source Files
# ============
2015-06-13 21:59:00 +03:00
# src_files are the primary files, and will be included in doxygen documentation
2015-06-13 21:59:00 +03:00
set(src_files
2017-01-19 06:43:15 +03:00
src/argtable3.c
src/char.c
src/d_string.c
src/html.c
src/lexer.c
src/mmd.c
src/object_pool.c
src/parser.c
src/rng.c
src/scanners.c
src/stack.c
src/token.c
src/token_pairs.c
src/writer.c
2015-06-13 21:59:00 +03:00
)
# Primary header files, also for doxygen documentation
2015-06-13 21:59:00 +03:00
set(header_files
2017-01-19 06:43:15 +03:00
src/argtable3.h
src/d_string.h
src/char.h
src/html.h
src/lexer.h
src/libMultiMarkdown.h
src/mmd.h
src/object_pool.h
src/scanners.h
src/stack.h
src/token.h
src/token_pairs.h
src/uthash.h
src/writer.h
)
# Public headers, will be installed in 'include'
# Do not manually add files here, use the ADD_PUBLIC_HEADER() macro
set(public_header_files
)
# Utility source files will not be included in doxygen
set(src_utility_files
)
set(header_utility_files
${PROJECT_BINARY_DIR}/version.h
2015-06-13 21:59:00 +03:00
)
2015-06-14 15:23:41 +03:00
# Generate doxygen configuration file
2015-06-14 15:54:05 +03:00
string(REPLACE ";" " " doxygen_src_files "${src_files}" )
string(REPLACE ";" " " doxygen_header_files "${header_files}" )
2015-06-14 15:30:14 +03:00
2015-06-14 15:23:41 +03:00
configure_file (
"${PROJECT_SOURCE_DIR}/templates/doxygen.conf.in"
"${PROJECT_BINARY_DIR}/doxygen.conf"
)
2015-06-13 21:59:00 +03:00
# ===========================================
# Build Test Suite with CuTest (unit testing)
# ===========================================
# from http://stackoverflow.com/questions/25199677/how-to-detect-if-current-scope-has-a-parent-in-cmake
get_directory_property(hasParent PARENT_DIRECTORY)
if(hasParent)
# Don't create "run_tests" when we're a sub-project for something else
else()
set(test_files
test/CuTest.c
test/CuTest.h
${PROJECT_BINARY_DIR}/AllTests.c
)
2015-06-13 21:59:00 +03:00
if (DEFINED TEST)
add_definitions(-DTEST)
2015-06-13 21:59:00 +03:00
add_executable(run_tests
${test_files}
${src_files}
${header_files}
${src_utility_files}
${header_utility_files}
)
2015-06-13 21:59:00 +03:00
# Process source files to look for tests to run
add_custom_command (
OUTPUT ${PROJECT_BINARY_DIR}/AllTests.c
COMMAND sh ${PROJECT_SOURCE_DIR}/test/make-tests.sh ${PROJECT_SOURCE_DIR}/src/*.c > ${PROJECT_BINARY_DIR}/AllTests.c
)
2015-06-13 21:59:00 +03:00
enable_testing()
2015-06-13 21:59:00 +03:00
add_test( test ${PROJECT_BINARY_DIR}/run_tests)
2015-06-13 21:59:00 +03:00
# valgrind memory testing
2017-01-19 06:43:15 +03:00
# find_program (MEMORYCHECK_COMMAND valgrind)
# SET (MEMORYCHECK_COMMAND_OPTIONS --leak-check=full --error-exitcode=1)
#
# add_test( memory_test ${MEMORYCHECK_COMMAND} ${MEMORYCHECK_COMMAND_OPTIONS} ${PROJECT_BINARY_DIR}/run_tests)
endif()
2015-06-13 21:59:00 +03:00
endif()
2015-11-03 20:17:19 +03:00
# =======================
# Configure for Target OS
# =======================
# OS X Builds
2015-11-03 20:17:19 +03:00
if (APPLE)
# Configure backwards-compatible support (if your project allows it)
SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.4" CACHE STRING "Deployment target for OSX" FORCE)
2015-11-03 20:17:19 +03:00
# Compile for x86_64 and i386. ppc no longer supported
if(CMAKE_BUILD_TYPE MATCHES "Release")
SET (CMAKE_OSX_ARCHITECTURES x86_64;i386)
endif(CMAKE_BUILD_TYPE MATCHES "Release")
# Use PackageMaker for installers?
if (DEFINED ZIP)
set (CPACK_GENERATOR ZIP)
else (DEFINED ZIP)
set (CPACK_GENERATOR PackageMaker)
endif (DEFINED ZIP)
2015-11-03 20:17:19 +03:00
endif (APPLE)
# Windows Builds
2015-11-03 20:17:19 +03:00
if (WIN32)
# Use NSIS to generate installers?
if (DEFINED ZIP)
set (CPACK_GENERATOR ZIP)
else (DEFINED ZIP)
set (CPACK_GENERATOR NSIS)
endif (DEFINED ZIP)
2015-11-03 20:17:19 +03:00
# Linux Builds (not cross-compiling for Windows)
2015-11-03 20:17:19 +03:00
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# Create zip archive
set (CPACK_GENERATOR ZIP)
# Statically link libraries -- might make the binary slightly more
# compatible across Linux distributions, for example
2015-11-13 03:19:04 +03:00
#
# You may wish to disable this.
#
set (CMAKE_FIND_LIBRARY_SUFFIXES ".a")
set (BUILD_SHARED_LIBRARIES OFF)
set (CMAKE_EXE_LINKER_FLAGS "-static")
2015-11-03 20:17:19 +03:00
# Some libraries need to be linked on some Linux builds
if (DEFINED TEST)
# target_link_libraries(run_tests m)
endif (DEFINED TEST)
endif (WIN32)
# ==============
# Define targets
# ==============
# Create a library?
2017-01-29 19:47:13 +03:00
if (NOT DEFINED TEST)
add_library(libMultiMarkdown STATIC
${src_files}
${src_utility_files}
${header_files}
${header_utility_files}
)
else ()
add_library(libMultiMarkdown STATIC
${src_files}
${src_utility_files}
${header_files}
${header_utility_files}
${test_files}
)
endif ()
2017-01-19 06:43:15 +03:00
ADD_PUBLIC_HEADER(libMultiMarkdown src/libMultiMarkdown.h)
ADD_PUBLIC_HEADER(libMultiMarkdown src/d_string.h)
# remove the extra "lib" from "liblibFOO"
2017-01-19 06:43:15 +03:00
SET_TARGET_PROPERTIES(libMultiMarkdown PROPERTIES PREFIX "")
# Create a command-line app?
# if (NOT DEFINED TEST)
2017-01-19 06:43:15 +03:00
add_executable(multimarkdown
src/d_string.c
src/main.c
)
#
# Link the library to the app?
2017-01-19 06:43:15 +03:00
target_link_libraries(multimarkdown libMultiMarkdown)
# endif()
2015-11-09 17:36:44 +03:00
# Xcode settings for fat binaries
2017-01-19 06:43:15 +03:00
set_target_properties(libMultiMarkdown PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO")
set_target_properties(multimarkdown PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO")
2015-11-09 17:36:44 +03:00
2015-06-13 21:59:00 +03:00
# ==========================
# Build Installer with CPack
# ==========================
2015-06-15 05:04:15 +03:00
# You're largely on your own here
# install (FILES ${CMAKE_CURRENT_LIST_DIR}/README.md ${PROJECT_SOURCE_DIR}/LICENSE.txt
# DESTINATION .
# )
2015-06-15 05:04:15 +03:00
# Use something like this to install public header files (after adding them
# with the ADD_PUBLIC_HEADER() macro)
# install (FILES ${public_header_files} DESTINATION local/include/libFoo)
2015-06-15 05:04:15 +03:00
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "${My_Project_Description}")
set (CPACK_PACKAGE_VENDOR "${My_Project_Author}")
set (CPACK_PACKAGE_VERSION "${My_Project_Version_Major}.${My_Project_Version_Minor}.${My_Project_Version_Patch}")
set (CPACK_PACKAGE_VERSION_MAJOR "${My_Project_Version_Major}")
set (CPACK_PACKAGE_VERSION_MINOR "${My_Project_Version_Minor}")
set (CPACK_PACKAGE_VERSION_PATCH "My_Project_Version_Patch")
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt")
if (APPLE)
set (CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-Mac-${CPACK_PACKAGE_VERSION}")
else (APPLE)
set (CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${CMAKE_SYSTEM_NAME}-${CPACK_PACKAGE_VERSION}")
endif (APPLE)
# Use some default install locations (if appropriate)
if (WIN32)
set (CPACK_INSTALL_PREFIX "")
set (CPACK_NSIS_MODIFY_PATH ON)
else (WIN32)
set (CPACK_INSTALL_PREFIX /usr/local)
endif (WIN32)
set (CPACK_PACKAGE_INSTALL_DIRECTORY ${PROJECT})
2015-06-15 05:04:15 +03:00
include (CPack)
2017-01-19 06:43:15 +03:00
# ======================
# Integration Test Suite
# ======================
enable_testing()
function(ADD_MMD_TEST NAME FLAGS FOLDER EXTENSION)
add_test ( ${NAME}
${PROJECT_SOURCE_DIR}/tests/MarkdownTest.pl
--Script=${CMAKE_CURRENT_BINARY_DIR}/multimarkdown
--testdir=${PROJECT_SOURCE_DIR}/tests/${FOLDER}
"--Flags=${FLAGS}"
--ext=${EXTENSION}
)
endfunction(ADD_MMD_TEST)
# MMD 6
ADD_MMD_TEST(mmd-6 "" MMD6Tests html)
ADD_MMD_TEST(mmd-6-compat "-c" MMD6Tests htmlc)
2017-01-27 22:18:05 +03:00
ADD_MMD_TEST(pathologic "" ../build html)
ADD_MMD_TEST(pathologic-compat "-c" ../build html)