2018-03-17 21:53:38 +03:00
|
|
|
project(libfort)
|
|
|
|
|
|
|
|
# Required cmake version
|
2018-01-01 11:26:34 +03:00
|
|
|
cmake_minimum_required(VERSION 2.8)
|
2018-03-31 13:33:37 +03:00
|
|
|
include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
|
2018-01-01 11:26:34 +03:00
|
|
|
|
2018-03-18 16:44:49 +03:00
|
|
|
# Built options
|
2018-03-17 21:53:38 +03:00
|
|
|
option(FORT_CXX_BUILD "Compile with c++ compiler instead of c" OFF)
|
2018-03-31 13:33:37 +03:00
|
|
|
option(FORT_ENABLE_ASTYLE "Enable astyle" OFF)
|
2018-11-16 22:25:40 +03:00
|
|
|
option(FORT_ENABLE_WCHAR "Enable wchar support" ON)
|
2018-04-01 13:40:56 +03:00
|
|
|
set(FORT_BUILD_TYPE "common" CACHE STRING "Build types(common, asan, ubsan, coveralls)")
|
2018-03-18 16:44:49 +03:00
|
|
|
|
|
|
|
|
2018-04-01 13:40:56 +03:00
|
|
|
# Determine compiler (pos. values Clang, GNU, Intel, MSVC, AppleClang...
|
|
|
|
# (https://cmake.org/cmake/help/v3.0/variable/CMAKE_LANG_COMPILER_ID.html)
|
2018-03-18 19:02:53 +03:00
|
|
|
if(FORT_CXX_BUILD)
|
|
|
|
set(FORT_COMPILER ${CMAKE_CXX_COMPILER_ID})
|
|
|
|
else(FORT_CXX_BUILD)
|
|
|
|
set(FORT_COMPILER ${CMAKE_C_COMPILER_ID})
|
|
|
|
endif(FORT_CXX_BUILD)
|
|
|
|
|
2018-03-18 16:44:49 +03:00
|
|
|
|
2018-01-01 11:26:34 +03:00
|
|
|
|
|
|
|
set(CMAKE_VERBOSE_MAKEFILE ON)
|
|
|
|
|
2018-03-31 13:33:37 +03:00
|
|
|
|
2018-04-16 21:01:45 +03:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Add WChar support for the build
|
|
|
|
# ------------------------------------------------------------------------------
|
2018-11-16 21:16:05 +03:00
|
|
|
if(FORT_ENABLE_WCHAR)
|
|
|
|
add_definitions(-DFT_CONGIG_HAVE_WCHAR)
|
|
|
|
endif(FORT_ENABLE_WCHAR)
|
|
|
|
|
2018-04-16 21:01:45 +03:00
|
|
|
|
2018-03-31 13:33:37 +03:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Includes
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
2018-05-06 16:50:08 +03:00
|
|
|
include_directories(lib)
|
2018-01-01 11:26:34 +03:00
|
|
|
include_directories(src)
|
2018-05-06 16:21:45 +03:00
|
|
|
include_directories(tests)
|
2018-01-01 11:26:34 +03:00
|
|
|
|
2018-03-18 16:44:49 +03:00
|
|
|
|
2018-03-31 13:33:37 +03:00
|
|
|
|
|
|
|
|
2018-04-16 21:01:45 +03:00
|
|
|
|
2018-03-31 13:33:37 +03:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Warnings
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
2018-04-16 21:39:29 +03:00
|
|
|
if("${FORT_COMPILER}" STREQUAL "MSVC")
|
2018-03-18 16:56:14 +03:00
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W4")
|
2018-04-01 16:20:15 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W4")
|
2018-04-16 21:39:29 +03:00
|
|
|
else("${FORT_COMPILER}" STREQUAL "MSVC")
|
2018-11-17 10:44:35 +03:00
|
|
|
set(ADDITIONAL_WARNINGS "\
|
|
|
|
-Wdouble-promotion \
|
|
|
|
-Wshadow \
|
|
|
|
-Wformat=2 \
|
|
|
|
-Wno-variadic-macros \
|
|
|
|
-Wcast-align \
|
2018-11-17 11:53:03 +03:00
|
|
|
-Wstrict-aliasing=2 \
|
|
|
|
-Wstrict-overflow=5 \
|
|
|
|
-Wfloat-equal \
|
|
|
|
-Wwrite-strings \
|
2018-11-17 10:44:35 +03:00
|
|
|
")
|
2018-11-17 11:53:03 +03:00
|
|
|
if("${FORT_COMPILER}" STREQUAL "GNU")
|
|
|
|
set(ADDITIONAL_WARNINGS "${ADDITIONAL_WARNINGS} -Wtrampolines -Wlogical-op")
|
|
|
|
endif("${FORT_COMPILER}" STREQUAL "GNU")
|
2018-11-17 10:44:35 +03:00
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g -Wextra -Werror -std=c99 -Wpedantic ${ADDITIONAL_WARNINGS}")
|
|
|
|
|
2018-11-17 11:53:03 +03:00
|
|
|
set(ADDITIONAL_WARNINGS "${ADDITIONAL_WARNINGS} ")
|
2018-11-17 10:44:35 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g -Wextra -Werror -std=c++11 ${ADDITIONAL_WARNINGS}")
|
2018-04-16 21:39:29 +03:00
|
|
|
endif("${FORT_COMPILER}" STREQUAL "MSVC")
|
2018-03-17 21:53:38 +03:00
|
|
|
|
|
|
|
|
2018-01-01 11:26:34 +03:00
|
|
|
|
|
|
|
|
2018-03-31 13:33:37 +03:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Sources and executables
|
|
|
|
# ------------------------------------------------------------------------------
|
2018-01-01 11:26:34 +03:00
|
|
|
|
2018-11-24 23:14:26 +03:00
|
|
|
FILE(GLOB_RECURSE FortHeaders "lib/*.h" "lib/*.hpp" "tests/*.h" "tests/*.hpp" "src/*.h")
|
2018-01-01 11:26:34 +03:00
|
|
|
add_custom_target(headers SOURCES ${FortHeaders})
|
|
|
|
|
|
|
|
|
2018-05-06 16:36:53 +03:00
|
|
|
set(FORT_DEV_SOURCES
|
|
|
|
src/fort_impl.c
|
2018-01-17 21:22:57 +03:00
|
|
|
src/vector.c
|
|
|
|
src/string_buffer.c
|
2018-11-03 23:50:30 +03:00
|
|
|
src/properties.c
|
2018-01-17 21:22:57 +03:00
|
|
|
src/cell.c
|
|
|
|
src/row.c
|
|
|
|
src/table.c
|
2018-05-06 16:36:53 +03:00
|
|
|
src/fort_utils.c
|
2018-03-21 20:46:27 +03:00
|
|
|
src/wcwidth.c)
|
|
|
|
|
2018-01-01 11:26:34 +03:00
|
|
|
|
2018-03-17 21:53:38 +03:00
|
|
|
|
2018-01-01 11:26:34 +03:00
|
|
|
|
2018-03-18 12:17:33 +03:00
|
|
|
set(EXAMPLE_SOURCES
|
|
|
|
example/main.c)
|
2018-03-09 15:21:18 +03:00
|
|
|
add_executable(${PROJECT_NAME}_example
|
2018-03-18 12:17:33 +03:00
|
|
|
${EXAMPLE_SOURCES}
|
2018-05-06 22:51:41 +03:00
|
|
|
lib/fort.c)
|
2018-01-01 11:26:34 +03:00
|
|
|
|
2018-04-01 11:36:52 +03:00
|
|
|
set(EXAMPLE_CPP_SOURCES
|
|
|
|
example/main.cpp)
|
|
|
|
add_executable(${PROJECT_NAME}_example_cpp
|
|
|
|
${EXAMPLE_CPP_SOURCES}
|
2018-05-06 22:51:41 +03:00
|
|
|
lib/fort.c)
|
2018-01-01 11:26:34 +03:00
|
|
|
|
2018-05-06 16:21:45 +03:00
|
|
|
set(TEST_SOURCES_DEV
|
|
|
|
tests/main_test.c
|
|
|
|
tests/wb_tests/test_vector.c
|
|
|
|
tests/wb_tests/test_string_buffer.c
|
|
|
|
tests/wb_tests/test_table_geometry.c
|
|
|
|
tests/bb_tests/test_table_basic.c
|
|
|
|
tests/bb_tests/test_table_border_style.c
|
2018-11-03 23:50:30 +03:00
|
|
|
tests/bb_tests/test_table_properties.c
|
2018-05-06 16:21:45 +03:00
|
|
|
tests/bb_tests/test_memory_errors.c
|
2018-11-24 23:14:26 +03:00
|
|
|
tests/tests.c
|
2018-05-06 16:28:18 +03:00
|
|
|
tests/test_utils.c)
|
2018-05-06 16:21:45 +03:00
|
|
|
add_executable(${PROJECT_NAME}_test_dev
|
2018-05-06 16:36:53 +03:00
|
|
|
${FORT_DEV_SOURCES}
|
2018-05-06 16:21:45 +03:00
|
|
|
${TEST_SOURCES_DEV})
|
|
|
|
|
|
|
|
target_compile_definitions(${PROJECT_NAME}_test_dev
|
|
|
|
PUBLIC FORT_WB_TESTING_ENABLED=1)
|
|
|
|
|
2018-03-18 12:17:33 +03:00
|
|
|
set(TEST_SOURCES
|
2018-05-06 16:21:45 +03:00
|
|
|
tests/main_test.c
|
|
|
|
tests/bb_tests/test_table_basic.c
|
|
|
|
tests/bb_tests/test_table_border_style.c
|
2018-11-03 23:50:30 +03:00
|
|
|
tests/bb_tests/test_table_properties.c
|
2018-05-06 16:21:45 +03:00
|
|
|
tests/bb_tests/test_memory_errors.c
|
2018-11-24 23:14:26 +03:00
|
|
|
tests/tests.c
|
2018-05-06 16:28:18 +03:00
|
|
|
tests/test_utils.c)
|
2018-03-18 12:17:33 +03:00
|
|
|
add_executable(${PROJECT_NAME}_test
|
2018-05-06 16:50:08 +03:00
|
|
|
lib/fort.c
|
2018-03-18 12:17:33 +03:00
|
|
|
${TEST_SOURCES})
|
2018-01-01 11:26:34 +03:00
|
|
|
|
|
|
|
|
2018-07-25 22:37:10 +03:00
|
|
|
set(TEST_SOURCES_CPP
|
|
|
|
tests/main_test_cpp.cpp
|
|
|
|
tests/bb_tests_cpp/test_table_basic.cpp
|
2018-11-21 20:50:56 +03:00
|
|
|
tests/bb_tests_cpp/test_table_properties.cpp
|
2018-11-24 23:14:26 +03:00
|
|
|
tests/tests.c
|
2018-11-21 20:50:56 +03:00
|
|
|
tests/test_utils.cpp)
|
2018-07-25 22:37:10 +03:00
|
|
|
add_executable(${PROJECT_NAME}_test_cpp
|
|
|
|
lib/fort.c
|
|
|
|
${TEST_SOURCES_CPP})
|
|
|
|
|
2018-03-18 12:17:33 +03:00
|
|
|
if(FORT_CXX_BUILD)
|
2018-05-06 16:36:53 +03:00
|
|
|
SET_SOURCE_FILES_PROPERTIES( ${FORT_DEV_SOURCES} PROPERTIES LANGUAGE CXX)
|
2018-03-18 12:17:33 +03:00
|
|
|
SET_SOURCE_FILES_PROPERTIES( ${EXAMPLE_SOURCES} PROPERTIES LANGUAGE CXX)
|
|
|
|
SET_SOURCE_FILES_PROPERTIES( ${TEST_SOURCES} PROPERTIES LANGUAGE CXX)
|
|
|
|
endif(FORT_CXX_BUILD)
|
2018-01-01 11:26:34 +03:00
|
|
|
|
|
|
|
|
2018-09-01 19:42:57 +03:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Set preprocessor macros for all test builds
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
target_compile_definitions(${PROJECT_NAME}_test_dev PRIVATE FT_TEST_BUILD=1)
|
|
|
|
target_compile_definitions(${PROJECT_NAME}_test_cpp PRIVATE FT_TEST_BUILD=1)
|
|
|
|
target_compile_definitions(${PROJECT_NAME}_test PRIVATE FT_TEST_BUILD=1)
|
2018-03-18 15:32:02 +03:00
|
|
|
|
2018-03-31 13:33:37 +03:00
|
|
|
# ------------------------------------------------------------------------------
|
2018-04-01 13:40:56 +03:00
|
|
|
# Sanitizers
|
2018-03-31 13:33:37 +03:00
|
|
|
# ------------------------------------------------------------------------------
|
2018-03-18 16:44:49 +03:00
|
|
|
|
2018-04-16 21:39:29 +03:00
|
|
|
if("${FORT_COMPILER}" STREQUAL "GNU" OR "${FORT_COMPILER}" STREQUAL "Clang")
|
2018-03-18 19:02:53 +03:00
|
|
|
# asan case
|
2018-03-18 16:44:49 +03:00
|
|
|
if(FORT_BUILD_TYPE STREQUAL "asan")
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
|
2018-04-01 16:12:43 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
|
2018-04-16 21:39:29 +03:00
|
|
|
if("${FORT_COMPILER}" STREQUAL "GNU")
|
2018-03-18 16:44:49 +03:00
|
|
|
target_link_libraries(${PROJECT_NAME}_example asan)
|
|
|
|
target_link_libraries(${PROJECT_NAME}_test asan)
|
2018-04-01 16:12:43 +03:00
|
|
|
target_link_libraries(${PROJECT_NAME}_example_cpp asan)
|
2018-04-16 21:39:29 +03:00
|
|
|
endif("${FORT_COMPILER}" STREQUAL "GNU")
|
2018-03-18 16:44:49 +03:00
|
|
|
endif(FORT_BUILD_TYPE STREQUAL "asan")
|
2018-03-18 19:02:53 +03:00
|
|
|
|
|
|
|
#ubsan case
|
2018-03-18 16:44:49 +03:00
|
|
|
if(FORT_BUILD_TYPE STREQUAL "ubsan")
|
2018-04-01 13:40:56 +03:00
|
|
|
# -fno-sanitize-recover option is used to force faild
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover")
|
2018-04-01 16:12:43 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover")
|
2018-04-16 21:39:29 +03:00
|
|
|
if("${FORT_COMPILER}" STREQUAL "GNU")
|
2018-03-18 16:44:49 +03:00
|
|
|
target_link_libraries(${PROJECT_NAME}_example ubsan)
|
2018-04-01 11:36:52 +03:00
|
|
|
target_link_libraries(${PROJECT_NAME}_example_cpp ubsan)
|
2018-03-18 16:44:49 +03:00
|
|
|
target_link_libraries(${PROJECT_NAME}_test ubsan)
|
2018-04-16 21:39:29 +03:00
|
|
|
endif("${FORT_COMPILER}" STREQUAL "GNU")
|
2018-11-24 23:14:26 +03:00
|
|
|
endif(FORT_BUILD_TYPE STREQUAL "ubsan")
|
2018-03-18 16:44:49 +03:00
|
|
|
|
2018-03-18 19:02:53 +03:00
|
|
|
#coveralls case
|
|
|
|
if(FORT_BUILD_TYPE STREQUAL "coveralls")
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fprofile-arcs -ftest-coverage")
|
2018-04-01 16:12:43 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fprofile-arcs -ftest-coverage")
|
|
|
|
#target_link_libraries(${PROJECT_NAME}_example_cpp gcov)
|
2018-03-18 19:02:53 +03:00
|
|
|
endif(FORT_BUILD_TYPE STREQUAL "coveralls")
|
|
|
|
|
2018-04-16 21:39:29 +03:00
|
|
|
endif("${FORT_COMPILER}" STREQUAL "GNU" OR "${FORT_COMPILER}" STREQUAL "Clang")
|
2018-03-18 16:44:49 +03:00
|
|
|
|
|
|
|
|
2018-03-18 19:27:09 +03:00
|
|
|
# Hack for some gcc versions
|
2018-04-16 21:39:29 +03:00
|
|
|
if("${FORT_COMPILER}" STREQUAL "GNU")
|
2018-03-18 19:27:09 +03:00
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold")
|
2018-04-01 16:20:15 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold")
|
2018-04-16 21:39:29 +03:00
|
|
|
endif("${FORT_COMPILER}" STREQUAL "GNU")
|
2018-03-18 19:27:09 +03:00
|
|
|
|
2018-03-19 23:07:18 +03:00
|
|
|
|
2018-03-31 13:33:37 +03:00
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Astyle
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
if(FORT_ENABLE_ASTYLE)
|
|
|
|
list(APPEND ASTYLE_CMAKE_ARGS
|
|
|
|
"-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}"
|
|
|
|
)
|
|
|
|
|
|
|
|
ExternalProject_Add(
|
|
|
|
astyle
|
|
|
|
GIT_REPOSITORY https://github.com/Bareflank/astyle.git
|
|
|
|
GIT_TAG v1.2
|
|
|
|
GIT_SHALLOW 1
|
|
|
|
CMAKE_ARGS ${ASTYLE_CMAKE_ARGS}
|
|
|
|
PREFIX ${CMAKE_BINARY_DIR}/external/astyle/prefix
|
|
|
|
TMP_DIR ${CMAKE_BINARY_DIR}/external/astyle/tmp
|
|
|
|
STAMP_DIR ${CMAKE_BINARY_DIR}/external/astyle/stamp
|
|
|
|
DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/external/astyle/download
|
|
|
|
SOURCE_DIR ${CMAKE_BINARY_DIR}/external/astyle/src
|
|
|
|
BINARY_DIR ${CMAKE_BINARY_DIR}/external/astyle/build
|
|
|
|
)
|
|
|
|
|
|
|
|
list(APPEND ASTYLE_ARGS
|
|
|
|
--style=kr
|
|
|
|
--lineend=linux
|
|
|
|
--suffix=none
|
|
|
|
--pad-oper
|
|
|
|
--unpad-paren
|
|
|
|
--align-pointer=name
|
|
|
|
--align-reference=name
|
|
|
|
--indent-switches
|
|
|
|
--keep-one-line-statements
|
|
|
|
--keep-one-line-blocks
|
|
|
|
--pad-header
|
|
|
|
--convert-tabs
|
|
|
|
--min-conditional-indent=0
|
|
|
|
--indent=spaces=4
|
2018-05-06 16:50:08 +03:00
|
|
|
${CMAKE_SOURCE_DIR}/lib/*.h
|
|
|
|
${CMAKE_SOURCE_DIR}/lib/*.c
|
|
|
|
${CMAKE_SOURCE_DIR}/src/*.h
|
2018-03-31 13:33:37 +03:00
|
|
|
${CMAKE_SOURCE_DIR}/src/*.c
|
|
|
|
${CMAKE_SOURCE_DIR}/tests/*.c
|
2018-05-06 16:50:08 +03:00
|
|
|
${CMAKE_SOURCE_DIR}/tests/*.h
|
2018-11-24 23:14:26 +03:00
|
|
|
${CMAKE_SOURCE_DIR}/tests/*.hpp
|
2018-05-06 16:50:08 +03:00
|
|
|
${CMAKE_SOURCE_DIR}/tests/bb_tests/*.c
|
|
|
|
${CMAKE_SOURCE_DIR}/tests/wb_tests/*.c
|
2018-07-26 22:25:22 +03:00
|
|
|
${CMAKE_SOURCE_DIR}/tests/bb_tests_cpp/*.cpp
|
2018-03-31 13:33:37 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
if(NOT WIN32 STREQUAL "1")
|
|
|
|
add_custom_target(
|
|
|
|
format
|
|
|
|
COMMAND ${CMAKE_BINARY_DIR}/bin/astyle ${ASTYLE_ARGS}
|
|
|
|
COMMENT "running astyle"
|
|
|
|
)
|
|
|
|
else()
|
|
|
|
add_custom_target(
|
|
|
|
format
|
|
|
|
COMMAND ${CMAKE_BINARY_DIR}/bin/astyle.exe ${ASTYLE_ARGS}
|
|
|
|
COMMENT "running astyle"
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
endif()
|