@ -4,12 +4,12 @@ myx_add_library
В с п о м о г а т е л ь н а я ф у н к ц и я д л я с о з д а н и я б и б л и о т е к и : :
myx_add_library ( NAME TYPE
myx_add_library ( TARGET_NAME TARGET_ TYPE
[ OUTPUT_NAME output_name ] |
[ EXPORT_FILE_NAME file_name ] |
[ EXPORT_BASE_NAME base_name ] )
О б я з а т е л ь н ы е п а р а м е т р ы : ` N A M E ` - и м я б и б л и о т е к и и ` T Y P E ` - т и п ц е л и .
О б я з а т е л ь н ы е п а р а м е т р ы : ` T A R G E T _ NA M E ` - и м я б и б л и о т е к и и ` T A R G E T _ T YP E ` - т и п ц е л и .
П а р а м е т р ` O U T P U T _ N A M E ` о п р е д е л я е т б а з о в о е и м я в ы х о д н ы х ф а й л о в .
П а р а м е т р ` E X P O R T _ F I L E _ N A M E ` з а д а ё т и м я з а г о л о в о ч н о г о ф а й л а э к с п о р т и р у е м ы х
п е р е м е н н ы х , а ` E X P O R T _ B A S E _ N A M E ` - б а з о в ы й с у ф ф и к с д л я ф о р м и р о в а н и я и м ё н п е р е м е н н ы х .
@ -26,7 +26,7 @@ if(${CMAKE_VERSION} VERSION_LESS "3.17.0")
set ( MYX_CMAKE_LIB_DIR_BACKPORT "${CMAKE_CURRENT_LIST_DIR}" )
endif ( )
function ( myx_add_library NAME TYPE)
function ( myx_add_library TARGET_NAME TARGET_ TYPE)
if ( ${ CMAKE_VERSION } VERSION_LESS "3.17.0" )
set ( CMAKE_CURRENT_FUNCTION_LIST_DIR ${ MYX_CMAKE_LIB_DIR_BACKPORT } )
endif ( )
@ -37,27 +37,28 @@ function(myx_add_library NAME TYPE)
cmake_parse_arguments ( ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
if ( NOT ARG_OUTPUT_NAME )
set ( ARG_OUTPUT_NAME ${ NAME } )
set ( ARG_OUTPUT_NAME ${ TARGET_ NAME} )
endif ( )
# Вызов стандартной функции `add_library()`
add_library ( ${ NAME } ${ TYPE } ${ ARG_UNPARSED_ARGUMENTS } )
add_library ( ${ TARGET_ NAME} ${ TARGET_ TYPE} ${ ARG_UNPARSED_ARGUMENTS } )
if ( TYPE STREQUAL "INTERFACE" )
if ( TARGET_ TYPE STREQUAL "INTERFACE" )
# Библиотека, состоящая только из заголовочных файлов не требует сборки.
# Стандартные пути к заголовочным файлам
target_include_directories ( ${ NAME } INTERFACE $< BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include > )
target_include_directories ( ${ TARGET_ NAME} INTERFACE
$< BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include > )
else ( )
string ( TOUPPER ${ NAME } PROJECT_NAME_UPPER )
string ( TOUPPER ${ TARGET_ NAME} __project_name_upper )
# Опция для разрешения сборки динамической библиотеки
cmake_dependent_option ( ${ PROJECT_NAME_UPPER } _BUILD_SHARED
"Build shared library for ${NAME}" ON "BUILD_SHARED_LIBS" OFF )
cmake_dependent_option ( ${ __project_name_upper } _BUILD_SHARED
"Build shared library for ${TARGET_ NAME}" ON "BUILD_SHARED_LIBS" OFF )
# Опция для разрешения сборки статической библиотеки
cmake_dependent_option ( ${ PROJECT_NAME_UPPER } _BUILD_STATIC
"Build static library for ${NAME}" ON "NOT BUILD_SHARED_LIBS" OFF )
cmake_dependent_option ( ${ __project_name_upper } _BUILD_STATIC
"Build static library for ${TARGET_ NAME}" ON "NOT BUILD_SHARED_LIBS" OFF )
# Стандартные пути к заголовочным файлам
target_include_directories ( ${ NAME }
target_include_directories ( ${ TARGET_ NAME}
PUBLIC
$< BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include >
PRIVATE
@ -67,17 +68,18 @@ function(myx_add_library NAME TYPE)
# Сборка позиционно-независимых объектных файлов нужна
# для создания динамической библиотеки
set_target_properties ( ${ NAME } PROPERTIES POSITION_INDEPENDENT_CODE ON )
set_target_properties ( ${ TARGET_ NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON )
if ( NOT EXPORT_BASE_NAME )
string ( TOUPPER ${ NAME } ARG_EXPORT_BASE_NAME )
set ( ARG_EXPORT_BASE_NAME ${ __project_name_upper } )
endif ( )
if ( NOT ARG_EXPORT_FILE_NAME )
set ( ARG_EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${NAME}/${NAME}_export.hpp" )
set ( ARG_EXPORT_FILE_NAME
"${PROJECT_SOURCE_DIR}/include/${TARGET_NAME}/${TARGET_NAME}_export.hpp" )
endif ( )
generate_export_header ( ${ NAME }
generate_export_header ( ${ TARGET_ NAME}
BASE_NAME ${ ARG_EXPORT_BASE_NAME }
EXPORT_MACRO_NAME "EXPORT_${ARG_EXPORT_BASE_NAME}"
DEPRECATED_MACRO_NAME "DEPRECATED_${ARG_EXPORT_BASE_NAME}"
@ -87,45 +89,45 @@ function(myx_add_library NAME TYPE)
EXPORT_FILE_NAME ${ ARG_EXPORT_FILE_NAME }
DEFINE_NO_DEPRECATED
)
set_property ( TARGET ${ NAME } APPEND PROPERTY INTERFACE_HEADER_FILES "${ARG_EXPORT_FILE_NAME}" )
set_property ( TARGET ${ TARGET_ NAME} APPEND PROPERTY
INTERFACE_HEADER_FILES "${ARG_EXPORT_FILE_NAME}" )
# Цель для создания динамической библиотеки из объектных файлов
if ( ${ PROJECT_NAME_UPPER } _BUILD_SHARED )
# Для создания динамической библиотеки используются объектные файлы цели ${NAME}
add_library ( ${ NAME } _shared SHARED $< TARGET_OBJECTS:${NAME} > )
# Установка дополнительных свойств для цели ${NAME}_shared
if ( ${ __project_name_upper } _BUILD_SHARED )
# Для создания динамической библиотеки используются объектные файлы цели ${TARGET_ NAME}
add_library ( ${ TARGET_ NAME} _shared SHARED $< TARGET_OBJECTS:${TARGET_ NAME} > )
# Установка дополнительных свойств для цели ${TARGET_ NAME}_shared
# VERSION: версия библиотеки
# SOVERSION: мажорная версия библиотеки
# LIBRARY_OUTPUT_DIRECTORY: каталог для записи результатов сборки
# OUTPUT_NAME: базовое имя выходного файла (без учёта расширения)
set_target_properties ( ${ NAME } _shared
PROPERTIES
VERSION ${ PROJECT_VERSION }
SOVERSION ${ PROJECT_VERSION_MAJO R }
LIBRARY_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } / ${ CMAKE_INSTALL_LIBDIR }
OUTPUT_NAME ${ ARG_OUTPUT_NAME } )
set_target_properties ( ${ TARGET_ NAME} _shared PROPERTIES
VERSION ${ PROJECT_VERSION }
SO VERSION ${ PROJECT_VERSION_MAJOR }
LIBRARY_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } / ${ CMAKE_INSTALL_LIBDI R}
OUTPUT_NAME ${ ARG_OUTPUT_NAME } )
endif ( )
# Цель для создания статической библиотеки из объектных файлов
if ( ${ PROJECT_NAME_UPPER } _BUILD_STATIC )
# Для создания статической библиотеки используются объектные файлы цели ${NAME}
add_library ( ${ NAME } _static STATIC $< TARGET_OBJECTS:${NAME} > )
# Установка дополнительных свойств для цели ${NAME}_static
if ( ${ __project_name_upper } _BUILD_STATIC )
# Для создания статической библиотеки используются
# объектные файлы цели ${TARGET_NAME}
add_library ( ${ TARGET_NAME } _static STATIC $< TARGET_OBJECTS:${TARGET_NAME} > )
# Установка дополнительных свойств для цели ${TARGET_NAME}_static
# ARCHIVE_OUTPUT_DIRECTORY: каталог для записи результатов сборки
# OUTPUT_NAME: базовое имя выходного файла (без учёта расширения)
set_target_properties ( ${ NAME } _static
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } / ${ CMAKE_INSTALL_LIBDIR }
OUTPUT_NAME ${ ARG_OUTPUT_NAME } )
set_target_properties ( ${ TARGET_ NAME} _static PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } / ${ CMAKE_INSTALL_LIBDIR }
OUTPUT_NAME ${ ARG_OUTPUT_NAME } )
endif ( )
endif ( )
# Если вызов был выполнен не из проекта верхнего уровня,
# то созданная цель исключается из цели `all`.
# При этом сама цель `${NAME}` может участвовать в сборке,
# При этом сама цель `${TARGET_ NAME}` может участвовать в сборке,
# если окажется в перечне зависимостей.
if ( NOT PROJECT_IS_TOP_LEVEL )
set_target_properties ( ${ NAME } PROPERTIES EXCLUDE_FROM_ALL True )
set_target_properties ( ${ TARGET_ NAME} PROPERTIES EXCLUDE_FROM_ALL True )
return ( )
endif ( )
@ -133,91 +135,91 @@ function(myx_add_library NAME TYPE)
# Если вызов был выполнен не из проекта верхнего уровня,
# то эти правила не обрабатываются.
write_basic_package_version_file (
${ CMAKE_CURRENT_BINARY_DIR } / ${ NAME } ConfigVersion.cmake
${ CMAKE_CURRENT_BINARY_DIR } / ${ TARGET_ NAME} ConfigVersion.cmake
VERSION ${ PROJECT_VERSION }
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file (
${ CMAKE_CURRENT_FUNCTION_LIST_DIR } /library-config.cmake.in
${ CMAKE_CURRENT_BINARY_DIR } / ${ NAME } Config.cmake
INSTALL_DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/ ${ NAME }
${ CMAKE_CURRENT_BINARY_DIR } / ${ TARGET_ NAME} Config.cmake
INSTALL_DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/ ${ TARGET_ NAME}
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
install ( EXPORT ${ NAME } Targets
DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/ ${ NAME }
install ( EXPORT ${ TARGET_ NAME} Targets
DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/ ${ TARGET_ NAME}
COMPONENT DEV
)
install (
FILES
${ PROJECT_BINARY_DIR } / ${ NAME } ConfigVersion.cmake
${ PROJECT_BINARY_DIR } / ${ NAME } Config.cmake
DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/ ${ NAME }
${ PROJECT_BINARY_DIR } / ${ TARGET_ NAME} ConfigVersion.cmake
${ PROJECT_BINARY_DIR } / ${ TARGET_ NAME} Config.cmake
DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/ ${ TARGET_ NAME}
COMPONENT DEV
)
# Формирование файла для pkg-config
file ( WRITE "${PROJECT_BINARY_DIR}/${NAME}.pc"
file ( WRITE "${PROJECT_BINARY_DIR}/${TARGET_ NAME}.pc"
"prefix=${CMAKE_INSTALL_PREFIX}\n"
"exec_prefix=${CMAKE_INSTALL_PREFIX}\n"
"includedir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}\n" )
if ( NOT TYPE STREQUAL "INTERFACE" )
file ( APPEND "${PROJECT_BINARY_DIR}/${NAME}.pc"
if ( NOT TARGET_ TYPE STREQUAL "INTERFACE" )
file ( APPEND "${PROJECT_BINARY_DIR}/${TARGET_ NAME}.pc"
"libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}\n" )
endif ( )
file ( APPEND "${PROJECT_BINARY_DIR}/${NAME}.pc"
file ( APPEND "${PROJECT_BINARY_DIR}/${TARGET_ NAME}.pc"
"\n"
"Name: ${NAME}\n"
"Description: ${NAME} library\n"
"Name: ${TARGET_ NAME}\n"
"Description: ${TARGET_ NAME} library\n"
"Version: ${PROJECT_VERSION}\n"
"\n"
"Requires:\n"
"Cflags: -I${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}\n" )
if ( NOT TYPE STREQUAL "INTERFACE" )
file ( APPEND "${PROJECT_BINARY_DIR}/${NAME}.pc"
"Libs: -L${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} -l${NAME}\n" )
if ( NOT TARGET_ TYPE STREQUAL "INTERFACE" )
file ( APPEND "${PROJECT_BINARY_DIR}/${TARGET_ NAME}.pc"
"Libs: -L${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} -l${TARGET_ NAME}\n" )
endif ( )
# Установка файла для pkg-config
install (
FILES "${PROJECT_BINARY_DIR}/${NAME}.pc"
FILES "${PROJECT_BINARY_DIR}/${TARGET_ NAME}.pc"
COMPONENT DEV
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" )
if ( TYPE STREQUAL "OBJECT" )
if ( TARGET_ TYPE STREQUAL "OBJECT" )
# Установка динамической библиотеки
if ( TARGET ${ NAME } _shared )
if ( TARGET ${ TARGET_ NAME} _shared )
install (
TARGETS ${ NAME } _shared
EXPORT ${ NAME } Targets
TARGETS ${ TARGET_ NAME} _shared
EXPORT ${ TARGET_ NAME} Targets
LIBRARY DESTINATION ${ CMAKE_INSTALL_LIBDIR }
COMPONENT LIB
)
endif ( )
if ( TARGET ${ NAME } _static )
if ( TARGET ${ TARGET_ NAME} _static )
# Установка статической библиотеки
install (
TARGETS ${ NAME } _static
EXPORT ${ NAME } Targets
TARGETS ${ TARGET_ NAME} _static
EXPORT ${ TARGET_ NAME} Targets
ARCHIVE DESTINATION ${ CMAKE_INSTALL_LIBDIR }
COMPONENT STATIC
)
endif ( )
endif ( )
if ( TYPE STREQUAL "INTERFACE" )
if ( TARGET_ TYPE STREQUAL "INTERFACE" )
# Установка библиотеки из заголовочных файлов
target_include_directories ( ${ NAME } SYSTEM INTERFACE $< INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} > )
target_include_directories ( ${ TARGET_ NAME} SYSTEM INTERFACE $< INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} > )
install (
TARGETS ${ NAME }
EXPORT ${ NAME } Targets
TARGETS ${ TARGET_ NAME}
EXPORT ${ TARGET_ NAME} Targets
COMPONENT LIB
)
endif ( )