cmake_minimum_required(VERSION 3.10) project(DCFG C) option(DCFG_POSIX_SUPPORT "Enable POSIX support" ON) option(DCFG_BUILD_PROGRAMS "Build DCFG example programs" ON) option(DCFG_ASAN "Enable AddressSanitizer" OFF) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) find_package(Threads) set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) if(DCFG_ASAN) if(MSVC) set(ASAN_COMPILE_FLAGS /fsanitize=address) set(ASAN_LINK_FLAGS /fsanitize=address) else() set(ASAN_COMPILE_FLAGS -fsanitize=address -fno-omit-frame-pointer) set(ASAN_LINK_FLAGS -fsanitize=address) endif() endif() # Shared library add_library(${PROJECT_NAME}_shared SHARED ${SRC_DIR}/dcfg.c) target_include_directories(${PROJECT_NAME}_shared PUBLIC ${INCLUDE_DIR}) set_target_properties(${PROJECT_NAME}_shared PROPERTIES OUTPUT_NAME "dcfg") # Static library add_library(${PROJECT_NAME}_static STATIC ${SRC_DIR}/dcfg.c) target_include_directories(${PROJECT_NAME}_static PUBLIC ${INCLUDE_DIR}) set_target_properties(${PROJECT_NAME}_static PROPERTIES OUTPUT_NAME "dcfg") foreach(TARGET ${PROJECT_NAME}_shared ${PROJECT_NAME}_static) if(DCFG_POSIX_SUPPORT) target_compile_definitions(${TARGET} PRIVATE DCFG_POSIX_SUPPORT) endif() if(MSVC) target_compile_options(${TARGET} PRIVATE /W4 /permissive-) else() target_compile_options(${TARGET} PRIVATE -Wall -Wextra -pedantic -Werror -Wno-newline-eof -Wno-language-extension-token) endif() if(NOT MSVC) target_link_libraries(${TARGET} PRIVATE m) endif() # AddressSanitizer if(DCFG_ASAN) target_compile_options(${TARGET} PRIVATE ${ASAN_COMPILE_FLAGS}) target_link_libraries(${TARGET} PRIVATE ${ASAN_LINK_FLAGS}) endif() endforeach() install(TARGETS ${PROJECT_NAME}_shared ${PROJECT_NAME}_static DESTINATION lib) install(DIRECTORY ${INCLUDE_DIR}/ DESTINATION include) if(DCFG_BUILD_PROGRAMS) set(PROGRAMS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/programs) file(GLOB PROGRAM_SOURCES "${PROGRAMS_DIR}/*.c") foreach(PROG_SRC ${PROGRAM_SOURCES}) get_filename_component(PROG_NAME ${PROG_SRC} NAME_WE) add_executable(${PROG_NAME} ${PROG_SRC}) target_include_directories(${PROG_NAME} PRIVATE ${INCLUDE_DIR}) target_link_libraries(${PROG_NAME} PRIVATE ${PROJECT_NAME}_static) if(MSVC) target_compile_options(${PROG_NAME} PRIVATE /W4 /permissive-) else() target_compile_options(${PROG_NAME} PRIVATE -Wall -Wextra -pedantic -Werror -Wno-newline-eof -Wno-language-extension-token) endif() if(DCFG_ASAN) target_compile_options(${PROG_NAME} PRIVATE ${ASAN_COMPILE_FLAGS}) target_link_libraries(${PROG_NAME} PRIVATE ${ASAN_LINK_FLAGS}) endif() install(TARGETS ${PROG_NAME} DESTINATION bin) endforeach() endif()