163 lines
5.8 KiB
CMake
163 lines
5.8 KiB
CMake
# -----------------------------------------------------------------------------
|
|
# Copyright (c) 2021, Daan Leijen
|
|
# -----------------------------------------------------------------------------
|
|
cmake_minimum_required(VERSION 3.10)
|
|
project(libisocline C CXX ASM)
|
|
|
|
set(CMAKE_C_STANDARD 99)
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
|
|
option(IC_USE_CXX "Build with C++ compiler" OFF)
|
|
option(IC_DEBUG_UBSAN "Build with undefined behaviour sanitizer" OFF)
|
|
option(IC_DEBUG_ASAN "Build with address sanitizer" OFF)
|
|
option(IC_DEBUG_MSG "Enable printing debug messages stderr (only if also ISOCLINE_DEBUG=1 is set in the environment)" ON)
|
|
option(IC_SEPARATE_OBJS "Compile with separate object files instead of one (warning: exports internal symbols)" OFF)
|
|
|
|
set(ic_version "0.1")
|
|
set(ic_sources src/isocline.c)
|
|
set(ic_example_sources test/example.c test/test_colors.c)
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Initial definitions
|
|
# -----------------------------------------------------------------------------
|
|
set(ic_cflags)
|
|
set(ic_cdefs)
|
|
set(ic_install_dir)
|
|
|
|
if(IC_SEPARATE_OBJS)
|
|
list(APPEND ic_cdefs IC_SEPARATE_OBJS)
|
|
list(APPEND ic_sources
|
|
src/attr.c
|
|
src/bbcode.c
|
|
src/common.c
|
|
src/completions.c
|
|
src/completers.c
|
|
src/editline.c
|
|
src/highlight.c
|
|
src/history.c
|
|
src/stringbuf.c
|
|
src/term.c
|
|
src/tty_esc.c
|
|
src/tty.c
|
|
src/undo.c)
|
|
endif()
|
|
|
|
if(IC_USE_CXX)
|
|
set(IC_COMPILER_ID "${CMAKE_CXX_COMPILER_ID}")
|
|
set_source_files_properties(${ic_sources} PROPERTIES LANGUAGE CXX )
|
|
set_source_files_properties(${ic_example_sources} PROPERTIES LANGUAGE CXX )
|
|
else()
|
|
set(IC_COMPILER_ID "${CMAKE_C_COMPILER_ID}")
|
|
endif()
|
|
|
|
if(NOT IC_DEBUG_MSG)
|
|
message(STATUS "Disable debug messages")
|
|
list(APPEND ic_cdefs IC_NO_DEBUG_MSG)
|
|
endif()
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Convenience: set default build type depending on the build directory
|
|
# -----------------------------------------------------------------------------
|
|
|
|
if (NOT CMAKE_BUILD_TYPE)
|
|
if ("${CMAKE_BINARY_DIR}" MATCHES ".*(Debug|debug|dbg|ubsan|tsan|asan)$")
|
|
message(STATUS "No build type selected, default to: Debug")
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
else()
|
|
message(STATUS "No build type selected, default to: Release")
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
endif()
|
|
endif()
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Sanitizers
|
|
# -----------------------------------------------------------------------------
|
|
|
|
if(IC_DEBUG_UBSAN OR IC_DEBUG_ASAN)
|
|
if((CMAKE_BUILD_TYPE MATCHES "Debug") AND (IC_COMPILER_ID MATCHES "Clang"))
|
|
set(ic_san)
|
|
if (IC_DEBUG_UBSAN)
|
|
list(APPEND ic_san "undefined")
|
|
message(STATUS "Using the undefined behavior sanitizer.")
|
|
endif()
|
|
if (IC_DEBUG_ASAN)
|
|
list(APPEND ic_san "address")
|
|
message(STATUS "Using the address sanitizer. To detect memory leaks run as:")
|
|
message(STATUS "> ASAN_OPTIONS=\"detect_leaks=1:verbosity=1\" ./example")
|
|
endif()
|
|
list(JOIN ic_san "," ic_san)
|
|
list(APPEND ic_cflags -fsanitize=${ic_san})
|
|
list(APPEND CMAKE_EXE_LINKER_FLAGS -fsanitize=${ic_san})
|
|
else()
|
|
message(WARNING "Can only use sanitizer with a clang debug build (currently: ${IC_COMPILER_ID}, CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}, IC_USE_C=${IC_USE_C})")
|
|
endif()
|
|
endif()
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Flags
|
|
# -----------------------------------------------------------------------------
|
|
|
|
if (IC_COMPILER_ID MATCHES "AppleClang|Clang|GNU|Intel")
|
|
list(APPEND ic_cflags -Wall -Wextra -Wpedantic -Wno-unknown-pragmas -Wno-unused-function -Wno-padded -Wno-missing-field-initializers)
|
|
if (IC_COMPILER_ID MATCHES "AppleClang|Clang")
|
|
list(APPEND ic_cflags -Wimplicit-int-conversion -Wsign-conversion)
|
|
endif()
|
|
if (IC_COMPILER_ID MATCHES "GNU")
|
|
list(APPEND ic_cflags -Wsign-conversion -Wno-missing-braces)
|
|
if (NOT IC_USE_CXX)
|
|
list(APPEND ic_cflags -Wint-conversion)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# treat C extension as C++
|
|
if (IC_USE_CXX)
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang|Clang")
|
|
list(APPEND ic_cflags -Wno-deprecated)
|
|
endif()
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
|
|
list(APPEND ic_cflags -Kc++)
|
|
endif()
|
|
endif()
|
|
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Overview
|
|
# -----------------------------------------------------------------------------
|
|
|
|
message(STATUS "")
|
|
message(STATUS "Library : libisocline")
|
|
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
|
|
message(STATUS "Compiler : ${IC_COMPILER_ID}")
|
|
message(STATUS "Defines : ${ic_cdefs}")
|
|
# message(STATUS "Flags : ${ic_cflags}")
|
|
message(STATUS "")
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Static library (libisocline.a) and samples (example)
|
|
# -----------------------------------------------------------------------------
|
|
|
|
add_library(isocline STATIC ${ic_sources})
|
|
set_property(TARGET isocline PROPERTY POSITION_INDEPENDENT_CODE ON)
|
|
target_compile_options(isocline PRIVATE ${ic_cflags})
|
|
target_compile_definitions(isocline PRIVATE ${ic_cdefs})
|
|
target_include_directories(isocline PUBLIC
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
$<INSTALL_INTERFACE:${ic_install_dir}/include>
|
|
)
|
|
|
|
add_executable(example test/example.c)
|
|
target_compile_options(example PRIVATE ${ic_cflags})
|
|
target_include_directories(example PRIVATE include)
|
|
target_link_libraries(example PRIVATE isocline)
|
|
|
|
add_executable(test_colors test/test_colors.c)
|
|
target_compile_options(test_colors PRIVATE ${ic_cflags})
|
|
target_include_directories(test_colors PRIVATE include)
|
|
target_link_libraries(test_colors PRIVATE isocline)
|