0.7.0 (рефакторинг)

This commit is contained in:
2022-05-06 12:49:46 +03:00
parent 42b12b9f59
commit dd2a4fdb7d
56 changed files with 526 additions and 758 deletions

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
# Создание динамической библиотеки из объектной библиотеки
function(myx_cmake_add_shared_library target)
myx_cmake_canonical_string(${target} _ctarget)

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
# Создание статической библиотеки из объектной библиотеки
function(myx_cmake_add_static_library target)
myx_cmake_canonical_string(${target} _ctarget)

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
cmake_policy(PUSH)
cmake_policy(SET CMP0057 NEW) # IN_LIST operator

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
# Общие настройки для пакета: организация, автор, версия
set(CPACK_PACKAGE_VENDOR ${MYX_CMAKE_ORGANIZATION_NAME_LOWER} CACHE STRING "")
set(CPACK_PACKAGE_NAME ${MYX_CMAKE_PROJECT_NAME_LOWER} CACHE STRING "")

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
set(CLANG_APPLY_REPLACEMENTS_NAMES clang-apply-replacements)
foreach(V RANGE 9 15)
list(INSERT CLANG_APPLY_REPLACEMENTS_NAMES 0 "clang-apply-replacements-${V}")

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
set(CLANG_CHECK_NAMES clang-check)
foreach(V RANGE 9 15)
list(INSERT CLANG_CHECK_NAMES 0 "clang-check-${V}")

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
set(CLANG_TIDY_NAMES clang-tidy)
foreach(V RANGE 9 15)
list(INSERT CLANG_TIDY_NAMES 0 "clang-tidy-${V}")

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
find_program(CLAZY_EXE NAMES clazy-standalone)
if(CLAZY_EXE AND CLANG_APPLY_REPLACEMENTS_EXE)

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
if(CMAKE_EXPORT_COMPILE_COMMANDS)
include(PVS-Studio)
find_program(PVS_STUDIO_ANALYZER_EXE pvs-studio-analyzer)

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
option(MYX_CMAKE_CODE_COVERAGE "MyxCMake: enable code coverage" OFF)
if(MYX_CMAKE_CODE_COVERAGE)

View File

@ -1,3 +1,7 @@
# Обёртки для функций вывода сообщений
include_guard(GLOBAL)
if(DEFINED ENV{TERM} AND UNIX)
string(ASCII 27 Esc)
set(MyxCMakeColorReset "${Esc}[m")

View File

@ -1,20 +1,26 @@
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
include(GNUInstallDirs)
include(MyxCMakeCompatIncludeGuard)
include(MyxCMakeLSBInfo)
include(MyxCMakeCompat)
# Additional functions
include(MyxCMakeHighPrecisionMath)
include(MyxCMakeQtTranslation)
include(MyxCMakeRemoveFlag)
include(MyxCMakeWriteCompilerDetectionHeader)
include(MyxCMakeIncludeSystemModules)
include(MyxCMakeCurrentDate)
include(MyxCMakeColoredMessages)
include(MyxCMakeCheckPaths)
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${CMAKE_CXX_SOURCE_FILE_EXTENSIONS};tpp;tcc)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
include(MyxCMakeDirectoriesGuards)
include(MyxCMakeGlobalFunctions)
include(MyxCMakeProjectVersion)
include(MyxCMakeRequiredVariables)
include(MyxCMakeGlobalFunctions)
include(MyxCMakeGlobalVariables)
include(MyxCMakeDates)
include(MyxCMakeLSBInfo)
include(MyxCMakePaths)
include(MyxCMakeLargeFiles)
include(MyxCMakeGeneratePrivateConfigHeader)
include(MyxCMakeGenerateGitInfoHeader)
include(MyxCMakeCompiler)
include(MyxCMakeCompilerFlags)
include(MyxCMakeDistCC)
@ -28,8 +34,10 @@ include(MyxCMakeCodeAnalyzeClangCheck)
include(MyxCMakeCodeAnalyzeClangTidy)
include(MyxCMakeCodeAnalyzeClazy)
include(MyxCMakeCodeAnalyzePvsStudio)
include(MyxCMakeCodeCoverage)
include(MyxCMakeFormatSources)
include(MyxCMakeCommonPaths)
include(MyxCMakeCommonTargetProperties)
include(MyxCMakeAddSharedLibrary)
include(MyxCMakeAddStaticLibrary)
@ -40,13 +48,3 @@ include(MyxCMakeDocBreathe)
include(MyxCMakeExternalProject)
include(MyxCMakeCPack)
include(MyxCMakeUninstall)
# Additional functions
include(MyxCMakeGenerateGitInfoHeader)
include(MyxCMakeGeneratePrivateConfigHeader)
include(MyxCMakeHighPrecisionMath)
include(MyxCMakeLargeFiles)
include(MyxCMakeQtTranslation)
include(MyxCMakeRemoveFlag)
include(MyxCMakeWriteCompilerDetectionHeader)

View File

@ -0,0 +1,4 @@
include_guard(GLOBAL)
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})

View File

@ -1,9 +1,14 @@
include_guard(GLOBAL)
function(myx_cmake_common_target_properties target)
if(NOT TARGET ${target})
myx_cmake_message_error("MyxCMake: Target ${target} does not exists.")
endif()
get_target_property(_target_type ${target} TYPE)
set_target_properties(${target} PROPERTIES USE_FOLDERS ON)
set(__visibility PUBLIC)
if(_target_type STREQUAL INTERFACE_LIBRARY)
set(__visibility INTERFACE)

View File

@ -1,5 +1,5 @@
if(MYX_CMAKE_LSB_DISTRIBUTOR_ID STREQUAL "AstraLinuxSE" OR
MYX_CMAKE_LSB_DISTRIBUTOR_ID STREQUAL "AstraLinuxCE")
MYX_CMAKE_LSB_DISTRIBUTOR_ID STREQUAL "AstraLinuxCE")
set(CMAKE_37_MODULES_DIR "/usr/share/cmake-3.7/Modules")
if(IS_DIRECTORY ${CMAKE_37_MODULES_DIR})
if(NOT ${CMAKE_37_MODULES_DIR} IN_LIST CMAKE_MODULE_PATH)

View File

@ -0,0 +1,13 @@
# Защита для однократного включения файла *.cmake
# Функция include_guard() реализована в версии 3.10
# Макрос реализован для обратной совместимости
if(${CMAKE_VERSION} VERSION_LESS "3.10.0")
macro(include_guard)
if (MYX_CMAKE_INCLUDED_${CMAKE_CURRENT_LIST_FILE})
return()
endif()
set(MYX_CMAKE_INCLUDED_${CMAKE_CURRENT_LIST_FILE} TRUE)
endmacro()
endif()

View File

@ -1,3 +1,5 @@
include_guard(GLOBAL)
# C compiler name
if(CMAKE_C_COMPILER_ID STREQUAL "Intel")
set(CMAKE_C_COMPILER_IS_INTEL ON)
@ -24,26 +26,25 @@ endif()
# Предпочтительные пути к утилитам для компоновки
if(CMAKE_CXX_COMPILER_IS_GCC)
# cmake-format: off
# Astra Linux Smolensk 1.5
if(MYX_CMAKE_LSB_DISTRIBUTOR_ID STREQUAL "AstraLinuxSE" AND
MYX_CMAKE_LSB_CODENAME STREQUAL "smolensk" AND
MYX_CMAKE_LSB_RELEASE STREQUAL "1.5")
if(MYX_CMAKE_LSB_DISTRIBUTOR_ID STREQUAL "AstraLinuxSE" AND
MYX_CMAKE_LSB_CODENAME STREQUAL "smolensk" AND
MYX_CMAKE_LSB_RELEASE_VERSION STREQUAL "1.5")
find_program(CMAKE_GCC_AR NAMES "/usr/bin/x86_64-linux-gnu-gcc-ar-4.7")
find_program(CMAKE_GCC_NM NAMES "/usr/bin/x86_64-linux-gnu-gcc-nm-4.7")
find_program(CMAKE_GCC_RANLIB NAMES "/usr/bin/x86_64-linux-gnu-gcc-ranlib-4.7")
# Elbrus E2K
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "e2k")
find_program(CMAKE_GCC_AR
NAMES "/usr/${CMAKE_SYSTEM_PROCESSOR}-linux/bin/ar")
find_program(CMAKE_GCC_NM
NAMES "/usr/${CMAKE_SYSTEM_PROCESSOR}-linux/bin/nm")
find_program(CMAKE_GCC_RANLIB
NAMES "/usr/${CMAKE_SYSTEM_PROCESSOR}-linux/bin/ranlib")
find_program(CMAKE_GCC_AR NAMES "/usr/${CMAKE_SYSTEM_PROCESSOR}-linux/bin/ar")
find_program(CMAKE_GCC_NM NAMES "/usr/${CMAKE_SYSTEM_PROCESSOR}-linux/bin/nm")
find_program(CMAKE_GCC_RANLIB NAMES "/usr/${CMAKE_SYSTEM_PROCESSOR}-linux/bin/ranlib")
else()
find_program(CMAKE_GCC_AR NAMES "gcc-ar" "ar")
find_program(CMAKE_GCC_NM NAMES "gcc-nm" "nm")
find_program(CMAKE_GCC_RANLIB NAMES "gcc-ranlib" "ranlib")
endif()
# cmake-format: on
if(CMAKE_GCC_AR)
set(CMAKE_AR ${CMAKE_GCC_AR} CACHE STRING "" FORCE)

