diff --git a/.gitattributes b/.gitattributes index e994a8c4f..a42bdded2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ python/akantu/_version.py export-subst +cmake/Modules/CMakeVersionGenerator.cmake export-subst diff --git a/.gitignore b/.gitignore index 4397f7b58..0b944748f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,31 +1,32 @@ 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 +VERSION diff --git a/VERSION b/VERSION deleted file mode 100644 index fcdb2e109..000000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -4.0.0 diff --git a/cmake/Modules/CMakeVersionGenerator.cmake b/cmake/Modules/CMakeVersionGenerator.cmake index bc8521d69..ddf234522 100644 --- a/cmake/Modules/CMakeVersionGenerator.cmake +++ b/cmake/Modules/CMakeVersionGenerator.cmake @@ -1,252 +1,266 @@ #=============================================================================== # @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 . # #=============================================================================== +## Git metadata for version on archive +## GIT DESCRIBE $Format:%(describe:tags=true,match=v*)$ + 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\-]*))?(\\+(.*))?") 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(NOT Git_FOUND) - return() - endif() + 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 _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) - string(REGEX REPLACE "^${CMAKE_VERSION_GENERATOR_TAG_PREFIX}(.*)" "\\1" _tag "${_out_tag}") + if(NOT _res EQUAL 0) + return() + endif() - _match_semver("${_tag}" _tag) + string(REGEX REPLACE "^${CMAKE_VERSION_GENERATOR_TAG_PREFIX}(.*)" "\\1" _tag "${_out_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) + _match_semver("${_tag}" _tag) - set(_git_version ${_tag_version} PARENT_SCOPE) + 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) + else() + file(STRINGS ${CMAKE_CURRENT_LIST_FILE} + _lines + REGEX "GIT DESCRIBE (v(0|[1-9][0-9]*)(.(0|[1-9][0-9]*))?(.(0|[1-9][0-9]*))?)-([0-9]+)-g([0-9a-f]+)(-dirty)?" + ) + + foreach(line ${_lines}) + message("---------- ${_line}") + endforeach() + endif() + 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} 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) 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) + set(_ci_version_metadata ".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 "${_file_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(_ci_version_metadata) + set(_version_metadata "${_version_metadata}${_ci_version_metadata}") + endif() + 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() diff --git a/setup.py b/setup.py index 740d2f777..1aefff70a 100755 --- a/setup.py +++ b/setup.py @@ -1,136 +1,143 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- import sys +import re import os.path import pybind11 as py11 import configparser from setuptools import find_packages from packaging.version import LegacyVersion from skbuild.exceptions import SKBuildError from skbuild.cmaker import get_cmake_version try: from skbuild import setup except ImportError: sys.stderr.write( "Please update pip, you need pip 10 or greater,\n" " or you need to install the PEP 518 requirements in" " pyproject.toml yourself" ) raise # This is needed for versioneer to be importable when building with PEP 517. # See and links # therein for more information. source_folder = os.path.dirname(__file__) sys.path.append(source_folder) parser = configparser.ConfigParser() parser.read("setup.cfg") cmake_args = ["-Dpybind11_DIR:PATH={}".format(py11.get_cmake_dir())] _version = None if ("cmake_config" in parser) and ("akantu_dir" in parser["cmake_config"]): sys.path.append(parser["cmake_config"]["akantu_dir"]) try: import akantu_version _version = akantu_version.get_version() except ImportError: pass -try: - import versioneer - - if not _version: - _version = versioneer.get_version() - setup_kw = { - "version": _version, - "cmdclass": versioneer.get_cmdclass(), - } - cmake_args.append("-DAKANTU_VERSION={}".format(_version)) -except ImportError: - # see https://github.com/warner/python-versioneer/issues/192 - print("WARNING: failed to import versioneer," " falling back to no version for now") - setup_kw = {} - - if "cmake_config" in parser: for k, v in parser["cmake_config"].items(): k = k.upper() cmake_args.append("-D{}:BOOL={}".format(k, v)) akantu_libs = [] if "CI_AKANTU_INSTALL_PREFIX" in os.environ: + ci_akantu_install_prefix = os.environ["CI_AKANTU_INSTALL_PREFIX"] + akantu_dir = os.path.join(ci_akantu_install_prefix, + "lib", "cmake", "Akantu") akantu_libs.extend( [ # paths comming from the manylinux install via gitlab-ci "/softs/view/lib/*", "/softs/view/lib64/*", - os.path.join(os.environ["CI_AKANTU_INSTALL_PREFIX"], "lib64/*"), - os.path.join(os.environ["CI_AKANTU_INSTALL_PREFIX"], "lib/*"), + os.path.join(ci_akantu_install_prefix, "lib64/*"), + os.path.join(ci_akantu_install_prefix, "lib/*"), ] ) cmake_args.extend( [ "-DAKANTU_BYPASS_AKANTU_TARGET:BOOL=ON", - "-DAkantu_DIR:PATH={}".format( - os.path.join( - os.environ["CI_AKANTU_INSTALL_PREFIX"], "lib", "cmake", "Akantu" - ) - ), + "-DAkantu_DIR:PATH={}".format(akantu_dir), ] ) + with open(os.path.join(akantu_dir, 'AkantuConfig.cmake'), 'r') as fh: + version_re = re.compile(r'^set\(AKANTU_VERSION (.*)\)$') + for line in fh: + version_mo = version_re.search(line) + if version_mo: + _version = version_mo.group(1) + break + +try: + import versioneer + + if not _version: + _version = versioneer.get_version() + setup_kw = { + "version": _version, + "cmdclass": versioneer.get_cmdclass(), + } + cmake_args.append("-DAKANTU_VERSION={}".format(_version)) +except ImportError: + # see https://github.com/warner/python-versioneer/issues/192 + print("WARNING: failed to import versioneer," " falling back to no version for now") + setup_kw = {} + # Add CMake as a build requirement if cmake is not installed or is too low a # version setup_requires = [] try: if LegacyVersion(get_cmake_version()) < LegacyVersion("3.4"): setup_requires.append("cmake") except SKBuildError: setup_requires.append("cmake") with open(os.path.join(source_folder, "README.md"), "r") as fh: long_description = fh.read() setup( name="akantu", url="https://akantu.ch", author="Nicolas Richart", author_email="nicolas.richart@epfl.ch", description="Akantu: Swiss-Made Open-Source Finite-Element Library", long_description=long_description, long_description_content_type="text/markdown", platforms="", license="L-GPLv3", license_files=["COPYING", "COPYING.lesser"], project_urls={ "Bug Tracker": "https://github.com/akantu/akantu/issues", }, setup_requires=setup_requires, install_requires=["numpy", "scipy"], package_data={"AkantuLibs": akantu_libs}, packages=find_packages(where="python"), package_dir={"": "python"}, include_package_data=False, cmake_args=cmake_args, cmake_languages=["CXX"], classifiers=[ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: C++", "Programming Language :: Python", "Topic :: Education", "Topic :: Scientific/Engineering", ], **setup_kw ) diff --git a/src/common/aka_config.hh.in b/src/common/aka_config.hh.in index d72744c92..42d53be33 100644 --- a/src/common/aka_config.hh.in +++ b/src/common/aka_config.hh.in @@ -1,96 +1,97 @@ /** * @file aka_config.hh.in * * @author Nicolas Richart * * @date creation: Sun Sep 26 2010 * @date last modification: Thu Jan 25 2018 * * @brief Compilation time configuration of Akantu * * * Copyright (©) 2010-2018 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 . * */ /* -------------------------------------------------------------------------- */ #ifndef AKANTU_AKA_CONFIG_HH_ #define AKANTU_AKA_CONFIG_HH_ // clang-format off #define AKANTU_VERSION_MAJOR @AKANTU_MAJOR_VERSION@ #define AKANTU_VERSION_MINOR @AKANTU_MINOR_VERSION@ #define AKANTU_VERSION_PATCH @AKANTU_PATCH_VERSION@ -#define AKANTU_VERSION_LOCAL "@AKANTU_LOCAL_VERSION@" +#define AKANTU_VERSION_PRERELEASE "@AKANTU_PRERELEASE_VERSION@" #define AKANTU_VERSION (AKANTU_VERSION_MAJOR * 10000 \ + AKANTU_VERSION_MINOR * 100 \ + AKANTU_VERSION_PATCH) +#define AKANTU_VERSION_FULL "@AKANTU_MAJOR_VERSION@.@AKANTU_MINOR_VERSION@.@AKANTU_PATCH_VERSION@@AKANTU_PRERELEASE_VERSION@" @AKANTU_TYPES_EXTRA_INCLUDES@ namespace akantu { using Real = @AKANTU_FLOAT_TYPE@; using Int = @AKANTU_SIGNED_INTEGER_TYPE@; using UInt = @AKANTU_UNSIGNED_INTEGER_TYPE@; } // akantu #define AKANTU_INTEGER_SIZE @AKANTU_INTEGER_SIZE@ #define AKANTU_FLOAT_SIZE @AKANTU_FLOAT_SIZE@ // clang-format on #cmakedefine AKANTU_USE_BLAS #cmakedefine AKANTU_USE_LAPACK #cmakedefine AKANTU_PARALLEL #cmakedefine AKANTU_USE_MPI #cmakedefine AKANTU_USE_SCOTCH #cmakedefine AKANTU_USE_PTSCOTCH #cmakedefine AKANTU_SCOTCH_NO_EXTERN #cmakedefine AKANTU_IMPLICIT #cmakedefine AKANTU_USE_MUMPS #cmakedefine AKANTU_USE_PETSC #cmakedefine AKANTU_USE_PYBIND11 #cmakedefine AKANTU_EXTRA_MATERIALS #cmakedefine AKANTU_STUDENTS_EXTRA_PACKAGE #cmakedefine AKANTU_DAMAGE_NON_LOCAL #cmakedefine AKANTU_SOLID_MECHANICS #cmakedefine AKANTU_STRUCTURAL_MECHANICS #cmakedefine AKANTU_HEAT_TRANSFER #cmakedefine AKANTU_PHASE_FIELD #cmakedefine AKANTU_COHESIVE_ELEMENT #cmakedefine AKANTU_CONTACT_MECHANICS #cmakedefine AKANTU_MODEL_COUPLERS #cmakedefine AKANTU_IGFEM #cmakedefine AKANTU_EMBEDDED // clang-format off // Debug tools //#cmakedefine AKANTU_NDEBUG #cmakedefine AKANTU_DEBUG_TOOLS #cmakedefine READLINK_COMMAND @READLINK_COMMAND@ #cmakedefine ADDR2LINE_COMMAND @ADDR2LINE_COMMAND@ // clang-format on #endif /* AKANTU_AKA_CONFIG_HH_ */