From 5e4f8d371add618139820684ced68cac86fe4b8f Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Fri, 2 Jul 2021 10:41:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cmake-format.py | 248 +++++++++++++++++++++++++++++++ .gitlab-ci.yml | 8 +- .gitlab-ci/scheduled.yml | 78 ---------- .gitmodules | 3 - CMakeLists.txt | 25 +++- cmake/cmlib | 2 +- cmake/doc | 1 - cmake/etc/Variables.cmake | 9 -- cmake/etc/uncrustify | 2 +- cmake/find | 2 +- files/data/.keep-directory | 0 files/etc/.keep-directory | 0 files/lib/.keep-directory | 0 files/log/.keep-directory | 0 src/cmlib-example/CMakeLists.txt | 4 +- thirdparty/cmlib-example-library | 2 +- 16 files changed, 278 insertions(+), 106 deletions(-) create mode 100644 .cmake-format.py delete mode 100644 .gitlab-ci/scheduled.yml delete mode 160000 cmake/doc delete mode 100644 cmake/etc/Variables.cmake delete mode 100644 files/data/.keep-directory delete mode 100644 files/etc/.keep-directory delete mode 100644 files/lib/.keep-directory delete mode 100644 files/log/.keep-directory diff --git a/.cmake-format.py b/.cmake-format.py new file mode 100644 index 0000000..87589ae --- /dev/null +++ b/.cmake-format.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python3 + +# ---------------------------------- +# Options affecting listfile parsing +# ---------------------------------- +with section("parse"): + + # Specify structure for custom cmake functions + additional_commands = { + 'add_doxygen': { 'flags' : [], + 'kwargs': { 'LATEX': 1, + 'HTML': 1, + 'COMMENT': 1}}, + 'add_breathe': { 'flags' : [], + 'kwargs': { 'COMMENT': 1}}, + 'add_common_library': { 'flags' : [], + 'kwargs': { 'OUTPUT_NAME': 1, + 'SOURCES': '*', + 'TARGET': 1}}, + 'qt5_translation': { 'flags' : [], + 'kwargs': { 'OUTPUT_DIR': 1, + 'LANGUAGES': '*', + 'SOURCES': '*', + 'BASE_NAME': 1}}, + 'pvs_studio_add_target': { 'flags' : [ 'COMPILE_COMMANDS', + 'OUTPUT', + 'HIDE_HELP'], + 'kwargs': { 'ARGS': '*', + 'CONFIG': '*', + 'DEPENDS': '*', + 'FORMAT': '*', + 'MODE': '*', + 'TARGET': 1}}, + 'write_compiler_detection_header': { 'flags' : [], + 'kwargs': { 'COMPILERS': '*', + 'FEATURES': '*', + 'FILE': '*', + 'PREFIX': '*'}}} + + # Specify variable tags. + vartags = [] + + # Specify property tags. + proptags = [] + +# ----------------------------- +# Options affecting formatting. +# ----------------------------- +with section("format"): + + # How wide to allow formatted cmake files + line_width = 110 + + # How many spaces to tab for indent + tab_size = 2 + + # If an argument group contains more than this many sub-groups (parg or kwarg + # groups) then force it to a vertical layout. + max_subgroups_hwrap = 3 + + # If a positional argument group contains more than this many arguments, then + # force it to a vertical layout. + max_pargs_hwrap = 5 + + # If a cmdline positional group consumes more than this many lines without + # nesting, then invalidate the layout (and nest) + max_rows_cmdline = 2 + + # If true, separate flow control names from their parentheses with a space + separate_ctrl_name_with_space = False + + # If true, separate function names from parentheses with a space + separate_fn_name_with_space = False + + # If a statement is wrapped to more than one line, than dangle the closing + # parenthesis on its own line. + dangle_parens = False + + # If the trailing parenthesis must be 'dangled' on its on line, then align it + # to this reference: `prefix`: the start of the statement, `prefix-indent`: + # the start of the statement, plus one indentation level, `child`: align to + # the column of the arguments + dangle_align = 'prefix' + + # If the statement spelling length (including space and parenthesis) is + # smaller than this amount, then force reject nested layouts. + min_prefix_chars = 4 + + # If the statement spelling length (including space and parenthesis) is larger + # than the tab width by more than this amount, then force reject un-nested + # layouts. + max_prefix_chars = 2 + + # If a candidate layout is wrapped horizontally but it exceeds this many + # lines, then reject the layout. + max_lines_hwrap = 2 + + # What style line endings to use in the output. + line_ending = 'unix' + + # Format command names consistently as 'lower' or 'upper' case + command_case = 'canonical' + + # Format keywords consistently as 'lower' or 'upper' case + keyword_case = 'upper' + + # A list of command names which should always be wrapped + always_wrap = [] + + # If true, the argument lists which are known to be sortable will be sorted + # lexicographicall + enable_sort = True + + # If true, the parsers may infer whether or not an argument list is sortable + # (without annotation). + autosort = False + + # By default, if cmake-format cannot successfully fit everything into the + # desired linewidth it will apply the last, most agressive attempt that it + # made. If this flag is True, however, cmake-format will print error, exit + # with non-zero status code, and write-out nothing + require_valid_layout = False + + # A dictionary mapping layout nodes to a list of wrap decisions. See the + # documentation for more information. + layout_passes = {} + +# ------------------------------------------------ +# Options affecting comment reflow and formatting. +# ------------------------------------------------ +with section("markup"): + + # What character to use for bulleted lists + bullet_char = '*' + + # What character to use as punctuation after numerals in an enumerated list + enum_char = '.' + + # If comment markup is enabled, don't reflow the first comment block in each + # listfile. Use this to preserve formatting of your copyright/license + # statements. + first_comment_is_literal = False + + # If comment markup is enabled, don't reflow any comment block which matches + # this (regex) pattern. Default is `None` (disabled). + literal_comment_pattern = None + + # Regular expression to match preformat fences in comments default= + # ``r'^\s*([`~]{3}[`~]*)(.*)$'`` + fence_pattern = '^\\s*([`~]{3}[`~]*)(.*)$' + + # Regular expression to match rulers in comments default= + # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'`` + ruler_pattern = '^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$' + + # If a comment line matches starts with this pattern then it is explicitly a + # trailing comment for the preceeding argument. Default is '#<' + explicit_trailing_pattern = '#<' + + # If a comment line starts with at least this many consecutive hash + # characters, then don't lstrip() them off. This allows for lazy hash rulers + # where the first hash char is not separated by space + hashruler_min_length = 10 + + # If true, then insert a space between the first hash char and remaining hash + # chars in a hash ruler, and normalize its length to fill the column + canonicalize_hashrulers = True + + # enable comment markup parsing and reflow + enable_markup = False + +# ---------------------------- +# Options affecting the linter +# ---------------------------- +with section("lint"): + + # a list of lint codes to disable + disabled_codes = ['C0113'] + + # regular expression pattern describing valid function names + function_pattern = '[0-9a-z_]+' + + # regular expression pattern describing valid macro names + macro_pattern = '[0-9A-Z_]+' + + # regular expression pattern describing valid names for variables with global + # scope + global_var_pattern = '[0-9A-Z][0-9A-Z_]+' + + # regular expression pattern describing valid names for variables with global + # scope (but internal semantic) + internal_var_pattern = '_[0-9A-Z][0-9A-Z_]+' + + # regular expression pattern describing valid names for variables with local + # scope + local_var_pattern = '[0-9a-z_]+' + + # regular expression pattern describing valid names for privatedirectory + # variables + private_var_pattern = '_[0-9a-z_]+' + + # regular expression pattern describing valid names for publicdirectory + # variables + public_var_pattern = '[0-9A-Z][0-9A-Z_]+' + + # regular expression pattern describing valid names for keywords used in + # functions or macros + keyword_pattern = '[0-9A-Z_]+' + + # In the heuristic for C0201, how many conditionals to match within a loop in + # before considering the loop a parser. + max_conditionals_custom_parser = 2 + + # Require at least this many newlines between statements + min_statement_spacing = 1 + + # Require no more than this many newlines between statements + max_statement_spacing = 2 + max_returns = 6 + max_branches = 12 + max_arguments = 5 + max_localvars = 15 + max_statements = 50 + +# ------------------------------- +# Options affecting file encoding +# ------------------------------- +with section("encode"): + + # If true, emit the unicode byte-order mark (BOM) at the start of the file + emit_byteorder_mark = False + + # Specify the encoding of the input file. Defaults to utf-8 + input_encoding = 'utf-8' + + # Specify the encoding of the output file. Defaults to utf-8. Note that cmake + # only claims to support utf-8 so be careful when using anything else + output_encoding = 'utf-8' + +# ------------------------------------- +# Miscellaneous configurations options. +# ------------------------------------- +with section("misc"): + + # A dictionary containing any per-command configuration overrides. Currently + # only `command_case` is supported. + per_command = {} + diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a47be1d..c1925a0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,7 @@ include: - - local: .gitlab-ci/scheduled.yml + - project: 'f1x1t/gitlab-ci' + ref: master + file: 'scheduled.yml' smolensk15-nightly: variables: @@ -19,3 +21,7 @@ focal-nightly: elbrus-nightly: extends: .scheduled-elbrus +check-format-sources: + only: + - merge_requests + extends: .check-format-sources diff --git a/.gitlab-ci/scheduled.yml b/.gitlab-ci/scheduled.yml deleted file mode 100644 index 70a12fc..0000000 --- a/.gitlab-ci/scheduled.yml +++ /dev/null @@ -1,78 +0,0 @@ -variables: - GIT_SUBMODULE_STRATEGY: recursive - GET_SOURCES_ATTEMPTS: 10 - -.scheduled-test: - only: - refs: - - schedules - cache: - paths: ['*.status'] - before_script: - - > - if [ -f "${CI_JOB_NAME}.status" ]; then - if [ "$(cat ${CI_JOB_NAME}.status)" == "${CI_COMMIT_SHA}" ]; then - echo "=== Commit ${CI_COMMIT_SHORT_SHA} already tested with job ${CI_JOB_NAME} ===" - exit 0 - fi - fi - - > - if [ -n "${UPDATE_CMD}" ]; then - ${UPDATE_CMD} - fi - - > - if [ -n "${INSTALL_CMD}" ]; then - ${INSTALL_CMD} - fi - script: - - > - if [ -f "${CI_JOB_NAME}.status" ]; then - if [ "$(cat ${CI_JOB_NAME}.status)" == "${CI_COMMIT_SHA}" ]; then - echo "=== Commit ${CI_COMMIT_SHORT_SHA} already tested with job ${CI_JOB_NAME} ===" - exit 0 - fi - fi - - rm -f ${CI_JOB_NAME}.status - - mkdir build - - cd build - - cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=_output -DCPACK_PACKAGING_INSTALL_PREFIX=/opt/rtis .. - - ninja - - > - if [ -z "${CI_SHARED_ENVIRONMENT+x}" ]; then - ninja install - ninja package - ninja package_source - fi - - echo "${CI_COMMIT_SHA}" > "../${CI_JOB_NAME}.status" - artifacts: - paths: - - build/*.xz - - build/*.deb - when: on_success - expire_in: 10 days - - -.scheduled-smolensk15: - extends: .scheduled-test - image: smolensk15-dev - tags: ['docker'] - -.scheduled-orel212: - extends: .scheduled-test - image: orel212-dev - tags: ['docker'] - -.scheduled-bionic: - extends: .scheduled-test - image: bionic-dev - tags: ['docker'] - -.scheduled-focal: - extends: .scheduled-test - image: focal-dev - tags: ['docker'] - -.scheduled-elbrus: - extends: .scheduled-test - tags: ['elbrus'] - diff --git a/.gitmodules b/.gitmodules index 3e125d6..ba546fd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "cmake/generators"] path = cmake/generators url = https://git.246060.ru/f1x1t/cmake-generators.git -[submodule "cmake/doc"] - path = cmake/doc - url = https://git.246060.ru/f1x1t/cmake-doc.git [submodule "cmake/etc/uncrustify"] path = cmake/etc/uncrustify url = https://git.246060.ru/f1x1t/uncrustify-config.git diff --git a/CMakeLists.txt b/CMakeLists.txt index e85ffad..e5517ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ # Минимальная версия CMake -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.6) # Предпочтительно следовать стандартам принятым в указанном диапазоне версий cmake_policy(VERSION 3.0.2..3.7) @@ -7,13 +7,21 @@ cmake_policy(VERSION 3.0.2..3.7) # Название и версия проекта и используемые языки программирования project(cmlib-example-app VERSION 0.2.0 LANGUAGES C CXX) +# Обязательные переменные +set(CMLIB_ORGANIZATION_NAME "ECS5" CACHE STRING "") +set(CMLIB_AUTHOR_NAME "Андрей Астафьев" CACHE STRING "") +set(CMLIB_AUTHOR_EMAIL "dev@246060.ru" CACHE STRING "") +set(CMLIB_DESCRIPTION "Пример проекта: приложение и подключение библиотеки" CACHE STRING "") + # В каталоге cmake/cmlib находятся файлы с библиотечными функциями -if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/cmlib) - list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/cmlib) -else() - message(FATAL_ERROR "CMake library directory does not exist") +if(NOT DEFINED CMLIB_MAIN_DIR) + set(CMLIB_MAIN_DIR "${CMAKE_SOURCE_DIR}/cmake/cmlib") +endif() +if(IS_DIRECTORY "${CMLIB_MAIN_DIR}" AND EXISTS "${CMLIB_MAIN_DIR}/CMLibCommon.cmake") + list(INSERT CMAKE_MODULE_PATH 0 "${CMLIB_MAIN_DIR}") +else() + message(FATAL_ERROR "CMLib main directory ${CMLIB_MAIN_DIR} does not exists") endif() -list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find) include(CMLibCommon) @@ -24,7 +32,7 @@ set(Boost_USE_STATIC_RUNTIME ON) find_package(Boost 1.55.0 REQUIRED) # Автоматически генерируемый заголовочный файл -cmlib_config_hpp_generate() +cmlib_generate_private_config_hpp() # Подключение внешних проектов include(ExternalProject) @@ -43,7 +51,8 @@ ExternalProject_Add(ext-lib add_subdirectory(src/cmlib-example) # Документация -add_subdirectory(cmake/doc) +add_breathe_target(doc-breathe) +add_doxygen_target(doc-doxygen LATEX YES HTML YES) # Создание вспомогательных символических ссылок add_dependencies(cmlib-example create_auxilary_symlinks) diff --git a/cmake/cmlib b/cmake/cmlib index 197e5b3..0613278 160000 --- a/cmake/cmlib +++ b/cmake/cmlib @@ -1 +1 @@ -Subproject commit 197e5b3939709a0cc4924e44c355aa8ad7358b8e +Subproject commit 061327890c93ae2e96a63ac50f86e8df0ac14e12 diff --git a/cmake/doc b/cmake/doc deleted file mode 160000 index acdfb6a..0000000 --- a/cmake/doc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit acdfb6a9dd5ca1cb037e541f7da7033968873357 diff --git a/cmake/etc/Variables.cmake b/cmake/etc/Variables.cmake deleted file mode 100644 index fc058d3..0000000 --- a/cmake/etc/Variables.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set(ORGANIZATION_NAME "org") -set(AUTHOR_NAME "John Doe") - -set(DOXYGEN_PROJECT_TITLE "Пример проекта приложения") -set(DOXYGEN_GENERATE_LATEX YES) -set(DOXYGEN_GENERATE_HTML YES) - -set(CPACK_PACKAGE_CONTACT "John Doe ") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMLib application project example") diff --git a/cmake/etc/uncrustify b/cmake/etc/uncrustify index 0cd764f..e11d85f 160000 --- a/cmake/etc/uncrustify +++ b/cmake/etc/uncrustify @@ -1 +1 @@ -Subproject commit 0cd764fc187ab3b66cb31a5549f13b3336858894 +Subproject commit e11d85f13317dcf3652988026ce1ef4dcbe72c68 diff --git a/cmake/find b/cmake/find index d0bc6e7..29faeea 160000 --- a/cmake/find +++ b/cmake/find @@ -1 +1 @@ -Subproject commit d0bc6e71e9c613eaaecca62eaf445d647f5216ed +Subproject commit 29faeeae1ac920e987aa6a6c16fff8f8f9f9a647 diff --git a/files/data/.keep-directory b/files/data/.keep-directory deleted file mode 100644 index e69de29..0000000 diff --git a/files/etc/.keep-directory b/files/etc/.keep-directory deleted file mode 100644 index e69de29..0000000 diff --git a/files/lib/.keep-directory b/files/lib/.keep-directory deleted file mode 100644 index e69de29..0000000 diff --git a/files/log/.keep-directory b/files/log/.keep-directory deleted file mode 100644 index e69de29..0000000 diff --git a/src/cmlib-example/CMakeLists.txt b/src/cmlib-example/CMakeLists.txt index f2ef357..bf3c73a 100644 --- a/src/cmlib-example/CMakeLists.txt +++ b/src/cmlib-example/CMakeLists.txt @@ -19,10 +19,10 @@ add_dependencies(${TRGT} ext-lib) target_include_directories(${TRGT} PUBLIC $) # Компоновка с библиотекой из внешнего проекта -target_link_libraries(${TRGT} ${CMAKE_BINARY_DIR}/lib/libcmlib-example.a) +target_link_libraries(${TRGT} ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/libcmlib-example.a) # Имя выходного файла для цели set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME ${TRGT}) # Правила для установки -install(TARGETS ${TRGT} COMPONENT MAIN RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +install(TARGETS ${TRGT} COMPONENT main RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/thirdparty/cmlib-example-library b/thirdparty/cmlib-example-library index 76ede7e..bbe7148 160000 --- a/thirdparty/cmlib-example-library +++ b/thirdparty/cmlib-example-library @@ -1 +1 @@ -Subproject commit 76ede7e013d94cdca2b0f18350a2da32028f18d2 +Subproject commit bbe71486ed65dfc59e599534d7a76e8c5cb61365