View File

@ -1,3 +1,5 @@
include_guard(GLOBAL)
# based on https://github.com/bluescarni/yacma
include(CheckCXXCompilerFlag)
@ -7,13 +9,14 @@ macro(CHECK_ENABLE_CXX_FLAG flag)
check_cxx_compiler_flag("${flag}" CHECK_CXX_FLAG)
unset(CMAKE_REQUIRED_QUIET)
# cmake-format: off
if(CHECK_CXX_FLAG)
myx_cmake_message_notice("'${flag}': flag is supported.")
string(CONCAT _MYX_CMAKE_DETECTED_CXX_FLAGS
"${_MYX_CMAKE_DETECTED_CXX_FLAGS} ${flag}")
string(CONCAT _MYX_CMAKE_DETECTED_CXX_FLAGS "${_MYX_CMAKE_DETECTED_CXX_FLAGS} ${flag}")
else()
myx_cmake_message_status("'${flag}': flag is NOT supported.")
endif()
# cmake-format: on
# NOTE: check_cxx_compiler stores variables in the cache.
unset(CHECK_CXX_FLAG CACHE)
endmacro()
@ -24,40 +27,32 @@ macro(CHECK_ENABLE_DEBUG_CXX_FLAG flag)
check_cxx_compiler_flag("${flag}" CHECK_CXX_FLAG_DEBUG)
unset(CMAKE_REQUIRED_QUIET)
# cmake-format: off
if(CHECK_CXX_FLAG_DEBUG)
myx_cmake_message_notice("'${flag}': debug flag is supported.")
string(CONCAT _MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG
"${_MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG} ${flag}")
string(CONCAT _MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG "${_MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG} ${flag}")
else()
myx_cmake_message_status("'${flag}': debug flag is NOT supported.")
endif()
# cmake-format: on
# NOTE: check_cxx_compiler stores variables in the cache.
unset(CHECK_CXX_FLAG_DEBUG CACHE)
endif()
endmacro()
function(myx_cmake_set_cxx_standard version)
# cmake-format: off
# Выбор стандарта по умолчанию (можно переопределить в проекте)
set(CMAKE_CXX_STANDARD_REQUIRED
YES
PARENT_SCOPE)
set(CMAKE_CXX_STANDARD_REQUIRED YES PARENT_SCOPE)
if(version EQUAL 11)
set(CMAKE_CXX_STANDARD
11
PARENT_SCOPE)
set(CMAKE_CXX_EXTENSIONS
YES
PARENT_SCOPE)
set(CMAKE_CXX_STANDARD 11 PARENT_SCOPE)
set(CMAKE_CXX_EXTENSIONS YES PARENT_SCOPE)
endif()
if(version EQUAL 14)
set(CMAKE_CXX_STANDARD
14
PARENT_SCOPE)
set(CMAKE_CXX_EXTENSIONS
YES
PARENT_SCOPE)
set(CMAKE_CXX_STANDARD 14 PARENT_SCOPE)
set(CMAKE_CXX_EXTENSIONS YES PARENT_SCOPE)
endif()
if(version EQUAL 17)
@ -82,14 +77,11 @@ function(myx_cmake_set_cxx_standard version)
endif()
endif()
else()
set(CMAKE_CXX_STANDARD
17
PARENT_SCOPE)
set(CMAKE_CXX_EXTENSIONS
YES
PARENT_SCOPE)
set(CMAKE_CXX_STANDARD 17 PARENT_SCOPE)
set(CMAKE_CXX_EXTENSIONS YES PARENT_SCOPE)
endif()
endif()
# cmake-format: on
endfunction()
if(NOT MYX_CMAKE_CXX_FLAGS_AUTODETECTION_DONE)
@ -210,9 +202,9 @@ if(NOT MYX_CMAKE_CXX_FLAGS_AUTODETECTION_DONE)
endif()
# cmake-format: off
if(MYX_CMAKE_LSB_DISTRIBUTOR_ID STREQUAL "AstraLinuxSE" AND
MYX_CMAKE_LSB_CODENAME STREQUAL "smolensk" AND
MYX_CMAKE_LSB_RELEASE STREQUAL "1.5")
if(MYX_CMAKE_LSB_DISTRIBUTOR_ID STREQUAL "AstraLinuxSE" AND
MYX_CMAKE_LSB_CODENAME STREQUAL "smolensk" AND
MYX_CMAKE_LSB_RELEASE_VERSION STREQUAL "1.5")
# cmake-format: on
myx_cmake_set_cxx_standard(11)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "e2k")
@ -227,14 +219,10 @@ if(NOT MYX_CMAKE_CXX_FLAGS_AUTODETECTION_DONE)
endif()
endif()
# cmake-format: off
# Set the cache variables.
set(MYX_CMAKE_DETECTED_CXX_FLAGS
"${_MYX_CMAKE_DETECTED_CXX_FLAGS}"
CACHE INTERNAL "")
set(MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG
"${_MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG}"
CACHE INTERNAL "")
set(MYX_CMAKE_CXX_FLAGS_AUTODETECTION_DONE
YES
CACHE INTERNAL "")
set(MYX_CMAKE_DETECTED_CXX_FLAGS "${_MYX_CMAKE_DETECTED_CXX_FLAGS}" CACHE INTERNAL "")
set(MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG "${_MYX_CMAKE_DETECTED_CXX_FLAGS_DEBUG}" CACHE INTERNAL "")
set(MYX_CMAKE_CXX_FLAGS_AUTODETECTION_DONE YES CACHE INTERNAL "")
# cmake-format: on
endif()

View File

@ -1,3 +1,5 @@
include_guard(GLOBAL)
if(NOT MYX_CMAKE_TODAY)
if(WIN32)
execute_process(COMMAND "cmd" " /C date /T" OUTPUT_VARIABLE MYX_CMAKE_TODAY)
@ -15,4 +17,3 @@ if(NOT MYX_CMAKE_YEAR)
endif()
string(REGEX REPLACE "(..)/(..)/(....).*" "\\3" MYX_CMAKE_YEAR ${MYX_CMAKE_YEAR})
endif()

View File

@ -1,10 +1,13 @@
include_guard(GLOBAL)
# По умолчанию отключена отладочная печать (если не включена явно программистом)
option(MYX_CMAKE_DEBUG_OUTPUT "Enable debug output" OFF)
option(MYX_CMAKE_INFO_OUTPUT "Enable info output" OFF)
option(MYX_CMAKE_WARNING_OUTPUT "Enable warning output" OFF)
# Если сборка производится в режиме для отладки, то включаются флаги для
# разрешения отладочной печати
# Если сборка производится в режиме для отладки,
# то включаются флаги для разрешения отладочной печати
if(CMAKE_BUILD_TYPE STREQUAL Debug)
set(MYX_CMAKE_DEBUG_OUTPUT ON CACHE BOOL "" FORCE)
set(MYX_CMAKE_INFO_OUTPUT ON CACHE BOOL "" FORCE)

