myx/lib/AddLibrary.cmake

102 lines
4.5 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#[=======================================================================[.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
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
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
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
PRIVATE
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
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 $<TARGET_OBJECTS:${NAME}>)
# Установка дополнительных свойств для цели ${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 $<TARGET_OBJECTS:${NAME}>)
# Установка дополнительных свойств для цели ${NAME}_static
# OUTPUT_NAME: базовое имя выходного файла (без учёта расширения)
set_target_properties(${NAME}_static
PROPERTIES
OUTPUT_NAME ${NAME})
endif()
endif()
endfunction()