include_guard(GLOBAL) include(GenerateExportHeader) function(myx_add_library NAME) set(options) set(oneValueArgs PCH TYPE) set(multiValueArgs SOURCES LINK_LIBRARIES COMPILE_DEFINITIONS) cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT arg_TYPE) set(arg_TYPE "OBJECT") endif() add_library(${NAME} ${arg_TYPE}) if(arg_TYPE STREQUAL INTERFACE) target_include_directories(${NAME} INTERFACE $ $ ) else() string(TOUPPER ${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(${NAME} PUBLIC $ PRIVATE $ ) set_target_properties(${NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) string(TOUPPER ${NAME} suffix) generate_export_header(${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/${NAME}/export_autogen.hpp" DEFINE_NO_DEPRECATED ) # Цель для создания разделяемой библиотеки из объектных файлов if(${PROJECT_NAME_UPPER}_BUILD_SHARED) # Для создания разделяемой библиотеки используются объектные файлы цели ${NAME} add_library(${NAME}_shared SHARED $) # Установка дополнительных свойств для цели ${NAME}_shared # OUTPUT_NAME: базовое имя выходного файла (без учёта расширения) # VERSION: версия библиотеки # SOVERSION: мажорная версия библиотеки set_target_properties(${NAME}_shared PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} OUTPUT_NAME ${NAME}) endif() # Цель для создания статической библиотеки из объектных файлов if(${PROJECT_NAME_UPPER}_BUILD_STATIC) # Для создания статической библиотеки используются объектные файлы цели ${NAME} add_library(${NAME}_static STATIC $) # Установка дополнительных свойств для цели ${NAME}_static # OUTPUT_NAME: базовое имя выходного файла (без учёта расширения) set_target_properties(${NAME}_static PROPERTIES OUTPUT_NAME ${NAME}) endif() endif() if(arg_PCH) if(${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.16) target_precompile_headers(${NAME} PRIVATE ${PROJECT_SOURCE_DIR}/${arg_PCH}) else() target_compile_options(${NAME} PRIVATE -include ${PROJECT_SOURCE_DIR}/${arg_PCH}) endif() endif() target_sources(${NAME} PRIVATE ${arg_SOURCES} ${PROJECT_SOURCE_DIR}/${arg_PCH}) target_compile_definitions(${NAME} PRIVATE ${arg_COMPILE_DEFINITIONS}) target_link_libraries(${NAME} PRIVATE ${arg_LINK_LIBRARIES}) endfunction()