View File

@ -1,9 +1,10 @@
# Запись результатов сборки проекта внутрь иерархии каталогов с исходными
# текстами приводит к засорению файлами формируемыми на этапе сборки, которые
# затрудняют разработку, поиск в оригинальных файлах и мешают ориентироваться в
# проекте. При работе с несколькими типами сборки, например, отладка и выпуск,
# появляется необходимость корректного полного удаления результатов предыдущего
# варианта.
# Запись результатов сборки проекта внутрь иерархии каталогов с исходными текстами
# приводит к засорению файлами формируемыми на этапе сборки, которые затрудняют
# разработку, поиск в оригинальных файлах и мешают ориентироваться в проекте.
# При работе с несколькими типами сборки, например, отладка и выпуск, появляется
# необходимость корректного полного удаления результатов предыдущего варианта.
include_guard(GLOBAL)
get_filename_component(_source_realpath "${CMAKE_SOURCE_DIR}" REALPATH)
get_filename_component(_binary_realpath "${CMAKE_BINARY_DIR}" REALPATH)

View File

@ -1,3 +1,5 @@
include_guard(GLOBAL)
find_program(DISTCC_EXECUTABLE distcc)
mark_as_advanced(DISTCC_EXECUTABLE)
if(DISTCC_EXECUTABLE)

View File

