From a7fcfca7312d7d98686fce1b2b23b9b5af161e46 Mon Sep 17 00:00:00 2001 From: Wolfgang Merkt Date: Thu, 29 Aug 2024 15:22:55 +0100 Subject: [PATCH] Rebase from 'upstream' --- .github/workflows/conda/environment_all.yml | 2 +- .pre-commit-config.yaml | 6 +- CHANGELOG.md | 25 ++- CMakeLists.txt | 13 ++ cmake/.pre-commit-config.yaml | 6 +- cmake/base.cmake | 52 ++++-- cmake/coverage.cmake | 7 +- cmake/debian.cmake | 13 +- cmake/dist.cmake | 159 +++++++++++------- cmake/distcheck.cmake | 8 +- cmake/doxygen.cmake | 26 ++- cmake/find-external/CDD/FindCDD.cmake | 2 +- cmake/find-external/CLP/FindCLP.cmake | 2 +- .../CoinUtils/FindCoinUtils.cmake | 2 +- cmake/find-external/glpk/Findglpk.cmake | 5 +- cmake/gtest.cmake | 8 +- cmake/package-config.cmake | 39 ++++- cmake/python-helpers.cmake | 5 +- cmake/python.cmake | 6 + cmake/release.cmake | 71 +++++--- cmake/sdformat.cmake | 8 +- cmake/sphinx.cmake | 18 +- cmake/stubs.cmake | 8 +- cmake/test.cmake | 26 ++- cmake/uninstall.cmake | 13 +- cmake/version.cmake | 1 + doc/Doxyfile.extra.in | 6 +- include/eigenpy/numpy.hpp | 21 ++- package.xml | 2 +- python/CMakeLists.txt | 15 +- python/eigenpy/windows_dll_manager.py | 20 +-- src/numpy.cpp | 4 +- unittest/CMakeLists.txt | 48 +++--- unittest/python/test_user_type.py | 2 +- 34 files changed, 434 insertions(+), 215 deletions(-) diff --git a/.github/workflows/conda/environment_all.yml b/.github/workflows/conda/environment_all.yml index 5d8e21c5..eac1ec0f 100644 --- a/.github/workflows/conda/environment_all.yml +++ b/.github/workflows/conda/environment_all.yml @@ -4,7 +4,7 @@ channels: dependencies: - eigen - cmake - - numpy + - numpy<2.0 - pkg-config - boost - ccache diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e26b620a..7ce0ad3a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,8 +1,10 @@ ci: autoupdate_branch: devel + autofix_prs: false + autoupdate_schedule: quarterly repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.8 + rev: v0.5.7 hooks: - id: ruff args: @@ -20,7 +22,7 @@ repos: hooks: - id: toml-sort-fix - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v18.1.6 + rev: v18.1.8 hooks: - id: clang-format args: diff --git a/CHANGELOG.md b/CHANGELOG.md index b3f2415e..27804e89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +## [3.8.2] - 2024-08-26 + +### Fixed +- Fix function signature on Windows ([#494](https://github.com/stack-of-tasks/eigenpy/pull/494)) + +## [3.8.1] - 2024-08-25 + +### Fixed +- Fix compatibility issue with NumPy 2.x on Windows ([#492](https://github.com/stack-of-tasks/eigenpy/pull/492)) + +## [3.8.0] - 2024-08-14 + +### Added +- Add compatibility with jrl-cmakemodules workspace ([#485](https://github.com/stack-of-tasks/eigenpy/pull/485)) +- Remove support of Python 3.7 ([#490](https://github.com/stack-of-tasks/eigenpy/pull/490)) + +### Fixed +- Remove CMake CMP0167 warnings ([#487](https://github.com/stack-of-tasks/eigenpy/pull/487)) +- Fix compilation error on armhf ([#488](https://github.com/stack-of-tasks/eigenpy/pull/488)) + ## [3.7.0] - 2024-06-11 ### Added @@ -644,7 +664,10 @@ One can now easily expose C++ struct containing Eigen objects in Python avoiding ## [1.0.0] - 2014-07-18 -[Unreleased]: https://github.com/stack-of-tasks/eigenpy/compare/v3.7.0...HEAD +[Unreleased]: https://github.com/stack-of-tasks/eigenpy/compare/v3.8.2...HEAD +[3.8.2]: https://github.com/stack-of-tasks/eigenpy/compare/v3.8.1...v3.8.2 +[3.8.1]: https://github.com/stack-of-tasks/eigenpy/compare/v3.8.0...v3.8.1 +[3.8.0]: https://github.com/stack-of-tasks/eigenpy/compare/v3.7.0...v3.8.0 [3.7.0]: https://github.com/stack-of-tasks/eigenpy/compare/v3.6.0...v3.7.0 [3.6.0]: https://github.com/stack-of-tasks/eigenpy/compare/v3.5.1...v3.6.0 [3.5.1]: https://github.com/stack-of-tasks/eigenpy/compare/v3.5.0...v3.5.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index fa9e1e7b..56864d6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,10 @@ set(PROJECT_USE_CMAKE_EXPORT TRUE) set(PROJECT_USE_KEYWORD_LINK_LIBRARIES TRUE) set(PROJECT_CUSTOM_HEADER_EXTENSION "hpp") set(PROJECT_COMPATIBILITY_VERSION AnyNewerVersion) +# To enable jrl-cmakemodules compatibility with workspace we must define the two +# following lines +set(PROJECT_AUTO_RUN_FINALIZE FALSE) +set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}) # Check if the submodule cmake have been initialized set(JRL_CMAKE_MODULES "${CMAKE_CURRENT_LIST_DIR}/cmake") @@ -64,6 +68,11 @@ option(SUFFIX_SO_VERSION "Suffix library name with its version" OFF) option(BUILD_TESTING_SCIPY "Build the SciPy tests (scipy should be installed on the machine)" ON) +# Use BoostConfig module distributed by boost library instead of using FindBoost +# module distributed by CMake +if(POLICY CMP0167) + cmake_policy(SET CMP0167 NEW) +endif() include("${JRL_CMAKE_MODULES}/base.cmake") compute_project_args(PROJECT_ARGS LANGUAGES CXX) project(${PROJECT_NAME} ${PROJECT_ARGS}) @@ -344,10 +353,12 @@ set(${PROJECT_NAME}_SOURCES add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS}) +add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) set_standard_output_directory(${PROJECT_NAME}) target_include_directories( ${PROJECT_NAME} SYSTEM PUBLIC $ + $ $) modernize_target_link_libraries( @@ -450,3 +461,5 @@ pkg_config_append_libs(${PROJECT_NAME}) pkg_config_append_cflags("-I${PYTHON_INCLUDE_DIRS}") pkg_config_append_cflags("-I${NUMPY_INCLUDE_DIRS}") pkg_config_append_boost_libs(${BOOST_COMPONENTS}) + +setup_project_finalize() diff --git a/cmake/.pre-commit-config.yaml b/cmake/.pre-commit-config.yaml index e78ef24c..72f09819 100644 --- a/cmake/.pre-commit-config.yaml +++ b/cmake/.pre-commit-config.yaml @@ -2,7 +2,7 @@ ci: autoupdate_schedule: quarterly repos: - repo: https://github.com/PyCQA/flake8 - rev: 7.0.0 + rev: 7.1.0 hooks: - id: flake8 exclude: | @@ -22,7 +22,7 @@ repos: GNUInstallDirs\.cmake )$ - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v18.1.3 + rev: v18.1.8 hooks: - id: clang-format args: @@ -43,7 +43,7 @@ repos: - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/psf/black - rev: 24.4.0 + rev: 24.4.2 hooks: - id: black exclude: | diff --git a/cmake/base.cmake b/cmake/base.cmake index f53544ff..235d51d5 100644 --- a/cmake/base.cmake +++ b/cmake/base.cmake @@ -115,6 +115,26 @@ # https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html#generating-a-package-version-file # for further details. # +# .. variable:: PROJECT_AUTO_RUN_FINALIZE +# +# If set, to true or unset SETUP_PROJECT_FINALIZE run automatically at the end +# of the root CMakeLists.txt. If set to false, SETUP_PROJECT_FINALIZE must be +# called manually. This is helpful when creating a CMake workspace where the +# root CMakelists.txt don't belong to a project. +# +# .. variable:: PROJECT_PACKAGES_IN_WORKSPACE +# +# List of packages in the workspace. This must be defined in the root +# CMakeLists. These packages will not be searched with find_package and all +# target and variables defined in the module should be defined in a workspace +# projects. +# +# .. variable:: PROJECT_PYTHON_PACKAGES_IN_WORKSPACE +# +# List of paths to Python package in the workspace. This must be defined in the +# root CMakeLists.txt. Python package should be generated in a workspace +# projects. +# # Macros # ------ # @@ -134,6 +154,10 @@ set(PROJECT_JRL_CMAKE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE INTERNAL "") +if(NOT DEFINED PROJECT_AUTO_RUN_FINALIZE) + set(PROJECT_AUTO_RUN_FINALIZE TRUE) +endif() + # Please note that functions starting with an underscore are internal functions # and should not be used directly. @@ -218,20 +242,19 @@ set(CMAKE_PROJECT_${PROJECT_NAME}_INCLUDE # Set a hook to finalize the setup, CMake will set CMAKE_CURRENT_LIST_DIR to "" # at the end Based off # https://stackoverflow.com/questions/15760580/execute-command-or-macro-in-cmake-as-the-last-step-before-the-configure-step-f -variable_watch(CMAKE_CURRENT_LIST_DIR SETUP_PROJECT_FINALIZE_HOOK) -function(SETUP_PROJECT_FINALIZE_HOOK VARIABLE ACCESS) - if("${${VARIABLE}}" STREQUAL "") - set(CMAKE_CURRENT_LIST_DIR ${PROJECT_JRL_CMAKE_MODULE_DIR}) - set(JRL_CMAKEMODULE_LOGGING_FILENAME - "${PROJECT_JRL_CMAKE_BINARY_DIR}/config.log") - setup_project_finalize() - if(PROJECT_USE_CMAKE_EXPORT) - setup_project_package_finalize() +if(PROJECT_AUTO_RUN_FINALIZE) + variable_watch(CMAKE_CURRENT_LIST_DIR SETUP_PROJECT_FINALIZE_HOOK) + function(SETUP_PROJECT_FINALIZE_HOOK VARIABLE ACCESS) + if("${${VARIABLE}}" STREQUAL "") + set(CMAKE_CURRENT_LIST_DIR ${PROJECT_JRL_CMAKE_MODULE_DIR}) + set(JRL_CMAKEMODULE_LOGGING_FILENAME + "${PROJECT_JRL_CMAKE_BINARY_DIR}/config.log") + setup_project_finalize() + set(CMAKE_CURRENT_LIST_DIR "") # restore value + set(JRL_CMAKEMODULE_LOGGING_FILENAME "") # restore value endif() - set(CMAKE_CURRENT_LIST_DIR "") # restore value - set(JRL_CMAKEMODULE_LOGGING_FILENAME "") # restore value - endif() -endfunction() + endfunction() +endif() # --------------------- # Project configuration # --------------------- # @@ -332,6 +355,9 @@ macro(SETUP_PROJECT_FINALIZE) _install_project_data() logging_finalize() + if(PROJECT_USE_CMAKE_EXPORT) + setup_project_package_finalize() + endif() endmacro(SETUP_PROJECT_FINALIZE) # .rst: .. ifmode:: user diff --git a/cmake/coverage.cmake b/cmake/coverage.cmake index da4c989a..55f971ed 100644 --- a/cmake/coverage.cmake +++ b/cmake/coverage.cmake @@ -84,11 +84,16 @@ macro(_SETUP_COVERAGE_FINALIZE) message(STATUS "Python coverage will be generated") endif() + if(NOT TARGET coverage) + add_custom_target(coverage + COMMENT "Generating HTML report for code coverage") + endif() add_custom_target( - coverage + ${PROJECT_NAME}-coverage COMMAND ${_COVERAGE_HTML} -o ${_COVERAGE_DIR} ${_COVERAGE_FILES} DEPENDS ${_COVERAGE_FILES} BYPRODUCTS ${_COVERAGE_DIR} COMMENT "Generating HTML report for code coverage") + add_dependencies(coverage ${PROJECT_NAME}-coverage) endif() endmacro() diff --git a/cmake/debian.cmake b/cmake/debian.cmake index 6d3c89d0..a428a017 100644 --- a/cmake/debian.cmake +++ b/cmake/debian.cmake @@ -102,16 +102,25 @@ endmacro(_SETUP_DEBIAN) macro(_SETUP_PROJECT_DEB) if(UNIX AND NOT APPLE) + if(NOT TARGET deb-src) + add_custom_target(deb-src COMMENT "Generating source Debian package...") + endif() add_custom_target( - deb-src + ${PROJECT_NAME}-deb-src COMMAND git-buildpackage --git-debian-branch=debian WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generating source Debian package...") + add_dependencies(deb-src ${PROJECT_NAME}-deb-src) + + if(NOT TARGET deb) + add_custom_target(deb COMMENT "Generating Debian package...") + endif() add_custom_target( - deb + ${PROJECT_NAME}-deb COMMAND git-buildpackage --git-debian-branch=debian --git-builder="debuild -S -i.git -I.git" WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generating Debian package...") + add_dependencies(deb ${PROJECT_NAME}-deb) endif(UNIX AND NOT APPLE) endmacro(_SETUP_PROJECT_DEB) diff --git a/cmake/dist.cmake b/cmake/dist.cmake index e12a13e2..0099a3e0 100644 --- a/cmake/dist.cmake +++ b/cmake/dist.cmake @@ -35,97 +35,134 @@ macro(_SETUP_PROJECT_DIST) endif(APPLE) # Use git-archive-all.sh to generate distributable source code + if(NOT TARGET distdir) + add_custom_target(distdir COMMENT "Generating dist directory...") + endif() add_custom_target( - distdir + ${PROJECT_NAME}-distdir COMMAND - rm -f /tmp/${PROJECT_NAME}.tar && ${GIT_ARCHIVE_ALL} --prefix - ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ ${PROJECT_NAME}.tar - && cd ${CMAKE_BINARY_DIR}/ && - (test - -d - ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION} - && - find - ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ - -type - d - -print0 - | - xargs - -0 - chmod - a+w - || - true) && rm -rf ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && - ${TAR} xf ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.tar && echo - "${PROJECT_VERSION}" > - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/.version - && ${PROJECT_JRL_CMAKE_MODULE_DIR}/gitlog-to-changelog > - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ChangeLog - && rm -f ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.tar + # cmake-format: off + rm -f /tmp/${PROJECT_NAME}.tar && + ${GIT_ARCHIVE_ALL} --prefix ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ + ${PROJECT_NAME}.tar && + cd ${PROJECT_BINARY_DIR}/ && + ( + test -d ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION} && + find ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ -type d -print0 | + xargs -0 chmod a+w || true + ) && + rm -rf ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && + ${TAR} xf ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.tar && + echo "${PROJECT_VERSION}" > + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/.version && + ${PROJECT_JRL_CMAKE_MODULE_DIR}/gitlog-to-changelog --srcdir ${PROJECT_SOURCE_DIR} > + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ChangeLog && + rm -f ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.tar + # cmake-format: on WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Generating dist directory...") + COMMENT "Generating dist directory for ${PROJECT_NAME}...") + add_dependencies(distdir ${PROJECT_NAME}-distdir) # Create a tar.gz tarball for the project, and generate the signature + if(NOT TARGET dist_targz) + add_custom_target( + dist_targz COMMENT "Generating tar.gz tarball and its signature...") + endif() add_custom_target( - dist_targz + ${PROJECT_NAME}-dist_targz COMMAND + # cmake-format: off ${TAR} -czf ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.gz - ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && ${GPG} - --detach-sign --armor -o - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.gz.sig - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Generating tar.gz tarball and its signature...") + ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && + ${GPG} --detach-sign --armor -o + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.gz.sig + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.gz + # cmake-format: on + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + COMMENT + "Generating tar.gz tarball and its signature for ${PROJECT_NAME}...") + add_dependencies(dist_targz ${PROJECT_NAME}-dist_targz) # Create a tar.bz2 tarball for the project, and generate the signature + if(NOT TARGET dist_tarbz2) + add_custom_target( + dist_tarbz2 COMMENT "Generating tar.bz2 tarball and its signature...") + endif() add_custom_target( - dist_tarbz2 + ${PROJECT_NAME}-dist_tarbz2 COMMAND + # cmake-format: off ${TAR} -cjf ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.bz2 - ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && ${GPG} - --detach-sign --armor -o - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.bz2.sig - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.bz2 - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Generating tar.bz2 tarball and its signature...") + ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && + ${GPG} --detach-sign --armor -o + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.bz2.sig + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.bz2 + # cmake-format: on + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + COMMENT + "Generating tar.bz2 tarball and its signature for ${PROJECT_NAME}...") + add_dependencies(dist_tarbz2 ${PROJECT_NAME}-dist_tarbz2) # Create a tar.xz tarball for the project, and generate the signature + if(NOT TARGET dist_tarxz) + add_custom_target( + dist_tarxz COMMENT "Generating tar.xz tarball and its signature...") + endif() add_custom_target( - dist_tarxz + ${PROJECT_NAME}-dist_tarxz COMMAND + # cmake-format: off ${TAR} -cJf ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.xz - ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && ${GPG} - --detach-sign --armor -o - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.xz.sig - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.xz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Generating tar.xz tarball and its signature...") + ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ && + ${GPG} --detach-sign --armor -o + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.xz.sig + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.xz + # cmake-format: on + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + COMMENT + "Generating tar.xz tarball and its signature for ${PROJECT_NAME}...") + add_dependencies(dist_tarxz ${PROJECT_NAME}-dist_tarxz) # Alias: dist = dist_targz (backward compatibility) - add_custom_target(dist DEPENDS dist_targz) + if(NOT TARGET dist) + add_custom_target(dist) + endif() + add_custom_target(${PROJECT_NAME}-dist DEPENDS ${PROJECT_NAME}-dist_targz) + add_dependencies(dist ${PROJECT_NAME}-dist) # TODO: call this during `make clean` + if(NOT TARGET distclean) + add_custom_target(distclean COMMENT "Cleaning dist sources...") + endif() add_custom_target( - distclean + ${PROJECT_NAME}-distclean COMMAND + # cmake-format: off rm -rf - ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Cleaning dist sources...") + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}/ + # cmake-format: on + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + COMMENT "Cleaning dist sources for ${PROJECT_NAME}...") + add_dependencies(distclean ${PROJECT_NAME}-distclean) + if(NOT TARGET distorig) + add_custom_target(distorig COMMENT "Generating orig tarball...") + endif() add_custom_target( - distorig + ${PROJECT_NAME}-distorig COMMAND + # cmake-format: off cmake -E copy ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.tar.gz - ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.orig.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Generating orig tarball...") + ${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}.orig.tar.gz + # cmake-format: on + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + COMMENT "Generating orig tarball for ${PROJECT_NAME}...") + add_dependencies(distorig ${PROJECT_NAME}-distorig) - add_dependencies(dist_targz distdir) - add_dependencies(dist_tarbz2 distdir) - add_dependencies(dist_tarxz distdir) - add_dependencies(distorig dist) + add_dependencies(${PROJECT_NAME}-dist_targz ${PROJECT_NAME}-distdir) + add_dependencies(${PROJECT_NAME}-dist_tarbz2 ${PROJECT_NAME}-distdir) + add_dependencies(${PROJECT_NAME}-dist_tarxz ${PROJECT_NAME}-distdir) + add_dependencies(${PROJECT_NAME}-distorig ${PROJECT_NAME}-dist) else() # FIXME: what to do here? endif() diff --git a/cmake/distcheck.cmake b/cmake/distcheck.cmake index c2e60cc3..ba9a2c0d 100644 --- a/cmake/distcheck.cmake +++ b/cmake/distcheck.cmake @@ -63,8 +63,11 @@ macro(DISTCHECK_SETUP) string(REPLACE "${CMAKE_SOURCE_DIR}" "${SRCDIR}" NEW_CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}") + if(NOT TARGET distcheck) + add_custom_target(distcheck COMMENT "Checking generated tarball...") + endif() add_custom_target( - distcheck + ${PROJECT_NAME}-distcheck COMMAND export LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} && export ${LD_LIBRARY_PATH_VARIABLE_NAME}=$ENV{${LD_LIBRARY_PATH_VARIABLE_NAME}} @@ -129,7 +132,8 @@ macro(DISTCHECK_SETUP) WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION} COMMENT "Checking generated tarball...") - add_dependencies(distcheck distdir) + add_dependencies(distcheck ${PROJECT_NAME}-distcheck) + add_dependencies(${PROJECT_NAME}-distcheck ${PROJECT_NAME}-distdir) unset(NEW_CMAKE_BINARY_DIR) unset(SRCDIR) diff --git a/cmake/doxygen.cmake b/cmake/doxygen.cmake index 7c7e1cf0..cebab782 100644 --- a/cmake/doxygen.cmake +++ b/cmake/doxygen.cmake @@ -521,26 +521,39 @@ macro(_SETUP_PROJECT_DOCUMENTATION) if(MSVC) # FIXME: it is impossible to trigger documentation installation at # install, so put the target in ALL instead. + if(NOT TARGET doc) + add_custom_target(doc ALL COMMENT "Generating Doxygen documentation") + endif() add_custom_target( - doc ALL + ${PROJECT_NAME}-doc COMMAND ${DOXYGEN_EXECUTABLE} ${JRL_CMAKEMODULE_DOXYFILE_PATH} WORKING_DIRECTORY doc COMMENT "Generating Doxygen documentation") else(MSVC) + if(NOT TARGET doc) + add_custom_target(doc COMMENT "Generating Doxygen documentation") + endif() + add_custom_target( - doc + ${PROJECT_NAME}-doc COMMAND ${DOXYGEN_EXECUTABLE} ${JRL_CMAKEMODULE_DOXYFILE_PATH} WORKING_DIRECTORY doc COMMENT "Generating Doxygen documentation") if(INSTALL_DOCUMENTATION) - install(CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_MAKE_PROGRAM} doc)") + install( + CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_MAKE_PROGRAM} ${PROJECT_NAME}-doc)" + ) endif(INSTALL_DOCUMENTATION) endif(MSVC) + add_dependencies(doc ${PROJECT_NAME}-doc) if(DOXYGEN_USE_TEMPLATE_CSS) + if(NOT TARGET generate-template-css) + add_custom_target(generate-template-css) + endif() add_custom_target( - generate-template-css + ${PROJECT_NAME}-generate-template-css COMMAND ${DOXYGEN_EXECUTABLE} -w html ${PROJECT_BINARY_DIR}/doc/header.html ${PROJECT_BINARY_DIR}/doc/footer.html @@ -548,7 +561,10 @@ macro(_SETUP_PROJECT_DOCUMENTATION) BYPRODUCTS ${PROJECT_BINARY_DIR}/doc/header.html ${PROJECT_BINARY_DIR}/doc/footer.html ${PROJECT_BINARY_DIR}/doc/doxygen.css) - add_dependencies(doc generate-template-css) + add_dependencies(generate-template-css + ${PROJECT_NAME}-generate-template-css) + add_dependencies(${PROJECT_NAME}-doc + ${PROJECT_NAME}-generate-template-css) _set_if_undefined(DOXYGEN_HTML_HEADER "${PROJECT_BINARY_DIR}/doc/header.html") _set_if_undefined(DOXYGEN_HTML_FOOTER diff --git a/cmake/find-external/CDD/FindCDD.cmake b/cmake/find-external/CDD/FindCDD.cmake index 688720f6..53804713 100644 --- a/cmake/find-external/CDD/FindCDD.cmake +++ b/cmake/find-external/CDD/FindCDD.cmake @@ -29,7 +29,7 @@ find_path( PATH_SUFFIXES include/cdd include/cddlib) find_library( CDD_LIBRARY - NAMES libcdd.so + NAMES cdd PATHS ${CDD_PREFIX}) set(CDD_LIBRARIES ${CDD_LIBRARY}) diff --git a/cmake/find-external/CLP/FindCLP.cmake b/cmake/find-external/CLP/FindCLP.cmake index 02d5f1a2..2daee5cd 100644 --- a/cmake/find-external/CLP/FindCLP.cmake +++ b/cmake/find-external/CLP/FindCLP.cmake @@ -28,7 +28,7 @@ find_path( PATHS ${CLP_PREFIX}) find_library( CLP_LIBRARY - NAMES libclp.so libClp.so + NAMES clp Clp PATHS ${CLP_PREFIX}) set(CLP_LIBRARIES ${CLP_LIBRARY}) diff --git a/cmake/find-external/CoinUtils/FindCoinUtils.cmake b/cmake/find-external/CoinUtils/FindCoinUtils.cmake index c9a2d511..154364ee 100644 --- a/cmake/find-external/CoinUtils/FindCoinUtils.cmake +++ b/cmake/find-external/CoinUtils/FindCoinUtils.cmake @@ -29,7 +29,7 @@ find_path( PATHS ${CoinUtils_PREFIX}) find_library( CoinUtils_LIBRARY - NAMES libCoinUtils.so + NAMES CoinUtils PATHS ${CoinUtils_PREFIX}) set(CoinUtils_LIBRARIES ${CoinUtils_LIBRARY}) diff --git a/cmake/find-external/glpk/Findglpk.cmake b/cmake/find-external/glpk/Findglpk.cmake index 4a793428..3ab895b6 100644 --- a/cmake/find-external/glpk/Findglpk.cmake +++ b/cmake/find-external/glpk/Findglpk.cmake @@ -28,9 +28,8 @@ find_path( PATHS ${glpk_PREFIX}) find_library( glpk_LIBRARY - NAMES libglpk.so - PATHS ${glpk_PREFIX} - PATH_SUFFIXES include/glpk) + NAMES glpk + PATHS ${glpk_PREFIX}) set(glpk_LIBRARIES ${glpk_LIBRARY}) set(glpk_INCLUDE_DIRS ${glpk_INCLUDE_DIR}) diff --git a/cmake/gtest.cmake b/cmake/gtest.cmake index 68de398d..0ddba6ee 100644 --- a/cmake/gtest.cmake +++ b/cmake/gtest.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2018 INRIA +# Copyright (C) 2018-2024 INRIA # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software @@ -20,15 +20,15 @@ set(CURRENT_FILE_PATH # .rst: .. command:: ADD_GTEST_SUITE([GIT_TAG]) # # GIT_TAG: the git tag of gtest. This optional argument allows to use a precise -# version of gtest (not necessarily the last master branch). +# version of gtest (not necessarily the last main branch). # # Download and configure gtest. This macro follows the -# https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project +# https://github.com/google/googletest/tree/main/googletest#incorporating-into-an-existing-cmake-project # instructions. # macro(ADD_GTEST_SUITE) # Handle optional argument - set(GTEST_GIT_TAG "master") + set(GTEST_GIT_TAG "main") set(extra_macro_args ${ARGN}) list(LENGTH extra_macro_args num_extra_args) if(${num_extra_args} GREATER 0) diff --git a/cmake/package-config.cmake b/cmake/package-config.cmake index 7d8e8da4..7f664c4c 100644 --- a/cmake/package-config.cmake +++ b/cmake/package-config.cmake @@ -57,11 +57,19 @@ macro(_SETUP_PROJECT_PACKAGE_INIT) CACHE INTERNAL "") endmacro(_SETUP_PROJECT_PACKAGE_INIT) -# .rst: .. command:: ADD_PROJECT_DEPENDENCY(ARGS [PKG_CONFIG_REQUIRES pkg] -# [FOR_COMPONENT component] [FIND_EXTERNAL pkg]) +# .rst: +# ~~~ +# .. command:: ADD_PROJECT_DEPENDENCY(ARGS +# [PKG_CONFIG_REQUIRES pkg] +# [FOR_COMPONENT component] +# [FIND_EXTERNAL pkg]) +# ~~~ # # This is a wrapper around find_package to add correct find_dependency calls in -# the generated config script. All arguments are passed to find_package. +# the generated config script. +# +# Packages not in the PROJECT_PACKAGES_IN_WORKSPACE are searched with +# find_package. # # In cases where find_package is not supported by a project, or only in recent # versions, one should provide a custom Config.cmake or use a more @@ -110,7 +118,10 @@ macro(ADD_PROJECT_DEPENDENCY) _add_to_list_if_not_present( _PACKAGE_CONFIG${component}_DEPENDENCIES_FIND_DEPENDENCY "find_dependency(${PACKAGE_ARGS})") - find_package(${PARSED_ARGN_UNPARSED_ARGUMENTS}) + list(GET PARSED_ARGN_UNPARSED_ARGUMENTS 0 _package_name) + if(NOT ${_package_name} IN_LIST PROJECT_PACKAGES_IN_WORKSPACE) + find_package(${PARSED_ARGN_UNPARSED_ARGUMENTS}) + endif() # Propagate variables changes to the cached values set(_PACKAGE_CONFIG${component}_DEPENDENCIES_PROJECTS @@ -124,6 +135,23 @@ macro(ADD_PROJECT_DEPENDENCY) CACHE INTERNAL "") endmacro() +# .rst: +# ~~~ +# .. command:: ADD_PROJECT_PRIVATE_DEPENDENCY() +# ~~~ +# +# This is a wrapper around find_package. +# +# Packages not in the PROJECT_PACKAGES_IN_WORKSPACE are searched with +# find_package. +macro(ADD_PROJECT_PRIVATE_DEPENDENCY) + set(ALL_ARGUMENTS ${ARGN}) + list(GET ALL_ARGUMENTS 0 _package_name) + if(NOT ${_package_name} IN_LIST PROJECT_PACKAGES_IN_WORKSPACE) + find_package(${ALL_ARGUMENTS}) + endif() +endmacro() + # SETUP_PROJECT_PACKAGE_FINALIZE # ------------- # @@ -265,7 +293,8 @@ macro(PROJECT_INSTALL_COMPONENT COMPONENT) "${_PACKAGE_CONFIG_${COMPONENT}_DEPENDENCIES_FIND_PACKAGE}") string(REPLACE ";" "\n " COMPONENT_FIND_DEPENDENCY "${_PACKAGE_CONFIG_${COMPONENT}_DEPENDENCIES_FIND_DEPENDENCY}") - set(COMPONENT_CONFIG "${CMAKE_BINARY_DIR}/generated/${COMPONENT}Config.cmake") + set(COMPONENT_CONFIG + "${PROJECT_BINARY_DIR}/generated/${COMPONENT}Config.cmake") set(COMPONENT_EXTRA_MACRO "${PARSED_ARGN_EXTRA_MACRO}") include(CMakePackageConfigHelpers) configure_package_config_file( diff --git a/cmake/python-helpers.cmake b/cmake/python-helpers.cmake index bf812483..16c7351a 100644 --- a/cmake/python-helpers.cmake +++ b/cmake/python-helpers.cmake @@ -39,8 +39,9 @@ endmacro() # function(PYTHON_BUILD_GET_TARGET python_build_target) # Regex from IsValidTargetName in CMake/Source/cmGeneratorExpression.cxx - string(REGEX REPLACE "[^A-Za-z0-9_.+-]" "_" compile_pyc - "compile_pyc_${CMAKE_CURRENT_SOURCE_DIR}") + string(REGEX + REPLACE "[^A-Za-z0-9_.+-]" "_" compile_pyc + "${PROJECT_NAME}_compile_pyc_${CMAKE_CURRENT_SOURCE_DIR}") if(NOT TARGET ${compile_pyc}) add_custom_target(${compile_pyc} ALL) diff --git a/cmake/python.cmake b/cmake/python.cmake index 99d8fff2..b4a6e14e 100644 --- a/cmake/python.cmake +++ b/cmake/python.cmake @@ -165,8 +165,14 @@ macro(FINDPYTHON) set(Python${_PYTHON_VERSION_MAJOR}_EXECUTABLE ${PYTHON_EXECUTABLE}) set(Python${_PYTHON_VERSION_MAJOR}_INCLUDE_DIR ${PYTHON_INCLUDE_DIR}) + if(SEARCH_FOR_NUMPY) + find_numpy() + set(Python_NumPy_INCLUDE_DIR ${NUMPY_INCLUDE_DIRS}) + endif() + find_package("Python${_PYTHON_VERSION_MAJOR}" REQUIRED COMPONENTS ${PYTHON_COMPONENTS}) + else() # No hint was provided. We can then check for first Python 2, then Python # 3 diff --git a/cmake/release.cmake b/cmake/release.cmake index d0171edf..6214742b 100644 --- a/cmake/release.cmake +++ b/cmake/release.cmake @@ -58,20 +58,27 @@ macro(RELEASE_SETUP) set(LD_LIBRARY_PATH_VARIABLE_NAME "LD_LIBRARY_PATH") endif(APPLE) + if(NOT TARGET release_package_xml) + add_custom_target(release_package_xml COMMENT "Update package.xml") + endif() add_custom_target( - release_package_xml + ${PROJECT_NAME}-release_package_xml WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Update package.xml" + COMMENT "Update package.xml for ${PROJECT_NAME}" COMMAND sed -i.back \"s|.*|$$VERSION|g\" package.xml && rm package.xml.back && ${GIT} add package.xml && ${GIT} commit -m "release: Update package.xml version to $$VERSION" && echo "Updated package.xml and committed") + add_dependencies(release_package_xml ${PROJECT_NAME}-release_package_xml) + if(NOT TARGET release_pyproject_toml) + add_custom_target(release_pyproject_toml COMMENT "Update pyproject.toml") + endif() add_custom_target( - release_pyproject_toml + ${PROJECT_NAME}-release_pyproject_toml WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Update pyproject.toml" + COMMENT "Update pyproject.toml for ${PROJECT_NAME}" COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_JRL_CMAKE_MODULE_DIR}/pyproject.py $$VERSION && if ! (git diff --quiet pyproject.toml) ; then @@ -86,11 +93,16 @@ macro(RELEASE_SETUP) && echo "Updated pyproject.toml and committed") ; fi) + add_dependencies(release_pyproject_toml + ${PROJECT_NAME}-release_pyproject_toml) + if(NOT TARGET release_changelog) + add_custom_target(release_changelog COMMENT "Update CHANGELOG.md") + endif() add_custom_target( - release_changelog + ${PROJECT_NAME}-release_changelog WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Update CHANGELOG.md" + COMMENT "Update CHANGELOG.md for ${PROJECT_NAME}" COMMAND sed -i.back "\"s|\#\# \\[Unreleased\\]|\#\# [Unreleased]\\n\\n\#\# [$$VERSION] - ${TODAY}|\"" @@ -108,11 +120,15 @@ macro(RELEASE_SETUP) && echo "Updated CHANGELOG.md and committed") ; fi) + add_dependencies(release_changelog ${PROJECT_NAME}-release_changelog) + if(NOT TARGET release_pixi_toml) + add_custom_target(release_pixi_toml COMMENT "Update pixi.toml") + endif() add_custom_target( - release_pixi_toml + ${PROJECT_NAME}-release_pixi_toml WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Update pixi.toml" + COMMENT "Update pixi.toml for ${PROJECT_NAME}" COMMAND # cmake-format: off ${PYTHON_EXECUTABLE} ${PROJECT_JRL_CMAKE_MODULE_DIR}/pixi.py $$VERSION && @@ -124,23 +140,31 @@ macro(RELEASE_SETUP) ) ; fi # cmake-format: on ) + add_dependencies(release_pixi_toml ${PROJECT_NAME}-release_pixi_toml) + if(NOT TARGET release_citation_cff) + add_custom_target(release_citation_cff COMMENT "Update CITATION.cff") + endif() add_custom_target( - release_citation_cff + ${PROJECT_NAME}-release_citation_cff WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Update CITATION.cff" + COMMENT "Update CITATION.cff for ${PROJECT_NAME}" COMMAND sed -i.back "\"s|^version:.*|version: $$VERSION|;s|^date-released:.*|date-released: \\\"${TODAY}\\\"|\"" CITATION.cff && rm CITATION.cff.back && ${GIT} add CITATION.cff && ${GIT} commit -m "release: Update CITATION.cff version to $$VERSION" && echo "Updated CITATION.cff and committed") + add_dependencies(release_citation_cff ${PROJECT_NAME}-release_citation_cff) - set(BUILD_CMD ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target) + set(BUILD_CMD ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR} --target) + if(NOT TARGET release) + add_custom_target(release COMMENT "Create a new release") + endif() add_custom_target( - release + ${PROJECT_NAME}-release WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Create a new release" + COMMENT "Create a new release for ${PROJECT_NAME}" COMMAND # cmake-format: off export LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} && @@ -148,31 +172,32 @@ macro(RELEASE_SETUP) export PYTHONPATH=$ENV{PYTHONPATH} && ! test x$$VERSION = x || (echo "Please set a version for this release" && false) && # Update version in package.xml if it exists - if [ -f "package.xml" ]; then (${BUILD_CMD} release_package_xml) ; fi && + if [ -f "package.xml" ]; then (${BUILD_CMD} ${PROJECT_NAME}-release_package_xml) ; fi && # Update version in pyproject.toml if it exists - if [ -f "pyproject.toml" ]; then (${BUILD_CMD} release_pyproject_toml) ; fi && + if [ -f "pyproject.toml" ]; then (${BUILD_CMD} ${PROJECT_NAME}-release_pyproject_toml) ; fi && # Update CHANGELOG.md if it exists - if [ -f "CHANGELOG.md" ]; then (${BUILD_CMD} release_changelog) ; fi && + if [ -f "CHANGELOG.md" ]; then (${BUILD_CMD} ${PROJECT_NAME}-release_changelog) ; fi && # Update version in pixi.toml if it exists - if [ -f "pixi.toml" ]; then (${BUILD_CMD} release_pixi_toml) ; fi && + if [ -f "pixi.toml" ]; then (${BUILD_CMD} ${PROJECT_NAME}-release_pixi_toml) ; fi && # Update date and version in CITATION.cff if it exists - if [ -f "CITATION.cff" ]; then (${BUILD_CMD} release_citation_cff) ; fi && + if [ -f "CITATION.cff" ]; then (${BUILD_CMD} ${PROJECT_NAME}-release_citation_cff) ; fi && ${GIT} tag -s v$$VERSION -m "Release of version $$VERSION." && - cd ${CMAKE_BINARY_DIR} && + cd ${PROJECT_BINARY_DIR} && cmake ${PROJECT_SOURCE_DIR} && - ${BUILD_CMD} distcheck || + ${BUILD_CMD} ${PROJECT_NAME}-distcheck || ( echo "Please fix distcheck first." && cd ${PROJECT_SOURCE_DIR} && ${GIT} tag -d v$$VERSION && - cd ${CMAKE_BINARY_DIR} && + cd ${PROJECT_BINARY_DIR} && cmake ${PROJECT_SOURCE_DIR} && false ) && - ${BUILD_CMD} dist && - ${BUILD_CMD} distclean && + ${BUILD_CMD} ${PROJECT_NAME}-dist && + ${BUILD_CMD} ${PROJECT_NAME}-distclean && echo "Please, run 'git push --tags' and upload the tarball to github to finalize this release." # cmake-format: on ) + add_dependencies(release ${PROJECT_NAME}-release) endif() endmacro() diff --git a/cmake/sdformat.cmake b/cmake/sdformat.cmake index 33a3b997..15402e22 100644 --- a/cmake/sdformat.cmake +++ b/cmake/sdformat.cmake @@ -1,17 +1,17 @@ # -# Copyright 2021 INRIA +# Copyright 2021-2024 INRIA # # Author: Rohan Budhiraja # # SEARCH_FOR_SDFORMAT # ---------------------------------- -# Try to quietly find SDFormat, and when found, add dependency. REQUIRED -# (Optional): if REQUIRED is given as argument, and SDFormat is not found, +# Try to quietly find SDFormat, and when found, add the dependency. REQUIRED +# (Optional): if REQUIRED is given as an argument, and SDFormat is not found, # FATAL_ERROR is generated. # macro(SEARCH_FOR_SDFORMAT) - set(SDF_VERSIONS "12" "11" "10" "9") + set(SDF_VERSIONS "14" "13" "12" "11" "10" "9") list(APPEND SDF_VERSIONS "") set(P_REQUIRED False) set(variadic_args ${ARGN}) diff --git a/cmake/sphinx.cmake b/cmake/sphinx.cmake index 620fecf5..52337b17 100644 --- a/cmake/sphinx.cmake +++ b/cmake/sphinx.cmake @@ -39,11 +39,15 @@ macro(SPHINX_SETUP) WARNING "Failed to find sphinx, documentation will not be generated.") else(NOT SPHINX_BUILD) + if(NOT TARGET sphinx-doc) + add_custom_target(sphinx-doc ALL + COMMENT "Generating sphinx documentation") + endif() if(MSVC) # FIXME: it is impossible to trigger documentation installation at # install, so put the target in ALL instead. add_custom_target( - sphinx-doc ALL + ${PROJECT_NAME}-sphinx-doc COMMAND ${PYTHON_EXECUTABLE} ${SPHINX_BUILD} -b html ${CMAKE_CURRENT_BINARY_DIR}/sphinx @@ -55,7 +59,7 @@ macro(SPHINX_SETUP) set(EXTRA_LD_PATH "\"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}\":") set(EXTRA_LD_PATH "${EXTRA_LD_PATH}\"${DYNAMIC_GRAPH_PLUGINDIR}\":") add_custom_target( - sphinx-doc + ${PROJECT_NAME}-sphinx-doc COMMAND export DYLD_LIBRARY_PATH=${EXTRA_LD_PATH}:\$DYLD_LIBRARY_PATH \; ${PYTHON_EXECUTABLE} ${SPHINX_BUILD} -b html @@ -73,7 +77,7 @@ macro(SPHINX_SETUP) set(EXTRA_LD_PATH "\"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}\":") set(EXTRA_LD_PATH "${EXTRA_LD_PATH}\"${DYNAMIC_GRAPH_PLUGINDIR}\":") add_custom_target( - sphinx-doc + ${PROJECT_NAME}-sphinx-doc COMMAND export LD_LIBRARY_PATH=${EXTRA_LD_PATH}:$$LD_LIBRARY_PATH \; ${PYTHON_EXECUTABLE} ${SPHINX_BUILD} -b html @@ -86,9 +90,10 @@ macro(SPHINX_SETUP) CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_MAKE_PROGRAM} sphinx-doc)") endif(INSTALL_DOCUMENTATION) endif(MSVC) + add_dependencies(sphinx-doc ${PROJECT_NAME}-sphinx-doc) add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/doc/sphinx-html + OUTPUT ${PROJECT_BINARY_DIR}/doc/sphinx-html COMMAND ${PYTHON_EXECUTABLE} ${SPHINX_BUILD} -b html ${CMAKE_CURRENT_BINARY_DIR}/sphinx @@ -99,11 +104,12 @@ macro(SPHINX_SETUP) set_property( DIRECTORY APPEND - PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_BINARY_DIR}/doc/sphinx-html) + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + ${PROJECT_BINARY_DIR}/doc/sphinx-html) # Install generated files. if(INSTALL_DOCUMENTATION) - install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/sphinx-html + install(DIRECTORY ${PROJECT_BINARY_DIR}/doc/sphinx-html DESTINATION share/doc/${PROJECT_NAME}) if(EXISTS ${PROJECT_SOURCE_DIR}/doc/pictures) diff --git a/cmake/stubs.cmake b/cmake/stubs.cmake index 31a76bc3..b4699847 100644 --- a/cmake/stubs.cmake +++ b/cmake/stubs.cmake @@ -85,10 +85,12 @@ function(GENERATE_STUBS module_path module_name module_install_dir) # Regex from IsValidTargetName in CMake/Source/cmGeneratorExpression.cxx if(NOT module_path) string(REGEX REPLACE "[^A-Za-z0-9_.+-]" "_" target_name - "generate_stubs_${module_name}") + "${PROJECT_NAME}-generate_stubs_${module_name}") else() - string(REGEX REPLACE "[^A-Za-z0-9_.+-]" "_" target_name - "generate_stubs_${module_path}_${module_name}") + string( + REGEX + REPLACE "[^A-Za-z0-9_.+-]" "_" target_name + "${PROJECT_NAME}-generate_stubs_${module_path}_${module_name}") endif() if($ENV{PYTHONPATH}) diff --git a/cmake/test.cmake b/cmake/test.cmake index 7b51fe3f..9cb9dbb3 100644 --- a/cmake/test.cmake +++ b/cmake/test.cmake @@ -50,10 +50,14 @@ endif() # Add new target 'run_tests' to improve integration with build tooling if(NOT CMAKE_GENERATOR MATCHES "Visual Studio|Xcode" AND NOT TARGET run_tests) + if(NOT TARGET run_tests) + add_custom_target(run_tests) + endif() add_custom_target( - run_tests + ${PROJECT_NAME}-run_tests COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -V VERBATIM) + add_dependencies(run_tests ${PROJECT_NAME}-run_tests) endif() if(NOT DEFINED ctest_build_tests_exists) @@ -73,7 +77,7 @@ macro(CREATE_CTEST_BUILD_TESTS_TARGET) ctest_build_tests "${CMAKE_COMMAND}" --build - ${CMAKE_BINARY_DIR} + ${PROJECT_BINARY_DIR} --target build_tests -- @@ -121,7 +125,9 @@ endmacro( # # Fill `result` with all necessary environment variables (`PYTHONPATH`, # `LD_LIBRARY_PATH`, `DYLD_LIBRARY_PATH`) to load the `MODULES` in -# `CMAKE_BINARY_DIR` (`CMAKE_BINARY_DIR/MODULE_PATH`) +# `PROJECT_BINARY_DIR` (`PROJECT_BINARY_DIR/MODULE_PATH`) +# +# Path in PROJECT_PYTHON_PACKAGES_IN_WORKSPACE are added to the PYTHONPATH. # # .. note:: :command:`FINDPYTHON` should have been called first. # @@ -129,9 +135,9 @@ function(COMPUTE_PYTHONPATH result) set(MODULES "${ARGN}") # ARGN is not a variable foreach(MODULE_PATH IN LISTS MODULES) if(CMAKE_GENERATOR MATCHES "Visual Studio|Xcode") - list(APPEND PYTHONPATH "${CMAKE_BINARY_DIR}/${MODULE_PATH}/$") + list(APPEND PYTHONPATH "${PROJECT_BINARY_DIR}/${MODULE_PATH}/$") else() - list(APPEND PYTHONPATH "${CMAKE_BINARY_DIR}/${MODULE_PATH}") + list(APPEND PYTHONPATH "${PROJECT_BINARY_DIR}/${MODULE_PATH}") endif() endforeach(MODULE_PATH IN LISTS MODULES) @@ -139,6 +145,8 @@ function(COMPUTE_PYTHONPATH result) list(APPEND PYTHONPATH "$ENV{PYTHONPATH}") endif(DEFINED ENV{PYTHONPATH}) + list(APPEND PYTHONPATH ${PROJECT_PYTHON_PACKAGES_IN_WORKSPACE}) + # get path separator to join those paths execute_process( COMMAND "${PYTHON_EXECUTABLE}" "-c" "import os; print(os.pathsep)" @@ -167,8 +175,8 @@ endfunction() # .rst: .. command:: ADD_PYTHON_UNIT_TEST (NAME SOURCE [MODULES...]) # # Add a test called `NAME` that runs an equivalent of ``python ${SOURCE}``, -# optionnaly with a `PYTHONPATH` set to `CMAKE_BINARY_DIR/MODULE_PATH` for each -# MODULES `SOURCE` is relative to `PROJECT_SOURCE_DIR` +# optionnaly with a `PYTHONPATH` set to `PROJECT_BINARY_DIR/MODULE_PATH` for +# each MODULES `SOURCE` is relative to `PROJECT_SOURCE_DIR` # # .. note:: :command:`FINDPYTHON` should have been called first. # @@ -199,7 +207,7 @@ endmacro( # # Add a test called `NAME` that runs an equivalent of ``valgrind -- python # ${SOURCE}``, optionnaly with a `PYTHONPATH` set to -# `CMAKE_BINARY_DIR/MODULE_PATH` for each MODULES. `SOURCE` is relative to +# `PROJECT_BINARY_DIR/MODULE_PATH` for each MODULES. `SOURCE` is relative to # `PROJECT_SOURCE_DIR`. # # .. note:: :command:`FINDPYTHON` should have been called first. .. note:: Only @@ -229,7 +237,7 @@ endmacro() # source dir. # # :param MODULES: Set the `PYTHONPATH` environment variable to -# `CMAKE_BINARY_DIR/...`. +# `PROJECT_BINARY_DIR/...`. # # .. note:: :command:`FINDPYTHON` should have been called first. # diff --git a/cmake/uninstall.cmake b/cmake/uninstall.cmake index 5a60ec08..1d5312ed 100644 --- a/cmake/uninstall.cmake +++ b/cmake/uninstall.cmake @@ -42,11 +42,15 @@ macro(_SETUP_PROJECT_UNINSTALL) "${CMAKE_CURRENT_LIST_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake" @ONLY) + if(NOT TARGET uninstall) + add_custom_target(uninstall) + endif() add_custom_target( - uninstall + ${PROJECT_NAME}-uninstall "${CMAKE_COMMAND}" -DPACKAGE_CREATES_DOT_CATKIN=${PACKAGE_CREATES_DOT_CATKIN} -P "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake") + add_dependencies(uninstall ${PROJECT_NAME}-uninstall) configure_file( "${CMAKE_CURRENT_LIST_DIR}/cmake_reinstall.cmake.in" @@ -62,10 +66,15 @@ macro(_SETUP_PROJECT_UNINSTALL) GENERATE OUTPUT "${PROJECT_BINARY_DIR}/cmake/$/cmake_reinstall.cmake" INPUT "${PROJECT_BINARY_DIR}/cmake/cmake_reinstall.cmake.configured") + + if(NOT TARGET reinstall) + add_custom_target(reinstall) + endif() add_custom_target( - reinstall + ${PROJECT_NAME}-reinstall "${CMAKE_COMMAND}" -P "${PROJECT_BINARY_DIR}/cmake/$/cmake_reinstall.cmake") + add_dependencies(reinstall ${PROJECT_NAME}-reinstall) endmacro(_SETUP_PROJECT_UNINSTALL) # We setup the auto-uninstall target here, it is early enough that we can ensure diff --git a/cmake/version.cmake b/cmake/version.cmake index 4a7fb1a8..faa66615 100644 --- a/cmake/version.cmake +++ b/cmake/version.cmake @@ -204,6 +204,7 @@ macro(VERSION_COMPUTE) set(PROJECT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") endif() endif() + if(NOT DEFINED PROJECT_VERSION_COMPUTATION_METHODS) list(APPEND PROJECT_VERSION_COMPUTATION_METHODS "ROS_PACKAGE_XML_FILE" "DOT_VERSION_FILE" "GIT_DESCRIBE") diff --git a/doc/Doxyfile.extra.in b/doc/Doxyfile.extra.in index 733ef2e2..d3290a4f 100644 --- a/doc/Doxyfile.extra.in +++ b/doc/Doxyfile.extra.in @@ -1,6 +1,6 @@ -INPUT = @CMAKE_SOURCE_DIR@/src \ - @CMAKE_SOURCE_DIR@/doc/additionalDoc -IMAGE_PATH = @CMAKE_SOURCE_DIR@/doc/pictures +INPUT = @PROJECT_SOURCE_DIR@/src \ + @PROJECT_SOURCE_DIR@/doc/additionalDoc +IMAGE_PATH = @PROJECT_SOURCE_DIR@/doc/pictures FILE_PATTERNS = *.cc *.cpp *.h *.hpp *.hxx diff --git a/include/eigenpy/numpy.hpp b/include/eigenpy/numpy.hpp index 3786b091..f5aee019 100644 --- a/include/eigenpy/numpy.hpp +++ b/include/eigenpy/numpy.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2020-2022 INRIA + * Copyright 2020-2024 INRIA */ #ifndef __eigenpy_numpy_hpp__ @@ -55,7 +55,7 @@ void EIGENPY_DLLAPI import_numpy(); int EIGENPY_DLLAPI PyArray_TypeNum(PyTypeObject* type); // By default, the Scalar is considered as a Python object -template +template struct NumpyEquivalentType { enum { type_code = NPY_USERDEF }; }; @@ -139,12 +139,19 @@ struct NumpyEquivalentType { // See https://github.com/stack-of-tasks/eigenpy/pull/455 #if defined __linux__ -template <> -struct NumpyEquivalentType { +#include + +template +struct NumpyEquivalentType< + Scalar, std::enable_if_t::value && + std::is_same::value> > { enum { type_code = NPY_LONGLONG }; }; -template <> -struct NumpyEquivalentType { +template +struct NumpyEquivalentType< + Scalar, + std::enable_if_t::value && + std::is_same::value> > { enum { type_code = NPY_ULONGLONG }; }; @@ -208,7 +215,7 @@ EIGENPY_DLLAPI PyArray_Descr* call_PyArray_DescrFromType(int typenum); EIGENPY_DLLAPI void call_PyArray_InitArrFuncs(PyArray_ArrFuncs* funcs); -EIGENPY_DLLAPI int call_PyArray_RegisterDataType(PyArray_Descr* dtype); +EIGENPY_DLLAPI int call_PyArray_RegisterDataType(PyArray_DescrProto* dtype); EIGENPY_DLLAPI int call_PyArray_RegisterCanCast(PyArray_Descr* descr, int totype, diff --git a/package.xml b/package.xml index 42d13ad3..5f0f321b 100644 --- a/package.xml +++ b/package.xml @@ -1,7 +1,7 @@ eigenpy - 3.7.0 + 3.8.2 Bindings between Numpy and Eigen using Boost.Python Justin Carpentier Wolfgang Merkt diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 4781e42f..221a5c29 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -12,11 +12,12 @@ make_directory("${${PROJECT_NAME}_BINARY_DIR}/python/${PROJECT_NAME}") include(${JRL_CMAKE_MODULES}/python-helpers.cmake) include("${JRL_CMAKE_MODULES}/stubs.cmake") -add_custom_target(python) -set_target_properties(python PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD True) +add_custom_target(${PROJECT_NAME}_python) +set_target_properties(${PROJECT_NAME}_python + PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD True) add_library(${PYWRAP} MODULE main.cpp) -add_dependencies(python ${PYWRAP}) +add_dependencies(${PROJECT_NAME}_python ${PYWRAP}) target_link_libraries(${PYWRAP} PUBLIC ${PROJECT_NAME}) python_build_get_target(python_build_target) @@ -40,13 +41,13 @@ set_target_properties( PROPERTIES PREFIX "" SUFFIX ${PYTHON_EXT_SUFFIX} LIBRARY_OUTPUT_DIRECTORY - "${CMAKE_BINARY_DIR}/python/${PROJECT_NAME}" + "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}" LIBRARY_OUTPUT_DIRECTORY_ - "${CMAKE_BINARY_DIR}/python/${PROJECT_NAME}" + "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}" RUNTIME_OUTPUT_DIRECTORY - "${CMAKE_BINARY_DIR}/python/${PROJECT_NAME}" + "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}" RUNTIME_OUTPUT_DIRECTORY_ - "${CMAKE_BINARY_DIR}/python/${PROJECT_NAME}") + "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}") if(UNIX) get_relative_rpath(${${PYWRAP}_INSTALL_DIR} ${PYWRAP}_INSTALL_RPATH) diff --git a/python/eigenpy/windows_dll_manager.py b/python/eigenpy/windows_dll_manager.py index 8edb419f..54e8631d 100644 --- a/python/eigenpy/windows_dll_manager.py +++ b/python/eigenpy/windows_dll_manager.py @@ -1,6 +1,5 @@ import contextlib import os -import sys def get_dll_paths(): @@ -22,20 +21,6 @@ def get_dll_paths(): return eigenpy_paths.split(os.pathsep) -class PathManager(contextlib.AbstractContextManager): - """Restore PATH state after importing Python module""" - - def add_dll_directory(self, dll_dir: str): - os.environ["PATH"] += os.pathsep + dll_dir - - def __enter__(self): - self.old_path = os.environ["PATH"] - return self - - def __exit__(self, *exc_details): - os.environ["PATH"] = self.old_path - - class DllDirectoryManager(contextlib.AbstractContextManager): """Restore DllDirectory state after importing Python module""" @@ -59,7 +44,4 @@ def __exit__(self, *exc_details): def build_directory_manager(): - if sys.version_info >= (3, 8): - return DllDirectoryManager() - else: - return PathManager() + return DllDirectoryManager() diff --git a/src/numpy.cpp b/src/numpy.cpp index e758ed02..c4ef8d1b 100644 --- a/src/numpy.cpp +++ b/src/numpy.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2020-2022 INRIA + * Copyright 2020-2024 INRIA */ #include "eigenpy/numpy.hpp" @@ -57,7 +57,7 @@ void call_PyArray_InitArrFuncs(PyArray_ArrFuncs* funcs) { PyArray_InitArrFuncs(funcs); } -int call_PyArray_RegisterDataType(PyArray_Descr* dtype) { +int call_PyArray_RegisterDataType(PyArray_DescrProto* dtype) { return PyArray_RegisterDataType(dtype); } diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 8d6571d1..a65ac2e0 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -2,31 +2,36 @@ # Copyright (c) 2014-2019 CNRS Copyright (c) 2018-2024 INRIA # -macro(ADD_LIB_UNIT_TEST test) +function(ADD_LIB_UNIT_TEST test) create_ctest_build_tests_target() + set(test_target ${PROJECT_NAME}-${test}) if(BUILD_TESTING) - add_library(${test} SHARED "${test}.cpp") - else(BUILD_TESTING) - add_library(${test} SHARED EXCLUDE_FROM_ALL "${test}.cpp") - endif(BUILD_TESTING) - set_standard_output_directory(${test}) + add_library(${test_target} SHARED "${test}.cpp") + else() + add_library(${test_target} SHARED EXCLUDE_FROM_ALL "${test}.cpp") + endif() + set_standard_output_directory(${test_target}) - target_link_libraries(${test} PUBLIC ${PROJECT_NAME}) - set_target_properties(${test} PROPERTIES PREFIX "") + target_link_libraries(${test_target} PUBLIC ${PROJECT_NAME}) + set_target_properties( + ${test_target} + PROPERTIES PREFIX "" + LIBRARY_OUTPUT_NAME ${test} + RUNTIME_OUTPUT_NAME ${test}) - set_target_properties(${test} PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX}) + set_target_properties(${test_target} PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX}) add_test( - NAME ${test} + NAME ${test_target} COMMAND ${PYTHON_EXECUTABLE} -c "import ${test}" - WORKING_DIRECTORY $) + WORKING_DIRECTORY $) - add_dependencies(build_tests ${test}) + add_dependencies(build_tests ${test_target}) if(NOT BUILD_TESTING) - set_tests_properties(${test} PROPERTIES DEPENDS ctest_build_tests) + set_tests_properties(${test_target} PROPERTIES DEPENDS ctest_build_tests) endif(NOT BUILD_TESTING) -endmacro(ADD_LIB_UNIT_TEST) +endfunction() add_dependencies(build_tests ${PYWRAP}) add_lib_unit_test(matrix) @@ -58,17 +63,20 @@ if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98) endif() function(add_python_lib_unit_test name source) - add_python_unit_test(${name} ${source} "lib" "bin") + set(test_target ${PROJECT_NAME}-${name}) + add_python_unit_test(${test_target} ${source} "lib" "bin") endfunction() function(add_python_eigenpy_lib_unit_test name source) - add_python_unit_test(${name} ${source} "lib" "bin" "python") - set_tests_properties(${name} PROPERTIES DEPENDS ${PYWRAP}) + set(test_target ${PROJECT_NAME}-${name}) + add_python_unit_test(${test_target} ${source} "lib" "bin" "python") + set_tests_properties(${test_target} PROPERTIES DEPENDS ${PYWRAP}) endfunction() function(add_python_eigenpy_unit_test name source) - add_python_unit_test(${name} ${source} "python") - set_tests_properties(${name} PROPERTIES DEPENDS ${PYWRAP}) + set(test_target ${PROJECT_NAME}-${name}) + add_python_unit_test(${test_target} ${source} "python") + set_tests_properties(${test_target} PROPERTIES DEPENDS ${PYWRAP}) endfunction() function(config_test test tagname opttype) @@ -80,7 +88,7 @@ function(config_test test tagname opttype) configure_file(python/test_${test}.py.in ${CMAKE_CURRENT_BINARY_DIR}/python/${py_file}) add_lib_unit_test(${MODNAME}) - set(PYTHON_TEST_NAME "py-${test}-${tagname}") + set(PYTHON_TEST_NAME "${PROJECT_NAME}-py-${test}-${tagname}") add_test(NAME ${PYTHON_TEST_NAME} COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/python/${py_file}") diff --git a/unittest/python/test_user_type.py b/unittest/python/test_user_type.py index 76f8591f..cb895fc7 100644 --- a/unittest/python/test_user_type.py +++ b/unittest/python/test_user_type.py @@ -67,4 +67,4 @@ def test_cast(from_dtype, to_dtype): v = user_type.CustomDouble(1) a = np.array(v) -assert type(v) == a.dtype.type +assert type(v) is a.dtype.type