diff --git a/.gitignore b/.gitignore index d3ad89d2c..4397f7b58 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,31 @@ build* .dir-locals.el TAGS third-party/*/ !third-party/cmake/* !third-party/akantu-iterators !third-party/iohelper *~ release .*.swp *.tar.gz *.tgz *.tbz *.tar.bz2 .idea __pycache__ .mailmap paraview/* *.vtu *.pvd *.pvtu *.vtk compile_commands.json .clangd .iwyu.imp .cache setup.cfg +.vscode +.auctex* +.clangd +.ccls diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ce7f28e9..9d680129e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,347 +1,350 @@ # yaml-language-server: $schema=gitlab-ci # yaml-language-server: $format.enable=false stages: - configure - build_libs - build_tests - test - code_quality - deploy include: local: '.gitlab-ci.d/*.yaml' #------------------------------------------------------------------------------- # Rebuilding the docker images if needed #------------------------------------------------------------------------------- docker build:debian-bullseye: variables: IMAGE_NAME: debian:bullseye extends: .docker_build docker build:ubuntu-lts: variables: IMAGE_NAME: ubuntu:lts extends: .docker_build docker build:manylinux: variables: IMAGE_NAME: manylinux:2010_x86_64 extends: .docker_build # ------------------------------------------------------------------------------ # Debian bullseye compiled with GCC # ------------------------------------------------------------------------------ configure:debian_bullseye_gcc: extends: - .debian_bullseye_gcc - .build_coverage - .configure build:debian_bullseye_gcc: extends: - .debian_bullseye_gcc - .build_coverage - .build_all needs: - job: configure:debian_bullseye_gcc test:debian_bullseye_gcc: extends: - .debian_bullseye_gcc - .build_coverage - .tests coverage: '/^lines: (\d+\.\d+\%)/' needs: - job: build:debian_bullseye_gcc # ------------------------------------------------------------------------------ # Debian bullseye compiled with Clang # ------------------------------------------------------------------------------ configure:debian_bullseye_clang: extends: - .debian_bullseye_clang - .build_coverage - .configure build:debian_bullseye_clang: extends: - .debian_bullseye_clang - .build_coverage - .build_all needs: - job: configure:debian_bullseye_clang test:debian_bullseye_clang: extends: - .debian_bullseye_clang - .build_coverage - .tests coverage: '/^lines: (\d+\.\d+\%)/' needs: - job: build:debian_bullseye_clang # ------------------------------------------------------------------------------ # Ubuntu LTS compiled with GCC # ------------------------------------------------------------------------------ configure:ubuntu_lts_gcc: extends: - .ubuntu_lts_gcc - .build_release - .configure build:ubuntu_lts_gcc: extends: - .ubuntu_lts_gcc - .build_release - .build_all needs: - job: configure:ubuntu_lts_gcc test:ubuntu_lts_gcc: extends: - .ubuntu_lts_gcc - .build_release - .tests needs: - job: build:ubuntu_lts_gcc # ------------------------------------------------------------------------------ # Debian bullseye compiled with GCC tested with valgrind # ------------------------------------------------------------------------------ configure:ubuntu_lts_gcc_valgrind: extends: - .ubuntu_lts_gcc - .build_valgrind - .configure build:ubuntu_lts_gcc_valgrind: extends: - .ubuntu_lts_gcc - .build_valgrind - .build_all needs: - job: configure:ubuntu_lts_gcc_valgrind test:ubuntu_lts_gcc_valgrind: extends: - .ubuntu_lts_gcc - .build_valgrind - .tests needs: - job: build:ubuntu_lts_gcc_valgrind # ------------------------------------------------------------------------------ # Manylinux to build python packages # ------------------------------------------------------------------------------ configure:python_package: stage: configure extends: - .manylinux_2010_x64_gcc - .build_release script: # create the build folder - cmake -E make_directory build - cd build # Variables for cmake - export CMAKE_PREFIX_PATH=/softs/view - export BOOST_ROOT=/softs/view # Configure in sequential and without tests or examples - cmake -DAKANTU_COHESIVE_ELEMENT:BOOL=TRUE -DAKANTU_IMPLICIT:BOOL=TRUE -DAKANTU_PARALLEL:BOOL=FALSE -DAKANTU_STRUCTURAL_MECHANICS:BOOL=TRUE -DAKANTU_HEAT_TRANSFER:BOOL=TRUE -DAKANTU_DAMAGE_NON_LOCAL:BOOL=TRUE -DAKANTU_PHASE_FIELD:BOOL=TRUE -DAKANTU_PYTHON_INTERFACE:BOOL=FALSE -DAKANTU_CONTACT_MECHANICS:BOOL=TRUE -DAKANTU_EXAMPLES:BOOL=FALSE -DAKANTU_TESTS:BOOL=FALSE -DMUMPS_DETECT_DEBUG:BOOL=TRUE -DCMAKE_INSTALL_PREFIX:PATH=${CI_PROJECT_DIR}/install -DCMAKE_BUILD_TYPE:STRING=${BUILD_TYPE} .. artifacts: when: on_success paths: - build/ expire_in: 10h build_akantu:python_package: extends: - .build_libs - .build_release - .manylinux_2010_x64_gcc script: stage: build_libs script: - cmake --build build --target akantu -j1 - cmake --install build artifacts: when: on_success paths: - install/ expire_in: 10h needs: - job: configure:python_package build_pip:python_package: stage: build_tests extends: - .build_release - .manylinux_2010_x64_gcc script: - export CI_AKANTU_INSTALL_PREFIX=${CI_PROJECT_DIR}/install - export CMAKE_PREFIX_PATH=/softs/view:${CI_AKANTU_INSTALL_PREFIX} - test/ci/make-wheels.sh needs: - job: build_akantu:python_package artifacts: when: on_success paths: - wheelhouse expire_in: 10h test:python_package: stage: test image: python:3.8 needs: - job: build_pip:python_package script: - - pip install akantu -f wheelhouse + - pip install numpy scipy + - pip install akantu --no-index --find-links=${PWD}/wheelhouse - python -c "import akantu" - cd examples/python/dynamics/ - apt update && apt install -y gmsh - gmsh -2 bar.geo - python ./dynamics.py package:python_gitlab: stage: deploy image: python:latest script: - pip install twine - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python3 -m twine upload --repository-url https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/pypi wheelhouse/* needs: - job: build_pip:python_package + - job: test:python_package only: - master package:python_pypi: stage: deploy image: python:latest script: - pip install twine - TWINE_PASSWORD=${PYPI_TOKEN} TWINE_USERNAME=__token__ python3 -m twine upload --verbose wheelhouse/* needs: - job: build_pip:python_package + - job: test:python_package only: - tags # ------------------------------------------------------------------------------ # Code Quality # ------------------------------------------------------------------------------ cq:code_quality: extends: - .code_quality_gitlab_template needs: - job: build:debian_bullseye_clang artifacts: paths: - gl-code-quality-report.json cq:clang_tidy: extends: - .clang_tools script: - test/ci/scripts/cq -x third-party -x extra-packages -x pybind11 -x test ${FILE_LIST_ARG} clang-tidy -p ${CI_PROJECT_DIR}/build > gl-clang-tidy-report.json needs: - job: build:debian_bullseye_clang artifacts: paths: - gl-clang-tidy-report.json cq:clang_format: extends: - .clang_tools script: - test/ci/scripts/cq -x third-party -x extra-packages clang-format -p ${CI_PROJECT_DIR}/build > gl-clang-format-report.json needs: - job: build:debian_bullseye_clang artifacts: paths: - gl-clang-format-report.json cq:compilation_warnings: stage: code_quality image: python:latest script: - pip install warning-parser termcolor Click - ls build-*-err.log - test/ci/scripts/cq -x third-party -x extra-packages warnings build-*-err.log > gl-warnings-report.json needs: - job: build:debian_bullseye_clang - job: build:debian_bullseye_gcc - job: build:ubuntu_lts_gcc artifacts: paths: - gl-warnings-report.json cq:merge_code_quality: stage: deploy extends: - .debian_bullseye_clang script: - jq -Ms '[.[][]]' gl-*-report.json | tee gl-codequality.json | jq -C needs: - job: cq:code_quality - job: cq:clang_tidy - job: cq:clang_format - job: cq:compilation_warnings artifacts: paths: - gl-codequality.json artifacts: reports: codequality: [gl-codequality.json] # ------------------------------------------------------------------------------ # Deploy pages # ------------------------------------------------------------------------------ pages: stage: deploy extends: - .debian_bullseye_gcc script: - cd build - cmake -DAKANTU_DOCUMENTATION=ON .. - cmake --build . -t sphinx-doc - mv doc/dev-doc/html ../public needs: - job: build:debian_bullseye_gcc artifacts: paths: - public only: - master diff --git a/cmake/Modules/CMakeVersionGenerator.cmake b/cmake/Modules/CMakeVersionGenerator.cmake index 6911d3eeb..d95bee5ce 100644 --- a/cmake/Modules/CMakeVersionGenerator.cmake +++ b/cmake/Modules/CMakeVersionGenerator.cmake @@ -1,247 +1,250 @@ #=============================================================================== # @file CMakeVersionGenerator.cmake # # @author Guillaume Anciaux # @author Nicolas Richart # # @date creation: Sun Oct 19 2014 # @date last modification: Mon Jan 18 2016 # # @brief Set of macros used by akantu to handle the package system # # # @section LICENSE # # Copyright (©) 2015-2021 EPFL (Ecole Polytechnique Fédérale de Lausanne) # Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) # # Akantu 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 3 of the License, or (at your option) any # later version. # # Akantu 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 Akantu. If not, see . # #=============================================================================== if(__DEFINE_PROJECT_VERSION__) return() endif() set(__DEFINE_PROJECT_VERSION__ TRUE) function(_match_semver _input_semver prefix) set(_semver_regexp - "^([0-9]+(\\.[0-9]+)?(\\.[0-9]+)?)(-([a-zA-Z0-9-]*))?(\\+(.*))?") + "^([0-9]+(\\.[0-9]+)?(\\.[0-9]+)?)(-([a-zA-Z0-9\-]*))?(\\+(.*))?") if(_input_semver MATCHES "^([0-9]+(\\.[0-9]+)?(\\.[0-9]+)?)(-([a-zA-Z0-9-]*))?(\\+(.*))?") set(${prefix}_version ${CMAKE_MATCH_1} PARENT_SCOPE) if(CMAKE_MATCH_4) set(${prefix}_version_prerelease "${CMAKE_MATCH_5}" PARENT_SCOPE) endif() if(CMAKE_MATCH_6) set(${prefix}_version_metadata "${CMAKE_MATCH_7}" PARENT_SCOPE) endif() endif() endfunction() function(_get_version_from_git) if(NOT CMAKE_VERSION_GENERATOR_TAG_PREFIX) set(CMAKE_VERSION_GENERATOR_TAG_PREFIX "v") endif() find_package(Git) - if(Git_FOUND) - execute_process( - COMMAND ${GIT_EXECUTABLE} describe - --tags - --abbrev=0 - --match ${CMAKE_VERSION_GENERATOR_TAG_PREFIX}* - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - RESULT_VARIABLE _res - OUTPUT_VARIABLE _out_tag - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_VARIABLE _err_tag) + if(NOT Git_FOUND) + return() + endif() - if(NOT _res EQUAL 0) - return() - endif() + execute_process( + COMMAND ${GIT_EXECUTABLE} describe + --tags + --abbrev=0 + --match ${CMAKE_VERSION_GENERATOR_TAG_PREFIX}* + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE _res + OUTPUT_VARIABLE _out_tag + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE _err_tag) + + if(NOT _res EQUAL 0) + return() + endif() + + string(REGEX REPLACE "^${CMAKE_VERSION_GENERATOR_TAG_PREFIX}(.*)" "\\1" _tag "${_out_tag}") - string(REGEX REPLACE "^${CMAKE_VERSION_GENERATOR_TAG_PREFIX}(.*)" "\\1" _tag "${_out_tag}") + _match_semver("${_tag}" _tag) - _match_semver("${_tag}" _tag) + execute_process( + COMMAND ${GIT_EXECUTABLE} describe + --tags + --dirty + --always + --long + --match ${CMAKE_VERSION_GENERATOR_TAG_PREFIX}* + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE _res + OUTPUT_VARIABLE _out + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(_git_version ${_tag_version} PARENT_SCOPE) + + if(_tag_version_prerelease) + set(_git_version_prerelease ${_tag_version_prerelease} PARENT_SCOPE) + endif() + + # git describe to PEP404 version + set(_version_regex + "^${CMAKE_VERSION_GENERATOR_TAG_PREFIX}${_tag}(-([0-9]+)-(g[0-9a-f]+)(-dirty)?)?$") + + if(_out MATCHES ${_version_regex}) + if(CMAKE_MATCH_1) + if(_tag_version_metadata) + set(_metadata "${_tag_version_metadata}.") + endif() + set(_metadata "${_metadata}${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") + endif() + if(CMAKE_MATCH_4) + set(_metadata "${_metadata}.dirty") + endif() + else() execute_process( - COMMAND ${GIT_EXECUTABLE} describe - --tags - --dirty - --always - --long - --match ${CMAKE_VERSION_GENERATOR_TAG_PREFIX}* + COMMAND ${GIT_EXECUTABLE} rev-list HEAD --count WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} RESULT_VARIABLE _res - OUTPUT_VARIABLE _out + OUTPUT_VARIABLE _out_count OUTPUT_STRIP_TRAILING_WHITESPACE) - set(_git_version ${_tag_version} PARENT_SCOPE) - - if(_tag_version_prerealease) - set(_git_version_prerelease ${_tag_version_prerealease} PARENT_SCOPE) - endif() - - # git describe to PEP404 version - set(_version_regex - "^${CMAKE_VERSION_GENERATOR_TAG_PREFIX}${_tag}(-([0-9]+)-(g[0-9a-f]+)(-dirty)?)?$") - - if(_out MATCHES ${_version_regex}) - if(CMAKE_MATCH_1) - if(_tag_version_metadata) - set(_metadata "${_tag_version_metadata}.") - endif() - set(_metadata "${_metadata}${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") + if(_out MATCHES "^([0-9a-f]+)(-dirty)?$") + set(_metadata "${CMAKE_MATCH_1}") + if(_res EQUAL 0) + set(_metadata "${_out_count}.${_metadata}") endif() - if(CMAKE_MATCH_4) + + if(CMAKE_MATCH_2) set(_metadata "${_metadata}.dirty") endif() - else() - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-list HEAD --count - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - RESULT_VARIABLE _res - OUTPUT_VARIABLE _out_count - OUTPUT_STRIP_TRAILING_WHITESPACE) - - if(_out MATCHES "^([0-9a-f]+)(-dirty)?$") - set(_metadata "${CMAKE_MATCH_1}") - if(_res EQUAL 0) - set(_metadata "${_out_count}.${_metadata}") - endif() - - if(CMAKE_MATCH_2) - set(_metadata "${_metadata}.dirty") - endif() - endif() endif() - set(_git_version_metadata ${_metadata} PARENT_SCOPE) endif() + set(_git_version_metadata ${_metadata} PARENT_SCOPE) + endfunction() function(_get_version_from_file) if(EXISTS ${PROJECT_SOURCE_DIR}/VERSION) file(STRINGS ${PROJECT_SOURCE_DIR}/VERSION _file_version) _match_semver("${_file_version}" "_file") set(_file_version ${_file_version} PARENT_SCOPE) if(_file_version_metadata) set(_file_version_metadata ${_file_version_metadata} PARENT_SCOPE) endif() if(_file_version_prerelease) set(_file_version_prerelease ${_file_version_prerelease} PARENT_SCOPE) endif() endif() endfunction() function(_get_metadata_from_ci) if(NOT DEFINED ENV{CI}) return() endif() if(DEFINED ENV{CI_MERGE_REQUEST_ID}) set(_ci_version_metadata "ci.mr$ENV{CI_MERGE_REQUEST_ID}" PARENT_SCOPE) endif() endfunction() function(define_project_version) string(TOUPPER ${PROJECT_NAME} _project) _get_version_from_git() if(_git_version) set(_version "${_git_version}") if(_git_version_metadata) set(_version_metadata "${_git_version_metadata}") endif() if (_git_version_prerelease) set(_version_prerelease "${_git_version_prerelease}") endif() else() # we can get metadata if and no version if not tag is properly defined if(_git_version_metadata) set(git_version_metadata ".${_git_version_metadata}") endif() _get_version_from_file() if(_file_version_metadata) set(_version_metadata "${_version_metadata}${_git_version_metadata}") endif() if (_file_version) set(_version "${_file_version}") endif() if (_file_version_prerelease) set(_version_prerelease "${_file_version_prerelease}") endif() endif() _get_metadata_from_ci() if(_version) if(_version_prerelease) set(_version_prerelease "-${_version_prerelease}") endif() if(_version_metadata) set(_version_metadata "+${_version_metadata}") if(_ci_version_metadata) set(_version_metadata "${_version_metadata}.${_ci_version_metadata}") endif() endif() set(${_project}_VERSION ${_version} PARENT_SCOPE) set(_semver "${_version}${_version_prerelease}${_version_metadata}") set(${_project}_SEMVER "${_semver}" PARENT_SCOPE) message(STATUS "${PROJECT_NAME} version: ${_semver}") if(_version MATCHES "^([0-9]+)(\\.([0-9]+))?(\\.([0-9]+))?") set(_major_version ${CMAKE_MATCH_1}) set(${_project}_MAJOR_VERSION ${_major_version} PARENT_SCOPE) if(CMAKE_MATCH_2) set(_minor_version ${CMAKE_MATCH_3}) set(${_project}_MINOR_VERSION ${_minor_version} PARENT_SCOPE) endif() if(CMAKE_MATCH_4) set(_patch_version ${CMAKE_MATCH_5}) set(${_project}_PATCH_VERSION ${_patch_version} PARENT_SCOPE) endif() if(_version_prerelease) set(${_project}_PRERELEASE_VERSION ${_version_prerelease} PARENT_SCOPE) endif() if(_version_metadata) set(${_project}_LOCAL_VERSION ${_version_metadata} PARENT_SCOPE) endif() if(_version_metadata MATCHES "(\\+([0-9]+))(\\..*)*") set(${_project}_TWEAK ${CMAKE_MATCH_1} PARENT_SCOPE) endif() endif() else() message(FATAL_ERROR "Could not determine the VERSION for ${PROJECT_NAME}") endif() if(NOT ${_project}_NO_LIBRARY_VERSION) set(${_project}_LIBRARY_PROPERTIES ${${_project}_LIBRARY_PROPERTIES} VERSION "${_version}" SOVERSION "${_major_version}.${_minor_version}" ) endif() endfunction()