include_guard(GLOBAL) include(GenerateExportHeader) function(myx_add_library) set(options) set(oneValueArgs PCH TYPE) set(multiValueArgs SOURCES COMPILE_DEFINITIONS) cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT arg_TYPE) set(arg_TYPE "OBJECT") endif() add_library(${PROJECT_NAME} ${arg_TYPE}) if(arg_TYPE STREQUAL INTERFACE) target_include_directories(${PROJECT_NAME} INTERFACE $ $ ) else() string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER) # Опция для разрешения сборки разделяемой библиотеки option(${PROJECT_NAME_UPPER}_BUILD_SHARED "Build shared library" ON) # Опция для разрешения сборки статической библиотеки option(${PROJECT_NAME_UPPER}_BUILD_STATIC "Build static library" ON) target_include_directories(${PROJECT_NAME} PUBLIC $ PRIVATE $ ) set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) string(TOUPPER ${PROJECT_NAME} suffix) generate_export_header(${PROJECT_NAME} BASE_NAME "${suffix}" EXPORT_MACRO_NAME "EXPORT_${suffix}" DEPRECATED_MACRO_NAME "DEPRECATED_${suffix}" NO_DEPRECATED_MACRO_NAME "NO_DEPRECATED_${suffix}" NO_EXPORT_MACRO_NAME "NO_EXPORT_${suffix}" STATIC_DEFINE "STATIC_DEFINE_${suffix}" EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME}/export_autogen.hpp" DEFINE_NO_DEPRECATED ) # Цель для создания разделяемой библиотеки из объектных файлов if(${PROJECT_NAME_UPPER}_BUILD_SHARED) # Для создания разделяемой библиотеки используются объектные файлы цели ${PROJECT_NAME} add_library(${PROJECT_NAME}_shared SHARED $) # Установка дополнительных свойств для цели ${PROJECT_NAME}_shared # OUTPUT_NAME: базовое имя выходного файла (без учёта расширения) # VERSION: версия библиотеки # SOVERSION: мажорная версия библиотеки set_target_properties(${PROJECT_NAME}_shared PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} OUTPUT_NAME ${PROJECT_NAME}) endif() # Цель для создания статической библиотеки из объектных файлов if(${PROJECT_NAME_UPPER}_BUILD_STATIC) # Для создания статической библиотеки используются объектные файлы цели ${PROJECT_NAME} add_library(${PROJECT_NAME}_static STATIC $) # Установка дополнительных свойств для цели ${PROJECT_NAME}_static # OUTPUT_NAME: базовое имя выходного файла (без учёта расширения) set_target_properties(${PROJECT_NAME}_static PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) endif() endif() if(arg_PCH) if(${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.16) target_precompile_headers(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/${arg_PCH}) else() target_compile_options(${PROJECT_NAME} PRIVATE -include ${PROJECT_SOURCE_DIR}/${arg_PCH}) endif() endif() target_sources(${PROJECT_NAME} PRIVATE ${arg_SOURCES}) target_compile_definitions(${PROJECT_NAME} PRIVATE ${arg_COMPILE_DEFINITIONS}) endfunction()