@ -0,0 +1,97 @@
include_guard(GLOBAL)
function(myx_cmake_doc_breathe)
set(BREATHE_FOUND AUTO CACHE STRING "Enable Breathe documentation generator")
set_property(CACHE BREATHE_FOUND PROPERTY STRINGS ON OFF AUTO)
find_package(Doxygen)
find_package(Perl)
set(Python_ADDITIONAL_VERSIONS 3.11;3.10;3.9;3.8;3.7;3.6;3.5;3.4;3.3;3.2)
find_package(PythonInterp)
if(PYTHONINTERP_FOUND)
find_package(Sphinx)
include(FindPythonModule)
find_python_module(breathe)
find_python_module(recommonmark)
if(DOXYGEN_FOUND
AND PERL_FOUND
AND PYTHONINTERP_FOUND
AND SPHINX_EXECUTABLE
AND breathe
AND recommonmark)
set(BREATHE_FOUND ON CACHE STRING "Breathe documentation generator enabled" FORCE)
else()
set(BREATHE_FOUND OFF CACHE STRING "Breathe documentation generator disabled" FORCE)
endif()
else()
set(BREATHE_FOUND OFF CACHE STRING "Breathe documentation generator disabled" FORCE)
endif()
set(_target "myx-cmake-doc-breathe-${CMAKE_PROJECT_NAME}")
if(NOT BREATHE_FOUND)
message(STATUS "MyxCMake:")
add_custom_target(${_target} VERBATIM COMMENT " Breathe is not found. Skipping target ${_target} build")
return()
endif()
if(NOT TARGET ${_target})
set(options)
set(oneValueArgs COMMENT)
set(multiValueArgs)
cmake_parse_arguments(_arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(BREATHE_DIR ${CMAKE_BINARY_DIR}/doc/breathe)
set(BREATHE_CONF_DIR ${BREATHE_DIR}/conf)
set(BREATHE_DOXYGEN_DIR ${BREATHE_DIR}/doxygen)
set(GENERATE_XML YES)
set(GENERATE_HTML NO)
set(GENERATE_LATEX NO)
set(CONF_FILE ${MYX_CMAKE_FUNCTIONS_DIR}/doc/breathe-conf.py.in)
set(DOXY_FILE ${MYX_CMAKE_FUNCTIONS_DIR}/doc/Doxyfile.in)
configure_file(${CONF_FILE} ${BREATHE_CONF_DIR}/conf.py @ONLY)
configure_file(${DOXY_FILE} ${BREATHE_DOXYGEN_DIR}/Doxyfile @ONLY)
add_custom_target(${_target}
VERBATIM
DEPENDS ${DOXY_FILE}
DEPENDS ${CONF_FILE}
COMMAND "${CMAKE_COMMAND}" -E make_directory ${BREATHE_CONF_DIR}
COMMAND ${SPHINX_EXECUTABLE} -q -b html -c ${BREATHE_CONF_DIR}
-d ${BREATHE_DIR}/cache ${BREATHE_DOXYGEN_DIR} ${BREATHE_DIR}/html
COMMENT "Building ${CMAKE_PROJECT_NAME} documentation with Breathe")
set(INDEX_MD_FILE ${CMAKE_HOME_DIRECTORY}/doc/breathe/index.md.in)
if(EXISTS ${INDEX_MD_FILE})
configure_file(${INDEX_MD_FILE} ${BREATHE_DOXYGEN_DIR}/index.md @ONLY)
file(GLOB MD_FILES ${CMAKE_HOME_DIRECTORY}/doc/breathe/*.md)
if(MD_FILES)
add_custom_command(TARGET ${_target} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different
${MD_FILES} ${BREATHE_DOXYGEN_DIR})
endif()
endif()
set(INDEX_RST_FILE ${CMAKE_HOME_DIRECTORY}/doc/breathe/index.rst.in)
if(EXISTS ${INDEX_RST_FILE})
configure_file(${INDEX_RST_FILE} ${BREATHE_DOXYGEN_DIR}/index.rst @ONLY)
file(GLOB RST_FILES ${CMAKE_SOURCE_DIR}/doc/breathe/*.rst)
if(RST_FILES)
add_custom_command(TARGET ${target} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different
${RST_FILES} ${BREATHE_DOXYGEN_DIR})
endif()
endif()
if(NOT TARGET myx-cmake-doc-breathe)
add_custom_target(myx-cmake-doc-breathe)
endif()
add_dependencies(myx-cmake-doc-breathe ${_target})
install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/breathe/html
COMPONENT doc OPTIONAL
DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/breathe)
else()
message(STATUS "MyxCMake:")
add_custom_target(${target} VERBATIM COMMENT " Breathe is not found. Skipping target ${target} build")
endif()
endfunction()

View File

@ -0,0 +1,99 @@
include_guard(GLOBAL)
function(myx_cmake_doc_doxygen)
set(DOXYGEN_FOUND AUTO CACHE STRING "Enable Doxygen documentation generator")
set_property(CACHE DOXYGEN_FOUND PROPERTY STRINGS ON OFF AUTO)
find_package(Doxygen)
if(DOXYGEN_FOUND)
set(DOXYGEN_FOUND ON CACHE STRING "Doxygen documentation generator enabled" FORCE)
else()
set(DOXYGEN_FOUND OFF CACHE STRING "Doxygen documentation generator disabled" FORCE)
endif()
set(_target "myx-cmake-doc-doxygen-${CMAKE_PROJECT_NAME}")
if(NOT DOXYGEN_FOUND)
message(STATUS "MyxCMake:")
add_custom_target(${_target} VERBATIM COMMENT " Doxygen is not found. Skipping target ${_target} build")
return()
endif()
if(NOT TARGET ${_target})
set(options)
set(oneValueArgs SQLITE LATEX HTML LANGUAGE)
set(multiValueArgs)
cmake_parse_arguments(_arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(GENERATE_XML YES)
set(GENERATE_HTML NO)
set(GENERATE_LATEX NO)
set(DOXYGEN_OUTPUT_LANGUAGE Russian)
if(_arg_HTML)
set(GENERATE_HTML YES)
endif()
if(_arg_LATEX)
set(GENERATE_LATEX YES)
endif()
if(_arg_LANGUAGE)
set(DOXYGEN_OUTPUT_LANGUAGE ${_arg_LANGUAGE})
endif()
set(_myx_cmake_doxygen_in
"
PROJECT_NAME = \"${DOXYGEN_PROJECT_TITLE}\"
OUTPUT_DIRECTORY = \"${DOXYGEN_OUTPUT_DIRECTORY}\"
OUTPUT_LANGUAGE = \"${DOXYGEN_OUTPUT_LANGUAGE}\"
STRIP_FROM_PATH = \"${CMAKE_HOME_DIRECTORY}/src}\"
STRIP_FROM_INC_PATH = \"${CMAKE_HOME_DIRECTORY}/src}\"
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_METHODS = YES
INPUT = \"${CMAKE_HOME_DIRECTORY}/src\" \"${CMAKE_HOME_DIRECTORY}/doc/doxygen\"
RECURSIVE = YES
CLANG_ASSISTED_PARSING = YES
CLANG_DATABASE_PATH = \"${CMAKE_BINARY_DIR}\"
GENERATE_HTML = ${GENERATE_HTML}
GENERATE_TREEVIEW = YES
GENERATE_LATEX = ${GENERATE_LATEX}
LATEX_CMD_NAME = xelatex
COMPACT_LATEX = YES
GENERATE_XML = YES
UML_LOOK = YES
TEMPLATE_RELATIONS = YES
CALL_GRAPH = YES
CALLER_GRAPH = YES
INTERACTIVE_SVG = YES
")
set(_myx_cmake_doxygen_in_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/Doxygen.in)
file(WRITE ${_myx_cmake_doxygen_in_path} ${_myx_cmake_doxygen_in})
set(work_dir ${CMAKE_BINARY_DIR}/doc/doxygen)
configure_file(${_myx_cmake_doxygen_in_path} ${work_dir}/Doxyfile @ONLY)
add_custom_target(${_target}
VERBATIM
WORKING_DIRECTORY ${work_dir}
COMMAND ${DOXYGEN_EXECUTABLE} ${work_dir}/Doxyfile
COMMENT "Generating API documentation with Doxygen")
if(_arg_HTML)
install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/doxygen/html/
COMPONENT doc OPTIONAL
DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/doxygen)
endif()
if(NOT TARGET myx-cmake-doc-doxygen)
add_custom_target(myx-cmake-doc-doxygen)
endif()
add_dependencies(myx-cmake-doc-doxygen ${_target})
else()
message(STATUS "MyxCMake: target ${_target} is already defined.")
endif()
endfunction()

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
include(ExternalProject)
if(CMAKE_BUILD_TYPE)

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
find_program(UNCRUSTIFY_EXE NAMES uncrustify)
if(UNCRUSTIFY_EXE)

View File

@ -0,0 +1,85 @@
include_guard(GLOBAL)
function(myx_cmake_generate_git_info_header)
set(_filename ${CMAKE_BINARY_DIR}/${CMAKE_INCLUDE_DIR}/${MYX_CMAKE_PROJECT_NAME_LOWER}/myx_cmake_git_info_p.hpp)
if(MYX_CMAKE_GENERATED_HEADERS_PATH)
set(_filename ${MYX_CMAKE_GENERATED_HEADERS_PATH}/${MYX_CMAKE_PROJECT_NAME_LOWER}/myx_cmake_git_info_p.hpp)
elseif(ARGV0)
set(_filename ${ARGV0})
endif()
set(_git_info_hpp_in
"#ifndef @MYX_CMAKE_PROJECT_NAME_UPPER@_MYX_CMAKE_GIT_INFO_HPP_
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_MYX_CMAKE_GIT_INFO_HPP_
#pragma once
#if defined (@MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_REV)
#error \"Duplicate definition of macros @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_REV\"
#else
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_REV \"@MYX_CMAKE_GIT_REV@\"
#endif
#if defined (@MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_DIFF)
#error \"Duplicate definition of macros @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_DIFF\"
#else
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_DIFF \"@MYX_CMAKE_GIT_DIFF@\"
#endif
#if defined (@MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_BRANCH)
#error \"Duplicate definition of macros @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_BRANCH\"
#else
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_BRANCH \"@MYX_CMAKE_GIT_BRANCH@\"
#endif
#if defined (@MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_TAG)
#error \"Duplicate definition of macros @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_TAG\"
#else
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_GIT_TAG \"@MYX_CMAKE_GIT_TAG@\"
#endif
#endif /* @MYX_CMAKE_PROJECT_NAME_UPPER@_MYX_CMAKE_GIT_INFO_HPP_ */
")
set(_git_info_hpp_in_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/myx_cmake_git_info_p.hpp.in)
file(WRITE ${_git_info_hpp_in_path} ${_git_info_hpp_in})
set(_git_info_cmake_in
"set(MYX_CMAKE_GIT_REV \"N/A\")
set(MYX_CMAKE_GIT_DIFF \"\")
set(MYX_CMAKE_GIT_TAG \"N/A\")
set(MYX_CMAKE_GIT_BRANCH \"N/A\")
find_program(GIT_EXECUTABLE git)
if(GIT_EXECUTABLE)
execute_process(COMMAND git log --pretty=format:'%h' -n 1 OUTPUT_VARIABLE MYX_CMAKE_GIT_REV ERROR_QUIET)
# Check whether we got any revision (which isn't always the case,
# e.g. when someone downloaded a zip file from Github instead of a checkout)
if(NOT ${MYX_CMAKE_GIT_REV} STREQUAL \"\")
execute_process(COMMAND bash -c \"git diff --quiet --exit-code || echo +\" OUTPUT_VARIABLE MYX_CMAKE_GIT_DIFF)
execute_process(COMMAND git describe --exact-match --tags OUTPUT_VARIABLE MYX_CMAKE_GIT_TAG ERROR_QUIET)
execute_process(COMMAND git rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE MYX_CMAKE_GIT_BRANCH)
string(STRIP \"${MYX_CMAKE_GIT_REV}\" MYX_CMAKE_GIT_REV)
string(SUBSTRING \"${MYX_CMAKE_GIT_REV}\" 1 7 MYX_CMAKE_GIT_REV)
string(STRIP \"${MYX_CMAKE_GIT_DIFF}\" MYX_CMAKE_GIT_DIFF)
string(STRIP \"${MYX_CMAKE_GIT_TAG}\" MYX_CMAKE_GIT_TAG)
string(STRIP \"${MYX_CMAKE_GIT_BRANCH}\" MYX_CMAKE_GIT_BRANCH)
endif()
endif()
configure_file(${_git_info_hpp_in_path} ${MYX_CMAKE_GIT_INFO_FILE})
")
set(_git_info_cmake_in_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/MyxCMakeGitInfo.cmake.in)
file(WRITE ${_git_info_cmake_in_path} ${_git_info_cmake_in})
# cmake-format: off
if(NOT TARGET myx-cmake-git-info-header-${MYX_CMAKE_PROJECT_NAME_LOWER})
add_custom_target(myx-cmake-git-info-header-${MYX_CMAKE_PROJECT_NAME_LOWER} ALL
${CMAKE_COMMAND} -DMYX_CMAKE_PROJECT_NAME_UPPER=${MYX_CMAKE_PROJECT_NAME_UPPER}
-DMYX_CMAKE_GIT_INFO_FILE=${_filename} -P ${_git_info_cmake_in_path}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
endif()
# cmake-format: on
endfunction()

View File

@ -0,0 +1,116 @@
include_guard(GLOBAL)
function(myx_cmake_generate_private_config_header)
include(MyxCMakeLargeFiles)
myx_cmake_test_large_files(HAVE_LARGEFILES)
set(_filename ${CMAKE_BINARY_DIR}/${CMAKE_INCLUDE_DIR}/${MYX_CMAKE_PROJECT_NAME_LOWER}/myx_cmake_private_config_p.hpp)
if(MYX_CMAKE_GENERATED_HEADERS_PATH)
set(_filename ${MYX_CMAKE_GENERATED_HEADERS_PATH}/${MYX_CMAKE_PROJECT_NAME_LOWER}/myx_cmake_private_config_p.hpp)
elseif(ARGV0)
set(_filename ${ARGV0})
endif()
get_property(PROJECT_VERSION_INT GLOBAL PROPERTY PROJECT_VERSION_INT)
set(_myx_cmake_private_config_hpp_in
"#ifndef @MYX_CMAKE_PROJECT_NAME_UPPER@_MYX_CMAKE_CONFIG_HPP_
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_MYX_CMAKE_CONFIG_HPP_
#pragma once
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_VERSION_STR \"@PROJECT_VERSION@\"
#define @MYX_CMAKE_PROJECT_NAME_UPPER@_VERSION_INT @PROJECT_VERSION_INT@
#if defined (MYX_CMAKE_ORGANIZATION_NAME)
#error \"Duplicate definition of macros MYX_CMAKE_ORGANIZATION_NAME\"
#else
#define MYX_CMAKE_ORGANIZATION_NAME \"@MYX_CMAKE_ORGANIZATION_NAME@\"
#endif
#if defined (MYX_CMAKE_ORGANIZATION_NAME_LOWER)
#error \"Duplicate definition of macros MYX_CMAKE_ORGANIZATION_NAME_LOWER\"
#else
#define MYX_CMAKE_ORGANIZATION_NAME_LOWER \"@MYX_CMAKE_ORGANIZATION_NAME_LOWER@\"
#endif
#if defined (MYX_CMAKE_ORGANIZATION_NAME_UPPER)
#error \"Duplicate definition of macros MYX_CMAKE_ORGANIZATION_NAME_UPPER\"
#else
#define MYX_CMAKE_ORGANIZATION_NAME_UPPER \"@MYX_CMAKE_ORGANIZATION_NAME_UPPER@\"
#endif
#if defined (MYX_CMAKE_PROJECT_NAME)
#error \"Duplicate definition of macros MYX_CMAKE_PROJECT_NAME\"
#else
#define MYX_CMAKE_PROJECT_NAME \"@CMAKE_PROJECT_NAME@\"
#endif
#if defined (MYX_CMAKE_PROJECT_NAME_LOWER)
#error \"Duplicate definition of macros MYX_CMAKE_PROJECT_NAME_LOWER\"
#else
#define MYX_CMAKE_PROJECT_NAME_LOWER \"@MYX_CMAKE_PROJECT_NAME_LOWER@\"
#endif
#if defined (MYX_CMAKE_PROJECT_NAME_UPPER)
#error \"Duplicate definition of macros MYX_CMAKE_PROJECT_NAME_UPPER\"
#else
#define MYX_CMAKE_PROJECT_NAME_UPPER \"@MYX_CMAKE_PROJECT_NAME_UPPER@\"
#endif
#if defined (MYX_CMAKE_THEME_NAME)
#error \"Duplicate definition of macros MYX_CMAKE_THEME_NAME\"
#else
#define MYX_CMAKE_THEME_NAME \"@MYX_CMAKE_THEME_NAME@\"
#endif
#if defined (MYX_CMAKE_THEME_NAME_LOWER)
#error \"Duplicate definition of macros MYX_CMAKE_THEME_NAME_LOWER\"
#else
#define MYX_CMAKE_THEME_NAME_LOWER \"@MYX_CMAKE_THEME_NAME_LOWER@\"
#endif
#if defined (MYX_CMAKE_THEME_NAME_UPPER)
#error \"Duplicate definition of macros MYX_CMAKE_THEME_NAME_UPPER\"
#else
#define MYX_CMAKE_THEME_NAME_UPPER \"@MYX_CMAKE_THEME_NAME_UPPER@\"
#endif
#if defined (MYX_CMAKE_AUTHOR_NAME)
#error \"Duplicate definition of macros MYX_CMAKE_AUTHOR_NAME\"
#else
#define MYX_CMAKE_AUTHOR_NAME \"@MYX_CMAKE_AUTHOR_NAME@\"
#endif
#if defined (MYX_CMAKE_AUTHOR_EMAIL)
#error \"Duplicate definition of macros MYX_CMAKE_AUTHOR_EMAIL\"
#else
#define MYX_CMAKE_AUTHOR_EMAIL \"@MYX_CMAKE_AUTHOR_EMAIL@\"
#endif
#if defined (MYX_CMAKE_DESCRIPTION)
#error \"Duplicate definition of macros MYX_CMAKE_DESCRIPTION\"
#else
#define MYX_CMAKE_DESCRIPTION \"@MYX_CMAKE_DESCRIPTION@\"
#endif
#if defined (MYX_CMAKE_BUILD_TYPE)
#error \"Duplicate definition of macros MYX_CMAKE_BUILD_TYPE\"
#else
#define MYX_CMAKE_BUILD_TYPE \"@CMAKE_BUILD_TYPE@\"
#endif
#if defined (MYX_CMAKE_BUILD_DATE)
#error \"Duplicate definition of macros MYX_CMAKE_BUILD_DATE\"
#else
#define MYX_CMAKE_BUILD_DATE \"@TODAY@\"
#endif
#endif /* @MYX_CMAKE_PROJECT_NAME_UPPER@_MYX_CMAKE_CONFIG_HPP_ */
")
set(_myx_cmake_private_config_hpp_in_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/myx_cmake_private_config_p.hpp)
file(WRITE ${_myx_cmake_private_config_hpp_in_path} ${_myx_cmake_private_config_hpp_in})
configure_file(${_myx_cmake_private_config_hpp_in_path} ${_filename})
endfunction()

View File

@ -1,15 +1,17 @@
include_guard(GLOBAL)
# Формирование строки, состоящей из заглавных символов, цифр и подчёркиваний
function(myx_cmake_canonical_string in_string out_string)
string(TOUPPER ${in_string} _arg_uppercase)
string(REGEX REPLACE "[ -]" "_" _arg_fixed ${_arg_uppercase})
set(${out_string} ${_arg_fixed} PARENT_SCOPE)
string(TOUPPER ${in_string} _uppercase)
string(REGEX REPLACE "[ -]" "_" _fixed ${_uppercase})
set(${out_string} ${_fixed} PARENT_SCOPE)
endfunction()
# Добавление общего префикса ко всем переменным в списке
function(myx_cmake_list_transform_prepend var prefix)
set(temp "")
foreach(filename ${${var}})
list(APPEND temp "${prefix}${filename}")
function(myx_cmake_list_transform_prepend values prefix)
set(_list "")
foreach(_val ${${values}})
list(APPEND _list "${prefix}${_val}")
endforeach()
set(${var} ${temp} PARENT_SCOPE)
set(${values} ${_list} PARENT_SCOPE)
endfunction()

View File

@ -1,5 +1,7 @@
include_guard(GLOBAL)
if(NOT MYX_CMAKE_THEME_NAME)
set(MYX_CMAKE_THEME_NAME "default")
set(MYX_CMAKE_THEME_NAME "default" CACHE STRING "")
endif()
# cmake-format: off
@ -15,10 +17,10 @@ string(TOUPPER ${MYX_CMAKE_ORGANIZATION_NAME_CANONICAL} MYX_CMAKE_ORGANIZATION_N
string(TOUPPER ${MYX_CMAKE_PROJECT_NAME_CANONICAL} MYX_CMAKE_PROJECT_NAME_UPPER)
string(TOUPPER ${MYX_CMAKE_THEME_NAME_CANONICAL} MYX_CMAKE_THEME_NAME_UPPER)
option(MYX_CMAKE_ADD_THEME_PREFIX "Append theme name to install prefix" OFF)
if(MYX_CMAKE_ADD_THEME_PREFIX AND NOT MYX_CMAKE_THEME_PREFIX_APPENDED)
option(MYX_CMAKE_ADD_THEME_TO_INSTALL_PREFIX "Append theme name to install prefix" OFF)
if(MYX_CMAKE_ADD_THEME_TO_INSTALL_PREFIX AND NOT MYX_CMAKE_THEME_INSTALL_PREFIX_APPENDED)
if(NOT MYX_CMAKE_THEME_NAME_LOWER STREQUAL "default")
set(MYX_CMAKE_THEME_PREFIX_APPENDED ON CACHE BOOL "" FORCE)
set(MYX_CMAKE_THEME_INSTALL_PREFIX_APPENDED ON CACHE BOOL "" FORCE)
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/${MYX_CMAKE_THEME_NAME}" CACHE PATH "" FORCE)
endif()
endif()

View File

@ -0,0 +1,16 @@
include_guard(GLOBAL)
function(myx_cmake_enable_high_precision_math)
find_package(Quadmath)
if(QUADMATH_FOUND)
add_definitions(-DHAVE_QUADMATH=1)
else()
find_package(MPFR)
if(MPFR_FOUND)
find_package(MPFRCppThirdparty)
else()
myx_cmake_message_error("MyxCMake: Nor Quadmath, nor MPFR found.")
endif()
endif()
endfunction()

View File

@ -0,0 +1,3 @@
include_guard(GLOBAL)
include(GNUInstallDirs)

View File

@ -1,29 +1,27 @@
if(CMAKE_CROSSCOMPILING)
return()
endif()
if(MYX_CMAKE_LSB_RELEASE)
return()
endif()
include_guard(GLOBAL)
set(MYX_CMAKE_LSB_DISTRIBUTOR_ID "unknown")
set(MYX_CMAKE_LSB_CODENAME "unknown")
set(MYX_CMAKE_LSB_RELEASE "unknown")
set(MYX_CMAKE_LSB_RELEASE_VERSION "unknown")
if(CMAKE_CROSSCOMPILING)
return()
endif()
if(EXISTS /etc/mcst_version)
set(MYX_CMAKE_LSB_DISTRIBUTOR_ID "ElbrusD")
set(MYX_CMAKE_LSB_CODENAME "Jessie")
execute_process(
COMMAND cat /etc/mcst_version
OUTPUT_VARIABLE MYX_CMAKE_LSB_RELEASE
OUTPUT_VARIABLE MYX_CMAKE_LSB_RELEASE_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
else()
find_program(_lsb_release_executable lsb_release)
find_program(_lsb_release_exe lsb_release)
# cmake-format: off
if(_lsb_release_executable)
execute_process(COMMAND ${_lsb_release_executable} -si OUTPUT_VARIABLE MYX_CMAKE_LSB_DISTRIBUTOR_ID OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${_lsb_release_executable} -sc OUTPUT_VARIABLE MYX_CMAKE_LSB_CODENAME OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${_lsb_release_executable} -sr OUTPUT_VARIABLE MYX_CMAKE_LSB_RELEASE OUTPUT_STRIP_TRAILING_WHITESPACE)
if(_lsb_release_exe)
execute_process(COMMAND ${_lsb_release_exe} -si OUTPUT_VARIABLE MYX_CMAKE_LSB_DISTRIBUTOR_ID OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${_lsb_release_exe} -sc OUTPUT_VARIABLE MYX_CMAKE_LSB_CODENAME OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${_lsb_release_exe} -sr OUTPUT_VARIABLE MYX_CMAKE_LSB_RELEASE_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
# cmake-format: on
endif()

View File

@ -0,0 +1,208 @@
#
# This file is part of the GROMACS molecular simulation package.
#
# Copyright (c) 2009,2010,2012,2014,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
#
# GROMACS is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public License
# as published by the Free Software Foundation; either version 2.1
# of the License, or (at your option) any later version.
#
# GROMACS is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with GROMACS; if not, see
# http://www.gnu.org/licenses, or write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# If you want to redistribute modifications to GROMACS, please
# consider that scientific software is very special. Version
# control is crucial - bugs must be traceable. We will be happy to
# consider code for inclusion in the official distribution, but
# derived work must not be called official GROMACS. Details are found
# in the README & COPYING files - if they are missing, get the
# official version at http://www.gromacs.org.
#
# To help us fund GROMACS development, we humbly ask that you cite
# the research papers on the package. Check out http://www.gromacs.org.
# Forked from Gromacs
# - Define macro to check large file support
#
# myx_cmake_test_large_files(VARIABLE)
#
# VARIABLE will be set to true if off_t is 64 bits, and fseeko/ftello present.
# This macro will also set defines necessary enable large file support, for instance
# _LARGE_FILES
# _LARGEFILE_SOURCE
# _FILE_OFFSET_BITS 64
# HAVE_FSEEKO
# HAVE__FSEEKI64
#
# However, it is YOUR job to make sure these defines are set in a cmakedefine so they
# end up in a config.h file that is included in your source if necessary!
include_guard(GLOBAL)
include(CheckTypeSize)
set(_test_file_offset_bits_c
"
#include <sys/types.h>
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[ (LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1 ];
int main(int argc, char **argv) { return 0; }
")
set(_test_file_offset_bits_c_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/test_file_offset_bits.c)
file(WRITE ${_test_file_offset_bits_c_path} ${_test_file_offset_bits_c})
set(_test_large_file_c_in
"
#cmakedefine _LARGEFILE_SOURCE
#cmakedefine _LARGEFILE64_SOURCE
#cmakedefine _LARGE_FILES
#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int main(int argc, char **argv)
{
int off_t_is_large[ (LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1 ];
FILE *fp = fopen(argv[0],\"r\");
off_t offset = ftello( fp );
fseeko( fp, offset, SEEK_CUR );
fclose(fp);
return off_t_is_large[0] || argc;
}
")
set(_test_large_file_c_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/test_large_file.c)
set(_test_large_file_c_in_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/test_large_file.c.in)
file(WRITE ${_test_large_file_c_in_path} ${_test_large_file_c_in})
set(_test_windows_fseek_c
"
#include <stdio.h>
int main()
{
__int64 off=0;
_fseeki64(NULL, off, SEEK_SET);
return 0;
}
")
set(_test_windows_fseek_c_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/test_windows_fseek.c)
file(WRITE ${_test_windows_fseek_c_path} ${_test_windows_fseek_c})
macro(myx_cmake_test_large_files VARIABLE)
if(NOT DEFINED ${VARIABLE})
# On most platforms it is probably overkill to first test the flags for 64-bit off_t,
# and then separately fseeko. However, in the future we might have 128-bit filesystems
# (ZFS), so it might be dangerous to indiscriminately set e.g. _FILE_OFFSET_BITS=64.
message(STATUS "Checking for 64-bit off_t")
# First check without any special flags
try_compile(FILE64_OK ${CMAKE_CURRENT_BINARY_DIR} ${_test_file_offset_bits_c_path})
if(FILE64_OK)
message(STATUS "Checking for 64-bit off_t - present")
endif()
if(NOT FILE64_OK)
# Test with _FILE_OFFSET_BITS=64
try_compile(FILE64_OK ${CMAKE_CURRENT_BINARY_DIR} ${_test_file_offset_bits_c_path}
COMPILE_DEFINITIONS "-D_FILE_OFFSET_BITS=64")
if(FILE64_OK)
message(STATUS "Checking for 64-bit off_t - present with _FILE_OFFSET_BITS=64")
set(_FILE_OFFSET_BITS 64 CACHE INTERNAL "64-bit off_t requires _FILE_OFFSET_BITS=64")
endif()
endif()
if(NOT FILE64_OK)
# Test with _LARGE_FILES
try_compile(FILE64_OK ${CMAKE_CURRENT_BINARY_DIR} ${_test_file_offset_bits_c_path}
COMPILE_DEFINITIONS "-D_LARGE_FILES")
if(FILE64_OK)
message(STATUS "Checking for 64-bit off_t - present with _LARGE_FILES")
set(_LARGE_FILES 1 CACHE INTERNAL "64-bit off_t requires _LARGE_FILES")
endif()
endif()
if(NOT FILE64_OK)
# Test with _LARGEFILE_SOURCE
try_compile(FILE64_OK ${CMAKE_CURRENT_BINARY_DIR} ${_test_file_offset_bits_c_path}
COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE")
if(FILE64_OK)
message(STATUS "Checking for 64-bit off_t - present with _LARGEFILE_SOURCE")
set(_LARGEFILE_SOURCE 1 CACHE INTERNAL "64-bit off_t requires _LARGEFILE_SOURCE")
endif()
endif()
if(NOT FILE64_OK)
message(STATUS "Checking for 64-bit off_t - not present")
else()
# 64-bit off_t found. Now check that ftello/fseeko is available.
# Set the flags we might have determined to be required above
configure_file(${_test_large_file_c_in_path} ${_test_large_file_c_path})
message(STATUS "Checking for fseeko/ftello")
# Test if ftello/fseeko are available
try_compile(FSEEKO_COMPILE_OK ${CMAKE_CURRENT_BINARY_DIR} ${_test_large_file_c_path})
if(FSEEKO_COMPILE_OK)
message(STATUS "Checking for fseeko/ftello - present")
endif()
if(NOT FSEEKO_COMPILE_OK)
# glibc 2.2 neds _LARGEFILE_SOURCE for fseeko (but not 64-bit off_t...)
try_compile(FSEEKO_COMPILE_OK ${CMAKE_CURRENT_BINARY_DIR} ${_test_large_file_c_path}
COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE")
if(FSEEKO_COMPILE_OK)
message(STATUS "Checking for fseeko/ftello - present with _LARGEFILE_SOURCE")
set(_LARGEFILE_SOURCE 1 CACHE INTERNAL "64-bit fseeko requires _LARGEFILE_SOURCE")
else()
set(FILE64_OK 0)
message(STATUS "64-bit off_t present but fseeko/ftello not found!")
endif()
endif()
endif()
# cmake-lint: disable=C0103
if(NOT FILE64_OK)
# now check for Windows stuff
try_compile(FILE64_OK ${CMAKE_CURRENT_BINARY_DIR} ${_test_windows_fseek_c_path})
if(FILE64_OK)
message(STATUS "Checking for 64-bit off_t - present with _fseeki64")
set(HAVE__FSEEKI64 1 CACHE INTERNAL "64-bit off_t requires _fseeki64")
endif()
endif()
if(FSEEKO_COMPILE_OK)
set(${VARIABLE} 1 CACHE INTERNAL "Result of test for large file support" FORCE)
set(HAVE_FSEEKO 1 CACHE INTERNAL "64-bit fseeko is available" FORCE)
elseif(HAVE__FSEEKI64)
set(${VARIABLE} 1 CACHE INTERNAL "Result of test for large file support" FORCE)
set(HAVE__FSEEKI64 1 CACHE INTERNAL "Windows 64-bit fseek" FORCE)
else()
check_type_size("long int" SIZEOF_LONG_INT)
if(SIZEOF_LONG_INT EQUAL 8) #standard fseek is OK for 64bit
set(${VARIABLE} 1 CACHE INTERNAL "Result of test for large file support" FORCE)
else()
message(FATAL_ERROR "Checking for 64-bit file support failed.")
endif()
endif()
endif()
endmacro(myx_cmake_test_large_files VARIABLE)

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
# Если выбран генератор Ninja, то в основном сборочном каталоге создаётся файл
# Makefile, который обрабатывается командой make и передаёт исполнение системе
# сборки ninja. Таким образом можно выполнять команду make, даже если правила

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
function(myx_cmake_generate_pkgconfig target)
set(options)
set(oneVA COMPONENT BASENAME)

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
# cmake-format: off
if(${CMAKE_VERSION} VERSION_LESS "3.16.0")
include(cotire OPTIONAL)

View File

@ -1,3 +1,5 @@
include_guard(GLOBAL)
function(myx_cmake_check_project_version)
if(NOT ${PROJECT_VERSION_PATCH} MATCHES "([0-9]+)")
myx_cmake_message_error("MyxCMake: Please set project version in X.Y.Z format")

View File

@ -0,0 +1,60 @@
include_guard(GLOBAL)
function(myx_cmake_qt5_translation outfiles)
find_package(Qt5 COMPONENTS LinguistTools REQUIRED)
set(options)
set(oneValueArgs BASE_NAME OUTPUT_DIR)
set(multiValueArgs SOURCES LANGUAGES)
cmake_parse_arguments(_QTTR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(_base_name ${_QTTR_BASE_NAME})
set(_sources ${_QTTR_SOURCES})
set(_output_dir ${_QTTR_OUTPUT_DIR})
set(_languages ${_QTTR_LANGUAGES})
set(L10N_QRC_BODY "")
make_directory(${_output_dir})
foreach(lang ${_languages})
set(_ts "${_base_name}_${lang}.ts")
set(_qm "${_base_name}_${lang}.qm")
list(APPEND _ts_list ${_output_dir}/${_ts})
list(APPEND _l10n_names_list "${_base_name}_l10n_${lang}")
string(APPEND L10N_QRC_BODY "<file alias=\"${_qm}\">${CMAKE_BINARY_DIR}/${_qm}</file>\n")
add_custom_target(
${_base_name}_l10n_${lang} COMMAND ${Qt5_LUPDATE_EXECUTABLE} ${_sources} -ts ${_output_dir}/${_ts}
-target-language ${lang} DEPENDS ${_sources})
if(NOT EXISTS "${_output_dir}/${_ts}")
add_custom_target(${_ts} DEPENDS ${_base_name}_l10n_${lang})
else()
add_custom_target(${_ts} COMMAND echo "Skipping lupdate for ${_ts}")
endif()
add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/${_qm} COMMAND ${Qt5_LRELEASE_EXECUTABLE} ARGS ${_output_dir}/${_ts} -qm
${CMAKE_BINARY_DIR}/${_qm} DEPENDS ${_ts} ${_sources})
endforeach()
file(WRITE ${CMAKE_BINARY_DIR}/${_base_name}_l10n.qrc
"<RCC>\n"
" <qresource prefix=\"/qm\">\n"
" ${L10N_QRC_BODY}\n"
" </qresource>\n"
"</RCC>\n"
)
qt5_add_resources(${outfiles} ${CMAKE_BINARY_DIR}/${_base_name}_l10n.qrc)
add_custom_target(${_base_name}_qrc DEPENDS ${_qrc})
add_custom_target(${_base_name}_l10n DEPENDS ${_l10n_names_list})
if(NOT TARGET l10n)
add_custom_target(l10n)
endif()
add_dependencies(l10n ${_base_name}_l10n)
# add_dependencies(${_target} ${_target}_qrc)
# target_sources(${_target} PUBLIC ${_qrc})
set(${outfiles} ${${outfiles}} PARENT_SCOPE)
endfunction()

View File

@ -0,0 +1,76 @@
include_guard(GLOBAL)
# https://stackoverflow.com/a/49216539
#
# Removes the specified compile flag from the specified target.
# _target - The target to remove the compile flag from
# _flag - The compile flag to remove
#
# Pre: apply_global_cxx_flags_to_all_targets() must be invoked.
#
# cmake-lint: disable=C0103
macro(myx_cmake_remove_flag_from_target _target _flag)
get_target_property(_target_cxx_flags ${_target} COMPILE_OPTIONS)
if(_target_cxx_flags)
list(REMOVE_ITEM _target_cxx_flags ${_flag})
set_target_properties(${_target} PROPERTIES COMPILE_OPTIONS "${_target_cxx_flags}")
endif()
endmacro()
#
# Removes the specified compiler flag from the specified file.
# _target - The target that _file belongs to
# _file - The file to remove the compiler flag from
# _flag - The compiler flag to remove.
#
# Pre: apply_global_cxx_flags_to_all_targets() must be invoked.
#
# cmake-lint: disable=C0103
macro(myx_cmake_remove_flag_from_file _target _file _flag)
get_target_property(_target_sources ${_target} SOURCES)
# Check if a sync is required, in which case we'll force a rewrite of the cache variables.
if(_flag_sync_required)
unset(_cached_${_target}_cxx_flags CACHE)
unset(_cached_${_target}_${_file}_cxx_flags CACHE)
endif()
get_target_property(_${_target}_cxx_flags ${_target} COMPILE_OPTIONS)
# On first entry, cache the target compile flags and apply them to each source file
# in the target.
if(NOT _cached_${_target}_cxx_flags)
# Obtain and cache the target compiler options, then clear them.
get_target_property(_target_cxx_flags ${_target} COMPILE_OPTIONS)
set(_cached_${_target}_cxx_flags "${_target_cxx_flags}" CACHE INTERNAL "")
set_target_properties(${_target} PROPERTIES COMPILE_OPTIONS "")
# Apply the target compile flags to each source file.
foreach(_source_file ${_target_sources})
# Check for pre-existing flags set by set_source_files_properties().
get_source_file_property(_source_file_cxx_flags ${_source_file} COMPILE_FLAGS)
if(_source_file_cxx_flags)
separate_arguments(_source_file_cxx_flags UNIX_COMMAND ${_source_file_cxx_flags})
list(APPEND _source_file_cxx_flags "${_target_cxx_flags}")
else()
set(_source_file_cxx_flags "${_target_cxx_flags}")
endif()
# Apply the compile flags to the current source file.
string(REPLACE ";" " " _source_file_cxx_flags_string "${_source_file_cxx_flags}")
set_source_files_properties(${_source_file} PROPERTIES COMPILE_FLAGS "${_source_file_cxx_flags_string}")
endforeach()
endif()
list(FIND _target_sources ${_file} _file_found_at)
if(_file_found_at GREATER -1)
if(NOT _cached_${_target}_${_file}_cxx_flags)
# Cache the compile flags for the specified file.
# This is the list that we'll be removing flags from.
get_source_file_property(_source_file_cxx_flags ${_file} COMPILE_FLAGS)
separate_arguments(_source_file_cxx_flags UNIX_COMMAND ${_source_file_cxx_flags})
set(_cached_${_target}_${_file}_cxx_flags ${_source_file_cxx_flags} CACHE INTERNAL "")
endif()
# Remove the specified flag, then re-apply the rest.
list(REMOVE_ITEM _cached_${_target}_${_file}_cxx_flags ${_flag})
string(REPLACE ";" " " _cached_${_target}_${_file}_cxx_flags_string
"${_cached_${_target}_${_file}_cxx_flags}")
set_source_files_properties(${_file} PROPERTIES COMPILE_FLAGS
"${_cached_${_target}_${_file}_cxx_flags_string}")
endif()
endmacro()

View File

@ -1,27 +1,33 @@
#
# Обязательные переменные, значения которым необходимо присвоить в файле
# CMakeLists.txt до подключения MyxCMake, либо передать из командной строки
# через ключ -D
#
# Обязательные переменные, значения которым необходимо присвоить
# в файле CMakeLists.txt до подключения MyxCMake, либо передать через ключ -D
include_guard(GLOBAL)
# cmake-format: off
if(NOT MYX_CMAKE_ORGANIZATION_NAME)
myx_cmake_message_error("MyxCMake: Required variable MYX_CMAKE_ORGANIZATION_NAME is not defined")
myx_cmake_message_warning("MyxCMake: Required variable MYX_CMAKE_ORGANIZATION_NAME is not defined")
else()
set(MYX_CMAKE_ORGANIZATION_NAME "ORG NAME" CACHE STRING "")
endif()
if(NOT MYX_CMAKE_AUTHOR_NAME)
myx_cmake_message_error("MyxCMake: Required variable MYX_CMAKE_AUTHOR_NAME is not defined")
myx_cmake_message_warning("MyxCMake: Required variable MYX_CMAKE_AUTHOR_NAME is not defined")
else()
set(MYX_CMAKE_AUTHOR_NAME "AUTHOR NAME" CACHE STRING "")
endif()
if(NOT MYX_CMAKE_AUTHOR_EMAIL)
myx_cmake_message_error("MyxCMake: Required variable MYX_CMAKE_AUTHOR_EMAIL is not defined")
myx_cmake_message_warning("MyxCMake: Required variable MYX_CMAKE_AUTHOR_EMAIL is not defined")
else()
set(MYX_CMAKE_AUTHOR_EMAIL "AUTHOR@EMAIL" CACHE STRING "")
endif()
if(NOT MYX_CMAKE_DESCRIPTION)
myx_cmake_message_error("MyxCMake: Required variable MYX_CMAKE_DESCRIPTION is not defined")
myx_cmake_message_warning("MyxCMake: Required variable MYX_CMAKE_DESCRIPTION is not defined")
else()
set(MYX_CMAKE_DESCRIPTION "PROJECT DESCRIPTION" CACHE STRING "")
endif()
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${MYX_CMAKE_DESCRIPTION} CACHE STRING "")
set(CPACK_PACKAGE_CONTACT "${MYX_CMAKE_AUTHOR_NAME} <${MYX_CMAKE_AUTHOR_EMAIL}>" CACHE STRING "")
# cmake-format: on

View File

@ -1,3 +1,6 @@
include_guard(GLOBAL)
if(NOT TARGET uninstall)
configure_file("${CMAKE_CURRENT_LIST_DIR}/MyxCMakeUninstall.cmake.in"
"${CMAKE_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)

View File

@ -1,3 +1,5 @@
include_guard(GLOBAL)
if(${CMAKE_VERSION} VERSION_LESS "3.16.0")
include(cotire OPTIONAL)
if(COMMAND cotire)

View File

@ -0,0 +1,33 @@
include_guard(GLOBAL)
function(myx_cmake_write_compiler_detection_header)
if(${CMAKE_VERSION} VERSION_LESS "3.6.0")
return()
endif()
include(WriteCompilerDetectionHeader)
set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/include/compiler_features.hpp)
if(MYX_CMAKE_GENERATED_HEADER_FILENAME)
set(OUTPUT_FILE ${MYX_CMAKE_GENERATED_HEADER_FILENAME})
endif()
write_compiler_detection_header(
FILE ${OUTPUT_FILE}
PREFIX ${MYX_CMAKE_PROJECT_NAME_CANONICAL}
COMPILERS GNU Clang MSVC Intel
FEATURES
cxx_nullptr
cxx_override
cxx_alignas
cxx_alignof
cxx_attributes
cxx_auto_type
cxx_constexpr
cxx_digit_separators
cxx_range_for)
unset(OUTPUT_FILE)
endfunction()

View File

@ -0,0 +1,185 @@
#!@PYTHON_EXECUTABLE@
# -*- coding: utf-8 -*-
#
import os
import subprocess
import sys
# -- General configuration ------------------------------------------------
# At top on conf.py (with other import statements)
import recommonmark
from recommonmark.parser import CommonMarkParser
from recommonmark.transform import AutoStructify
from recommonmark.states import DummyStateMachine
# Monkey patch to fix recommonmark 0.4 doc reference issues.
orig_run_role = DummyStateMachine.run_role
def run_role(self, name, options=None, content=None):
if name == 'doc':
name = 'any'
return orig_run_role(self, name, options, content)
DummyStateMachine.run_role = run_role
source_parsers = {
'.md': CommonMarkParser
}
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'breathe', 'sphinx.ext.autosectionlabel', 'recommonmark'
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
source_suffix = ['.rst', '.md']
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = '@DOXYGEN_PROJECT_TITLE@'
author = '@MYX_CMAKE_AUTHOR_NAME@'
copyright = '© @MYX_CMAKE_YEAR@, ' + author
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '@PROJECT_VERSION@'
# The full version, including alpha/beta/rc tags.
release = ''
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', '_output', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = []
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# This is required for the alabaster theme
# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
html_sidebars = {
'**': [
'relations.html', # needs 'show_related': True theme option to display
'searchbox.html',
]
}
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = '@CMAKE_PROJECT_NAME@doc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, '@CMAKE_PROJECT_NAME@.tex', '@CMAKE_PROJECT_NAME@ Documentation',
author, 'manual'),
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [(master_doc, '@CMAKE_PROJECT_NAME@', '@CMAKE_PROJECT_NAME@ Documentation', [author], 1)]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, '@CMAKE_PROJECT_NAME@', '@CMAKE_PROJECT_NAME@ Documentation', author, '@CMAKE_PROJECT_NAME@',
'One line description of project.', 'Miscellaneous'),
]
breathe_projects = {'@CMAKE_PROJECT_NAME@': '@BREATHE_DOXYGEN_DIR@/xml'}
def run_doxygen(folder):
"""Run the doxygen make command in the designated folder"""
try:
retcode = subprocess.call("cd {}; doxygen".format(folder), shell=True)
if retcode < 0:
sys.stderr.write(
"doxygen terminated by signal {}".format(-retcode))
except OSError as e:
sys.stderr.write("doxygen execution failed: {}".format(e))
def setup(app):
run_doxygen('@BREATHE_DOXYGEN_DIR@')
app.add_config_value('recommonmark_config', {
'enable_auto_toc_tree': True,
'enable_eval_rst': True,
'enable_auto_doc_ref': True,
'enable_math': True,
'enable_inline_math': True
}, True)
app.add_transform(AutoStructify)