#[=======================================================================[.rst: myx_add_library --------------- Вспомогательная функция для создания библиотеки:: myx_add_library(NAME TYPE) Обязательные параметры: `NAME` - имя библиотеки и `TYPE` - тип цели. Все остальные параметры передаются стандартной функции `add_library()` #]=======================================================================] include_guard(GLOBAL) include(GenerateExportHeader) function(myx_add_library NAME TYPE) set(options) set(oneValueArgs) set(multiValueArgs) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) # Вызов стандартной функции `add_library()` add_library(${NAME} ${TYPE} ${ARG_UNPARSED_ARGUMENTS}) # Если вызов был выполнен не из проекта верхнего уровня, # то созданная цель исключается из цели `all`. # При этом сама цель `${NAME}` может участвовать в сборке, # если окажется в перечне зависимостей. if(NOT PROJECT_IS_TOP_LEVEL) set_target_properties(${NAME} PROPERTIES EXCLUDE_FROM_ALL True ) endif() if(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}/${NAME}_export.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() endfunction()