diff --git a/.gersemirc b/.gersemirc new file mode 100644 index 000000000..c682c6bb5 --- /dev/null +++ b/.gersemirc @@ -0,0 +1,4 @@ +definitions: [./CMakeLists.txt,./cmake-module,./cmake-external,./bindings,./include] +line_length: 80 +indent: 2 +warn_about_unknown_commands: false diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 22a20ef12..00b71b4e9 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -3,3 +3,6 @@ # pre-commit -a f9b7356675024220eefda2344dd186acd612b027 + +# pre-commit -a +377ea892ac50927d59239e6c57cf0f9477d340e4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cd6b420c2..33e9f0d89 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,6 +2,7 @@ ci: autoupdate_branch: 'devel' autofix_prs: false autoupdate_schedule: quarterly + submodules: true repos: - repo: https://github.com/pre-commit/mirrors-clang-format rev: v19.1.7 @@ -16,7 +17,7 @@ repos: rev: 24.10.0 hooks: - id: black -- repo: https://github.com/cheshirekow/cmake-format-precommit - rev: v0.6.13 +- repo: https://github.com/BlankSpruce/gersemi + rev: 0.19.0 hooks: - - id: cmake-format + - id: gersemi diff --git a/CHANGELOG.md b/CHANGELOG.md index 20c8da489..c8adbd313 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed * Upgrade nanobind submodule to v2.5.0 ([#378](https://github.com/Simple-Robotics/proxsuite/pull/378)) +* Switch to gersemi for formatting ([#380](https://github.com/Simple-Robotics/proxsuite/pull/380)) ## [0.7.1] - 2025-01-28 diff --git a/CMakeLists.txt b/CMakeLists.txt index 209c514bb..cec45ac1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,22 +29,24 @@ else() get_property( JRL_CMAKE_MODULES TARGET jrl-cmakemodules::jrl-cmakemodules - PROPERTY INTERFACE_INCLUDE_DIRECTORIES) + PROPERTY INTERFACE_INCLUDE_DIRECTORIES + ) message(STATUS "JRL cmakemodules found on system at ${JRL_CMAKE_MODULES}") elseif(${CMAKE_VERSION} VERSION_LESS "3.14.0") message( FATAL_ERROR - "\nCan't find jrl-cmakemodules. Please either:\n" - " - use git submodule: 'git submodule update --init'\n" - " - or install https://github.com/jrl-umi3218/jrl-cmakemodules\n" - " - or upgrade your CMake version to >= 3.14 to allow automatic fetching\n" + "\nCan't find jrl-cmakemodules. Please either:\n" + " - use git submodule: 'git submodule update --init'\n" + " - or install https://github.com/jrl-umi3218/jrl-cmakemodules\n" + " - or upgrade your CMake version to >= 3.14 to allow automatic fetching\n" ) else() message(STATUS "JRL cmakemodules not found. Let's fetch it.") include(FetchContent) FetchContent_Declare( "jrl-cmakemodules" - GIT_REPOSITORY "https://github.com/jrl-umi3218/jrl-cmakemodules.git") + GIT_REPOSITORY "https://github.com/jrl-umi3218/jrl-cmakemodules.git" + ) FetchContent_MakeAvailable("jrl-cmakemodules") FetchContent_GetProperties("jrl-cmakemodules" SOURCE_DIR JRL_CMAKE_MODULES) endif() @@ -76,51 +78,79 @@ if(POLICY CMP0177) set(CMAKE_POLICY_DEFAULT_CMP0177 NEW) endif() include(${JRL_CMAKE_MODULES}/base.cmake) -compute_project_args(PROJECT_ARGS LANGUAGES CXX) +COMPUTE_PROJECT_ARGS(PROJECT_ARGS LANGUAGES CXX) project(${PROJECT_NAME} ${PROJECT_ARGS}) include(${JRL_CMAKE_MODULES}/ide.cmake) include(${JRL_CMAKE_MODULES}/apple.cmake) if(NOT ${CMAKE_VERSION} VERSION_GREATER "3.26.0" OR WIN32) - set(CMAKE_MODULE_PATH ${JRL_CMAKE_MODULES}/find-external/OpenMP - ${CMAKE_MODULE_PATH}) + set( + CMAKE_MODULE_PATH + ${JRL_CMAKE_MODULES}/find-external/OpenMP + ${CMAKE_MODULE_PATH} + ) endif() include(${JRL_CMAKE_MODULES}/julia.cmake) include(CMakeDependentOption) # If needed, set CMake policy for APPLE systems -apply_default_apple_configuration() -set_default_cmake_build_type(Release) +APPLY_DEFAULT_APPLE_CONFIGURATION() +SET_DEFAULT_CMAKE_BUILD_TYPE(Release) option(BUILD_PYTHON_INTERFACE "Build the Python bindings" OFF) option(INITIALIZE_EIGEN_WITH_NAN "Initialize Eigen objects with NAN values" OFF) -option(CHECK_RUNTIME_MALLOC - "Check if some memory allocations are performed at runtime" OFF) +option( + CHECK_RUNTIME_MALLOC + "Check if some memory allocations are performed at runtime" + OFF +) option(SUFFIX_SO_VERSION "Suffix library name with its version" ON) -option(BUILD_WITH_VECTORIZATION_SUPPORT - "Build the library with the support of modern SIMD instructions." ON) -option(BUILD_BINDINGS_WITH_AVX2_SUPPORT "Build the bindings with AVX2 support." - ON) -option(BUILD_BINDINGS_WITH_AVX512_SUPPORT - "Build the bindings with AVX512 support." ON) +option( + BUILD_WITH_VECTORIZATION_SUPPORT + "Build the library with the support of modern SIMD instructions." + ON +) +option( + BUILD_BINDINGS_WITH_AVX2_SUPPORT + "Build the bindings with AVX2 support." + ON +) +option( + BUILD_BINDINGS_WITH_AVX512_SUPPORT + "Build the bindings with AVX512 support." + ON +) option(TEST_JULIA_INTERFACE "Run the julia examples as unittest" OFF) -option(BUILD_WITH_OPENMP_SUPPORT "Build the library with the OpenMP support" - OFF) +option( + BUILD_WITH_OPENMP_SUPPORT + "Build the library with the OpenMP support" + OFF +) cmake_dependent_option( - LINK_PYTHON_INTERFACE_TO_OPENMP "Link OpenMP to the Python interface" ON - BUILD_WITH_OPENMP_SUPPORT OFF) + LINK_PYTHON_INTERFACE_TO_OPENMP + "Link OpenMP to the Python interface" + ON + BUILD_WITH_OPENMP_SUPPORT + OFF +) if(BUILD_WITH_OPENMP_SUPPORT) find_package(OpenMP REQUIRED) separate_arguments(OpenMP_CXX_FLAGS UNIX_COMMAND "${OpenMP_CXX_FLAGS}") endif(BUILD_WITH_OPENMP_SUPPORT) -set(CMAKE_MODULE_PATH "${JRL_CMAKE_MODULES}/find-external/Julia" - ${CMAKE_MODULE_PATH}) -set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake-external" - ${CMAKE_MODULE_PATH}) +set( + CMAKE_MODULE_PATH + "${JRL_CMAKE_MODULES}/find-external/Julia" + ${CMAKE_MODULE_PATH} +) +set( + CMAKE_MODULE_PATH + "${CMAKE_CURRENT_LIST_DIR}/cmake-external" + ${CMAKE_MODULE_PATH} +) message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") if(INITIALIZE_EIGEN_WITH_NAN) @@ -134,7 +164,7 @@ endif(CHECK_RUNTIME_MALLOC) # set CXX standard if(DEFINED CMAKE_CXX_STANDARD) - check_minimal_cxx_standard(14 ENFORCE) + CHECK_MINIMAL_CXX_STANDARD(14 ENFORCE) else() set(CMAKE_CXX_STANDARD 17) endif() @@ -147,14 +177,19 @@ if(MSVC) endif() # Look for dependencies -add_project_dependency(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.0.5") +ADD_PROJECT_DEPENDENCY(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.0.5") -set(SIMDE_HINT_FAILURE - "Set BUILD_WITH_VECTORIZATION_SUPPORT=OFF or install Simde on your system.\n If Simde is already installed, ensure that the CMake variable CMAKE_MODULE_PATH correctly points toward the location of FindSimde.cmake file." +set( + SIMDE_HINT_FAILURE + "Set BUILD_WITH_VECTORIZATION_SUPPORT=OFF or install Simde on your system.\n If Simde is already installed, ensure that the CMake variable CMAKE_MODULE_PATH correctly points toward the location of FindSimde.cmake file." ) if(BUILD_WITH_VECTORIZATION_SUPPORT) - add_project_dependency(Simde REQUIRED FIND_EXTERNAL "Simde" - PKG_CONFIG_REQUIRES "simde") + ADD_PROJECT_DEPENDENCY( + Simde + REQUIRED + FIND_EXTERNAL "Simde" + PKG_CONFIG_REQUIRES "simde" + ) endif() # Build the main library @@ -165,29 +200,25 @@ if(MSVC) target_compile_options(proxsuite INTERFACE /permissive-) target_compile_options(proxsuite INTERFACE $<$:/bigobj>) endif(MSVC) -target_link_libraries( - proxsuite - PUBLIC - INTERFACE Eigen3::Eigen) +target_link_libraries(proxsuite PUBLIC INTERFACE Eigen3::Eigen) target_include_directories( - proxsuite INTERFACE "$" - "$") + proxsuite + INTERFACE + "$" + "$" +) target_include_directories( - proxsuite INTERFACE "$") + proxsuite + INTERFACE "$" +) set(EXPORTED_TARGETS_LIST proxsuite) -add_header_group(${PROJECT_NAME}_HEADERS) +ADD_HEADER_GROUP(${PROJECT_NAME}_HEADERS) if(BUILD_WITH_VECTORIZATION_SUPPORT) add_library(proxsuite-vectorized INTERFACE) - target_link_libraries( - proxsuite-vectorized - PUBLIC - INTERFACE proxsuite) - target_link_libraries( - proxsuite-vectorized - PUBLIC - INTERFACE simde) + target_link_libraries(proxsuite-vectorized PUBLIC INTERFACE proxsuite) + target_link_libraries(proxsuite-vectorized PUBLIC INTERFACE simde) target_compile_definitions(proxsuite-vectorized INTERFACE PROXSUITE_VECTORIZE) list(APPEND EXPORTED_TARGETS_LIST proxsuite-vectorized) endif() @@ -202,7 +233,9 @@ if(BUILD_TESTING OR BUILD_PYTHON_INTERFACE) if(NOT EXISTS ${cereal}) execute_process( COMMAND ${GIT_EXECUTABLE} submodule update --init ${cereal_dir} - WORKING_DIRECTORY ${cereal_dir} COMMAND_ERROR_IS_FATAL ANY) + WORKING_DIRECTORY ${cereal_dir} + COMMAND_ERROR_IS_FATAL ANY + ) endif() endif() endif() @@ -213,7 +246,8 @@ if(NOT PROXSUITE_AS_SUBPROJECT) EXPORT ${TARGETS_EXPORT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) + RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} + ) endif(NOT PROXSUITE_AS_SUBPROJECT) add_subdirectory(bindings) @@ -230,26 +264,33 @@ install(FILES package.xml DESTINATION share/${PROJECT_NAME}) file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/share/ament_index/resource_index/packages/${PROJECT_NAME} - "") + "" +) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/share/ament_index/resource_index/packages/${PROJECT_NAME} - DESTINATION share/ament_index/resource_index/packages) + DESTINATION share/ament_index/resource_index/packages +) file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/ament_prefix_path.dsv - "prepend-non-duplicate;AMENT_PREFIX_PATH;") + "prepend-non-duplicate;AMENT_PREFIX_PATH;" +) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/ament_prefix_path.dsv - DESTINATION share/${PROJECT_NAME}/hook) + DESTINATION share/${PROJECT_NAME}/hook +) if(BUILD_PYTHON_INTERFACE) - file(WRITE - ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/python_path.dsv - "prepend-non-duplicate;PYTHONPATH;${PYTHON_SITELIB}") + file( + WRITE + ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/python_path.dsv + "prepend-non-duplicate;PYTHONPATH;${PYTHON_SITELIB}" + ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/python_path.dsv - DESTINATION share/${PROJECT_NAME}/hook) + DESTINATION share/${PROJECT_NAME}/hook + ) endif(BUILD_PYTHON_INTERFACE) -setup_project_finalize() +SETUP_PROJECT_FINALIZE() diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt index 29487b9a9..07678691f 100644 --- a/bindings/python/CMakeLists.txt +++ b/bindings/python/CMakeLists.txt @@ -7,7 +7,7 @@ include(${JRL_CMAKE_MODULES}/python-helpers.cmake) option(GENERATE_PYTHON_STUBS "Generate Python stubs" OFF) -findpython(REQUIRED) +FINDPYTHON(REQUIRED) set(Python_INCLUDE_DIRS ${Python3_INCLUDE_DIRS}) # Nanobind expects these targets instead of Python3::* # https://github.com/jrl-umi3218/jrl-cmakemodules/issues/708 @@ -17,8 +17,10 @@ add_executable(Python::Interpreter ALIAS Python3::Interpreter) if(IS_ABSOLUTE ${PYTHON_SITELIB}) set(${PYWRAP}_INSTALL_DIR ${PYTHON_SITELIB}/${PROJECT_NAME}) else() - set(${PYWRAP}_INSTALL_DIR - ${CMAKE_INSTALL_PREFIX}/${PYTHON_SITELIB}/${PROJECT_NAME}) + set( + ${PYWRAP}_INSTALL_DIR + ${CMAKE_INSTALL_PREFIX}/${PYTHON_SITELIB}/${PROJECT_NAME} + ) endif() cmake_policy(PUSH) @@ -27,13 +29,16 @@ cmake_policy(SET CMP0074 NEW) execute_process( COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE nanobind_ROOT) + OUTPUT_VARIABLE nanobind_ROOT +) find_package(nanobind CONFIG) cmake_policy(POP) if(NOT nanobind_FOUND) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external/nanobind) - add_subdirectory(external/nanobind - ${CMAKE_CURRENT_BINARY_DIR}/external/nanobind) + add_subdirectory( + external/nanobind + ${CMAKE_CURRENT_BINARY_DIR}/external/nanobind + ) else() message(STATUS "Found installed nanobind.") endif() @@ -51,41 +56,45 @@ if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "(x86)|(X86)|(amd64)|(AMD64)") target_link_libraries(instructionset PRIVATE proxsuite) set_target_properties( instructionset - PROPERTIES OUTPUT_NAME instructionset - LIBRARY_OUTPUT_DIRECTORY - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - LIBRARY_OUTPUT_DIRECTORY_RELEASE - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - LIBRARY_OUTPUT_DIRECTORY_DEBUG - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - # On Windows, shared library are treat as binary - RUNTIME_OUTPUT_DIRECTORY - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - RUNTIME_OUTPUT_DIRECTORY_RELEASE - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - RUNTIME_OUTPUT_DIRECTORY_DEBUG - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}") + PROPERTIES + OUTPUT_NAME instructionset + LIBRARY_OUTPUT_DIRECTORY + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + LIBRARY_OUTPUT_DIRECTORY_RELEASE + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + LIBRARY_OUTPUT_DIRECTORY_DEBUG + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + # On Windows, shared library are treat as binary + RUNTIME_OUTPUT_DIRECTORY + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + RUNTIME_OUTPUT_DIRECTORY_RELEASE + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + RUNTIME_OUTPUT_DIRECTORY_DEBUG + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + ) if(UNIX AND NOT APPLE) - set_target_properties(instructionset PROPERTIES INSTALL_RPATH - "\$ORIGIN/../../..") + set_target_properties( + instructionset + PROPERTIES INSTALL_RPATH "\$ORIGIN/../../.." + ) endif() install( TARGETS instructionset EXPORT ${TARGETS_EXPORT_NAME} - DESTINATION ${${PYWRAP}_INSTALL_DIR}) + DESTINATION ${${PYWRAP}_INSTALL_DIR} + ) if(GENERATE_PYTHON_STUBS) nanobind_add_stub( instructionset_stub - MODULE - instructionset - OUTPUT - instructionset.pyi - PYTHON_PATH - $ - DEPENDS - instructionset) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/instructionset.pyi - DESTINATION ${${PYWRAP}_INSTALL_DIR}) + MODULE instructionset + OUTPUT instructionset.pyi + PYTHON_PATH $ + DEPENDS instructionset + ) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/instructionset.pyi + DESTINATION ${${PYWRAP}_INSTALL_DIR} + ) endif() endif() @@ -95,9 +104,7 @@ function(list_filter list regular_expression dest_list) list(REMOVE_ITEM list ${elt}) endif() endforeach(elt ${list}) - set(${dest_list} - ${list} - PARENT_SCOPE) + set(${dest_list} ${list} PARENT_SCOPE) endfunction(list_filter) function(CREATE_PYTHON_TARGET target_name COMPILE_OPTIONS dependencies) @@ -107,15 +114,22 @@ function(CREATE_PYTHON_TARGET target_name COMPILE_OPTIONS dependencies) target_link_libraries(${target_name} PUBLIC ${dependencies}) target_compile_options(${target_name} PRIVATE ${COMPILE_OPTIONS}) target_link_libraries(${target_name} PRIVATE proxsuite) - target_compile_definitions(${target_name} - PRIVATE PYTHON_MODULE_NAME=${target_name}) + target_compile_definitions( + ${target_name} + PRIVATE PYTHON_MODULE_NAME=${target_name} + ) if(BUILD_WITH_OPENMP_SUPPORT) target_compile_options(${target_name} PRIVATE ${OpenMP_CXX_FLAGS}) - target_compile_definitions(${target_name} - PRIVATE -DPROXSUITE_PYTHON_INTERFACE_WITH_OPENMP) - target_include_directories(${target_name} SYSTEM - PRIVATE ${OpenMP_CXX_INCLUDE_DIR}) + target_compile_definitions( + ${target_name} + PRIVATE -DPROXSUITE_PYTHON_INTERFACE_WITH_OPENMP + ) + target_include_directories( + ${target_name} + SYSTEM + PRIVATE ${OpenMP_CXX_INCLUDE_DIR} + ) if(LINK_PYTHON_INTERFACE_TO_OPENMP) target_link_libraries(${target_name} PRIVATE ${OpenMP_CXX_LIBRARIES}) endif(LINK_PYTHON_INTERFACE_TO_OPENMP) @@ -127,45 +141,50 @@ function(CREATE_PYTHON_TARGET target_name COMPILE_OPTIONS dependencies) target_link_libraries(${target_name} PRIVATE cereal::cereal) else() target_include_directories( - ${target_name} SYSTEM - PRIVATE ${PROJECT_SOURCE_DIR}/external/cereal/include) + ${target_name} + SYSTEM + PRIVATE ${PROJECT_SOURCE_DIR}/external/cereal/include + ) endif() set_target_properties( ${target_name} - PROPERTIES OUTPUT_NAME ${target_name} - LIBRARY_OUTPUT_DIRECTORY - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - LIBRARY_OUTPUT_DIRECTORY_RELEASE - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - LIBRARY_OUTPUT_DIRECTORY_DEBUG - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - # On Windows, shared library are treat as binary - RUNTIME_OUTPUT_DIRECTORY - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - RUNTIME_OUTPUT_DIRECTORY_RELEASE - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" - RUNTIME_OUTPUT_DIRECTORY_DEBUG - "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}") + PROPERTIES + OUTPUT_NAME ${target_name} + LIBRARY_OUTPUT_DIRECTORY + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + LIBRARY_OUTPUT_DIRECTORY_RELEASE + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + LIBRARY_OUTPUT_DIRECTORY_DEBUG + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + # On Windows, shared library are treat as binary + RUNTIME_OUTPUT_DIRECTORY + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + RUNTIME_OUTPUT_DIRECTORY_RELEASE + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + RUNTIME_OUTPUT_DIRECTORY_DEBUG + "${PROJECT_BINARY_DIR}/bindings/python/${PROJECT_NAME}" + ) if(UNIX AND NOT APPLE) - set_target_properties(${target_name} PROPERTIES INSTALL_RPATH - "\$ORIGIN/../../..") + set_target_properties( + ${target_name} + PROPERTIES INSTALL_RPATH "\$ORIGIN/../../.." + ) endif() install(TARGETS ${target_name} DESTINATION ${${PYWRAP}_INSTALL_DIR}) if(GENERATE_PYTHON_STUBS) nanobind_add_stub( ${target_name}_stub - MODULE - ${target_name} - OUTPUT - ${target_name}.pyi - PYTHON_PATH - $ - DEPENDS - ${target_name}) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.pyi - DESTINATION ${${PYWRAP}_INSTALL_DIR}) + MODULE ${target_name} + OUTPUT ${target_name}.pyi + PYTHON_PATH $ + DEPENDS ${target_name} + ) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.pyi + DESTINATION ${${PYWRAP}_INSTALL_DIR} + ) endif() endfunction() @@ -181,32 +200,43 @@ else() set(AVX512_COMPILE_OPTION "-mavx512f") endif() -create_python_target(proxsuite_pywrap "" proxsuite) -if(BUILD_WITH_VECTORIZATION_SUPPORT AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES - "(x86)|(X86)|(amd64)|(AMD64)") +CREATE_PYTHON_TARGET(proxsuite_pywrap "" proxsuite) +if( + BUILD_WITH_VECTORIZATION_SUPPORT + AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "(x86)|(X86)|(amd64)|(AMD64)" +) if(BUILD_BINDINGS_WITH_AVX2_SUPPORT) - create_python_target( - proxsuite_pywrap_avx2 "${AVX2_COMPILE_OPTION};${FMA_COMPILE_OPTION}" - proxsuite-vectorized) + CREATE_PYTHON_TARGET( + proxsuite_pywrap_avx2 + "${AVX2_COMPILE_OPTION};${FMA_COMPILE_OPTION}" + proxsuite-vectorized + ) endif(BUILD_BINDINGS_WITH_AVX2_SUPPORT) if(BUILD_BINDINGS_WITH_AVX512_SUPPORT) - create_python_target( - proxsuite_pywrap_avx512 "${AVX512_COMPILE_OPTION};${FMA_COMPILE_OPTION}" - proxsuite-vectorized) + CREATE_PYTHON_TARGET( + proxsuite_pywrap_avx512 + "${AVX512_COMPILE_OPTION};${FMA_COMPILE_OPTION}" + proxsuite-vectorized + ) endif(BUILD_BINDINGS_WITH_AVX512_SUPPORT) endif() -add_header_group(PYWRAP_HEADERS) -add_source_group(PYWRAP_SOURCES) +ADD_HEADER_GROUP(PYWRAP_HEADERS) +ADD_SOURCE_GROUP(PYWRAP_SOURCES) # --- INSTALL SCRIPTS # On Windows, we need to enforce the environment variable KMP_DUPLICATE_LIB_OK # to True to to allow the program to continue to execute with OpenMP support -if(WIN32 - AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" - AND BUILD_WITH_OPENMP_SUPPORT) - set(OPENMP_KMP_DUPLICATE_LIB_OK_SCRIPT - "import os\n" "os.environ[\"KMP_DUPLICATE_LIB_OK\"] = \"1\"\n\n") +if( + WIN32 + AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + AND BUILD_WITH_OPENMP_SUPPORT +) + set( + OPENMP_KMP_DUPLICATE_LIB_OK_SCRIPT + "import os\n" + "os.environ[\"KMP_DUPLICATE_LIB_OK\"] = \"1\"\n\n" + ) if(CMAKE_GENERATOR MATCHES "Visual Studio|Xcode") set(PYTHON_MODULE_DIR "${CMAKE_CURRENT_BINARY_DIR}/proxsuite/$") @@ -215,30 +245,40 @@ if(WIN32 endif() set(original_init_dot_py_file ${CMAKE_CURRENT_LIST_DIR}/proxsuite/__init__.py) - set(generated_init_dot_py_file - ${CMAKE_CURRENT_BINARY_DIR}/proxsuite/__init__.py) + set( + generated_init_dot_py_file + ${CMAKE_CURRENT_BINARY_DIR}/proxsuite/__init__.py + ) set(generated_init_dot_pyc_file ${PYTHON_MODULE_DIR}/__init__.pyc) # Copy content of the __init__.py file file(READ ${original_init_dot_py_file} INIT_CONTENT) # Create a new __init__.py file containing both the content of __init__.py # prepended with the OPENMP_KMP_DUPLICATE_LIB_OK_SCRIPT content - file(WRITE ${generated_init_dot_py_file} - ${OPENMP_KMP_DUPLICATE_LIB_OK_SCRIPT}) + file( + WRITE + ${generated_init_dot_py_file} + ${OPENMP_KMP_DUPLICATE_LIB_OK_SCRIPT} + ) file(APPEND ${generated_init_dot_py_file} ${INIT_CONTENT}) - python_build_file(${generated_init_dot_py_file} - ${generated_init_dot_pyc_file}) - install(FILES "${generated_init_dot_py_file}" - DESTINATION ${${PYWRAP}_INSTALL_DIR}) - + PYTHON_BUILD_FILE( + ${generated_init_dot_py_file} + ${generated_init_dot_pyc_file} + ) + install( + FILES "${generated_init_dot_py_file}" + DESTINATION ${${PYWRAP}_INSTALL_DIR} + ) else() - python_build(${PROJECT_NAME} __init__.py) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/proxsuite/__init__.py" - DESTINATION ${${PYWRAP}_INSTALL_DIR}) + PYTHON_BUILD(${PROJECT_NAME} __init__.py) + install( + FILES "${CMAKE_CURRENT_SOURCE_DIR}/proxsuite/__init__.py" + DESTINATION ${${PYWRAP}_INSTALL_DIR} + ) endif() -python_build_get_target(compile_pyc) +PYTHON_BUILD_GET_TARGET(compile_pyc) add_dependencies(${PROJECT_NAME}_python ${compile_pyc}) set(PYTHON_FILES torch/__init__.py torch/qplayer.py torch/utils.py) @@ -246,9 +286,9 @@ set(PYTHON_FILES torch/__init__.py torch/qplayer.py torch/utils.py) file(MAKE_DIRECTORY ${${PYWRAP}_INSTALL_DIR}/torch) foreach(python ${PYTHON_FILES}) - python_build(${PROJECT_NAME} ${python}) + PYTHON_BUILD(${PROJECT_NAME} ${python}) get_filename_component(pysubmodule ${python} PATH) get_filename_component(pyname ${python} NAME) set(MODULE_NAME ${PROJECT_NAME}/${pysubmodule}) - python_install_on_site(${MODULE_NAME} ${pyname}) + PYTHON_INSTALL_ON_SITE(${MODULE_NAME} ${pyname}) endforeach(python) diff --git a/cmake-external/FindMatio.cmake b/cmake-external/FindMatio.cmake index efad0dcc7..935aad504 100644 --- a/cmake-external/FindMatio.cmake +++ b/cmake-external/FindMatio.cmake @@ -12,13 +12,17 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args( Matio FOUND_VAR MATIO_FOUND - REQUIRED_VARS MATIO_LIBRARIES MATIO_INCLUDE_DIR) + REQUIRED_VARS MATIO_LIBRARIES MATIO_INCLUDE_DIR +) if(MATIO_FOUND) add_library(matio UNKNOWN IMPORTED) set_target_properties( - matio PROPERTIES IMPORTED_LOCATION "${MATIO_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${MATIO_INCLUDE_DIR}") + matio + PROPERTIES + IMPORTED_LOCATION "${MATIO_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${MATIO_INCLUDE_DIR}" + ) else() set(MATIO_LIBRARIES "") endif() @@ -27,6 +31,8 @@ mark_as_advanced(MATIO_LIBRARIES MATIO_INCLUDE_DIR) include(FeatureSummary) set_package_properties( - Matio PROPERTIES - DESCRIPTION "Reading and writing binary MATLAB MAT files" - URL "https://github.com/tbeu/matio") + Matio + PROPERTIES + DESCRIPTION "Reading and writing binary MATLAB MAT files" + URL "https://github.com/tbeu/matio" +) diff --git a/cmake-external/FindSphinx.cmake b/cmake-external/FindSphinx.cmake index 751dfd95e..c00f3720d 100644 --- a/cmake-external/FindSphinx.cmake +++ b/cmake-external/FindSphinx.cmake @@ -2,9 +2,13 @@ find_program( SPHINX_EXECUTABLE NAMES sphinx-build - DOC "Path to sphinx-build executable") + DOC "Path to sphinx-build executable" +) include(FindPackageHandleStandardArgs) # Handle standard arguments to find_package like REQUIRED and QUIET find_package_handle_standard_args( - Sphinx "Failed to find sphinx-build executable" SPHINX_EXECUTABLE) + Sphinx + "Failed to find sphinx-build executable" + SPHINX_EXECUTABLE +) diff --git a/cmake-external/compiler_warnings.cmake b/cmake-external/compiler_warnings.cmake index e5fe206f1..da63eaf57 100644 --- a/cmake-external/compiler_warnings.cmake +++ b/cmake-external/compiler_warnings.cmake @@ -6,59 +6,61 @@ function(set_project_warnings project_name) option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF) - set(MSVC_WARNINGS - /W4 # Baseline reasonable warnings - /w14242 # 'identfier': conversion from 'type1' to 'type1', possible loss - # of data - /w14254 # 'operator': conversion from 'type1:field_bits' to - # 'type2:field_bits', possible loss of data - /w14263 # 'function': member function does not override any base class - # virtual member function - /w14265 # 'classname': class has virtual functions, but destructor is not - # virtual instances of this class may not be destructed correctly - /w14287 # 'operator': unsigned/negative constant mismatch - /we4289 # nonstandard extension used: 'variable': loop control variable - # declared in the for-loop is used outside the for-loop scope - /w14296 # 'operator': expression is always 'boolean_value' - /w14311 # 'variable': pointer truncation from 'type1' to 'type2' - /w14545 # expression before comma evaluates to a function which is missing - # an argument list - /w14546 # function call before comma missing argument list - /w14547 # 'operator': operator before comma has no effect; expected - # operator with side-effect - /w14549 # 'operator': operator before comma has no effect; did you intend - # 'operator'? - /w14555 # expression has no effect; expected expression with side- effect - /w14619 # pragma warning: there is no warning number 'number' - /w14640 # Enable warning on thread un-safe static member initialization - /w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may - # cause unexpected runtime behavior. - /w14905 # wide string literal cast to 'LPSTR' - /w14906 # string literal cast to 'LPWSTR' - /w14928 # illegal copy-initialization; more than one user-defined - # conversion has been implicitly applied + set( + MSVC_WARNINGS + /W4 # Baseline reasonable warnings + /w14242 # 'identfier': conversion from 'type1' to 'type1', possible loss + # of data + /w14254 # 'operator': conversion from 'type1:field_bits' to + # 'type2:field_bits', possible loss of data + /w14263 # 'function': member function does not override any base class + # virtual member function + /w14265 # 'classname': class has virtual functions, but destructor is not + # virtual instances of this class may not be destructed correctly + /w14287 # 'operator': unsigned/negative constant mismatch + /we4289 # nonstandard extension used: 'variable': loop control variable + # declared in the for-loop is used outside the for-loop scope + /w14296 # 'operator': expression is always 'boolean_value' + /w14311 # 'variable': pointer truncation from 'type1' to 'type2' + /w14545 # expression before comma evaluates to a function which is missing + # an argument list + /w14546 # function call before comma missing argument list + /w14547 # 'operator': operator before comma has no effect; expected + # operator with side-effect + /w14549 # 'operator': operator before comma has no effect; did you intend + # 'operator'? + /w14555 # expression has no effect; expected expression with side- effect + /w14619 # pragma warning: there is no warning number 'number' + /w14640 # Enable warning on thread un-safe static member initialization + /w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may + # cause unexpected runtime behavior. + /w14905 # wide string literal cast to 'LPSTR' + /w14906 # string literal cast to 'LPWSTR' + /w14928 # illegal copy-initialization; more than one user-defined + # conversion has been implicitly applied ) - set(CLANG_WARNINGS - -Wall - -Wextra # reasonable and standard - -Wshadow # warn the user if a variable declaration shadows one from a - # parent context - -Wnon-virtual-dtor # warn the user if a class with virtual functions has a - # non-virtual destructor. This helps catch hard to - # track down memory errors - -Wold-style-cast # warn for c-style casts - -Wcast-align # warn for potential performance problem casts - -Wunused # warn on anything being unused - -Woverloaded-virtual # warn if you overload (not override) a virtual - # function - -Wpedantic # warn if non-standard C++ is used - -Wconversion # warn on type conversions that may lose data - -Wsign-conversion # warn on sign conversions - -Wnull-dereference # warn if a null dereference is detected - -Wdouble-promotion # warn if float is implicit promoted to double - -Wformat=2 # warn on security issues around functions that format output - # (ie printf) + set( + CLANG_WARNINGS + -Wall + -Wextra # reasonable and standard + -Wshadow # warn the user if a variable declaration shadows one from a + # parent context + -Wnon-virtual-dtor # warn the user if a class with virtual functions has a + # non-virtual destructor. This helps catch hard to + # track down memory errors + -Wold-style-cast # warn for c-style casts + -Wcast-align # warn for potential performance problem casts + -Wunused # warn on anything being unused + -Woverloaded-virtual # warn if you overload (not override) a virtual + # function + -Wpedantic # warn if non-standard C++ is used + -Wconversion # warn on type conversions that may lose data + -Wsign-conversion # warn on sign conversions + -Wnull-dereference # warn if a null dereference is detected + -Wdouble-promotion # warn if float is implicit promoted to double + -Wformat=2 # warn on security issues around functions that format output + # (ie printf) ) if(WARNINGS_AS_ERRORS) @@ -66,14 +68,15 @@ function(set_project_warnings project_name) set(MSVC_WARNINGS ${MSVC_WARNINGS} /WX) endif() - set(GCC_WARNINGS - ${CLANG_WARNINGS} - -Wmisleading-indentation # warn if identation implies blocks where blocks - # do not exist - -Wduplicated-cond # warn if if / else chain has duplicated conditions - -Wduplicated-branches # warn if if / else branches have duplicated code - -Wlogical-op # warn about logical operations being used where bitwise were - # probably wanted + set( + GCC_WARNINGS + ${CLANG_WARNINGS} + -Wmisleading-indentation # warn if identation implies blocks where blocks + # do not exist + -Wduplicated-cond # warn if if / else chain has duplicated conditions + -Wduplicated-branches # warn if if / else branches have duplicated code + -Wlogical-op # warn about logical operations being used where bitwise were + # probably wanted ) if(MSVC) @@ -85,5 +88,4 @@ function(set_project_warnings project_name) endif() target_compile_options(${project_name} INTERFACE ${PROJECT_WARNINGS}) - endfunction() diff --git a/cmake-external/doctest.cmake b/cmake-external/doctest.cmake index 5cb63c5fe..0b4c12f38 100644 --- a/cmake-external/doctest.cmake +++ b/cmake-external/doctest.cmake @@ -95,8 +95,12 @@ same as the doctest name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``. # ------------------------------------------------------------------------------ function(doctest_discover_tests TARGET) cmake_parse_arguments( - "" "" "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST" - "TEST_SPEC;EXTRA_ARGS;PROPERTIES" ${ARGN}) + "" + "" + "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST" + "TEST_SPEC;EXTRA_ARGS;PROPERTIES" + ${ARGN} + ) if(NOT _WORKING_DIRECTORY) set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") @@ -110,14 +114,19 @@ function(doctest_discover_tests TARGET) string(SUBSTRING ${args_hash} 0 7 args_hash) # Define rule to generate test list for aforementioned test executable - set(ctest_include_file - "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake") - set(ctest_tests_file - "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake") + set( + ctest_include_file + "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake" + ) + set( + ctest_tests_file + "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake" + ) get_property( crosscompiling_emulator TARGET ${TARGET} - PROPERTY CROSSCOMPILING_EMULATOR) + PROPERTY CROSSCOMPILING_EMULATOR + ) add_custom_command( TARGET ${TARGET} POST_BUILD @@ -131,39 +140,40 @@ function(doctest_discover_tests TARGET) "TEST_PREFIX=${_TEST_PREFIX}" -D "TEST_SUFFIX=${_TEST_SUFFIX}" -D "TEST_LIST=${_TEST_LIST}" -D "CTEST_FILE=${ctest_tests_file}" -P "${_DOCTEST_DISCOVER_TESTS_SCRIPT}" - VERBATIM) + VERBATIM + ) file( - WRITE "${ctest_include_file}" + WRITE + "${ctest_include_file}" "if(EXISTS \"${ctest_tests_file}\")\n" " include(\"${ctest_tests_file}\")\n" "else()\n" " add_test(${TARGET}_NOT_BUILT-${args_hash} ${TARGET}_NOT_BUILT-${args_hash})\n" - "endif()\n") + "endif()\n" + ) if(NOT CMAKE_VERSION VERSION_LESS 3.10) # Add discovered tests to directory TEST_INCLUDE_FILES set_property( DIRECTORY APPEND - PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}") + PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}" + ) else() # Add discovered tests as directory TEST_INCLUDE_FILE if possible - get_property( - test_include_file_set - DIRECTORY - PROPERTY TEST_INCLUDE_FILE - SET) + get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET) if(NOT ${test_include_file_set}) set_property(DIRECTORY PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}") else() message(FATAL_ERROR "Cannot set more than one TEST_INCLUDE_FILE") endif() endif() - endfunction() # ############################################################################## -set(_DOCTEST_DISCOVER_TESTS_SCRIPT - ${CMAKE_CURRENT_LIST_DIR}/doctestAddTests.cmake) +set( + _DOCTEST_DISCOVER_TESTS_SCRIPT + ${CMAKE_CURRENT_LIST_DIR}/doctestAddTests.cmake +) diff --git a/cmake-external/doctestAddTests.cmake b/cmake-external/doctestAddTests.cmake index ca3394e68..689ec75de 100644 --- a/cmake-external/doctestAddTests.cmake +++ b/cmake-external/doctestAddTests.cmake @@ -19,15 +19,15 @@ function(add_command NAME) set(_args "${_args} ${_arg}") endif() endforeach() - set(script - "${script}${NAME}(${_args})\n" - PARENT_SCOPE) + set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE) endfunction() # Run test executable to get list of available tests if(NOT EXISTS "${TEST_EXECUTABLE}") message( - FATAL_ERROR "Specified test executable '${TEST_EXECUTABLE}' does not exist") + FATAL_ERROR + "Specified test executable '${TEST_EXECUTABLE}' does not exist" + ) endif() if("${spec}" MATCHES .) @@ -37,30 +37,49 @@ endif() execute_process( COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-cases OUTPUT_VARIABLE output - RESULT_VARIABLE result) + RESULT_VARIABLE result +) if(NOT ${result} EQUAL 0) - message(FATAL_ERROR "Error running test executable '${TEST_EXECUTABLE}':\n" - " Result: ${result}\n" " Output: ${output}\n") + message( + FATAL_ERROR + "Error running test executable '${TEST_EXECUTABLE}':\n" + " Result: ${result}\n" + " Output: ${output}\n" + ) endif() string(REPLACE "\n" ";" output "${output}") # Parse output foreach(line ${output}) - if("${line}" - STREQUAL - "===============================================================================" - OR "${line}" MATCHES [==[^\[doctest\] ]==]) + if( + "${line}" + STREQUAL + "===============================================================================" + OR "${line}" MATCHES [==[^\[doctest\] ]==] + ) continue() endif() set(test ${line}) # use escape commas to handle properly test cases with commas inside the name string(REPLACE "," "\\," test_name ${test}) # ...and add to script - add_command(add_test "${prefix}${test}${suffix}" ${TEST_EXECUTOR} - "${TEST_EXECUTABLE}" "--test-case=${test_name}" ${extra_args}) - add_command(set_tests_properties "${prefix}${test}${suffix}" PROPERTIES - WORKING_DIRECTORY "${TEST_WORKING_DIR}" ${properties}) + add_command( + add_test + "${prefix}${test}${suffix}" + ${TEST_EXECUTOR} + "${TEST_EXECUTABLE}" + "--test-case=${test_name}" + ${extra_args} + ) + add_command( + set_tests_properties + "${prefix}${test}${suffix}" + PROPERTIES + WORKING_DIRECTORY + "${TEST_WORKING_DIR}" + ${properties} + ) list(APPEND tests "${prefix}${test}${suffix}") endforeach() diff --git a/cmake-external/extra_local_settings.cmake b/cmake-external/extra_local_settings.cmake index 709c10756..7e1687e4f 100644 --- a/cmake-external/extra_local_settings.cmake +++ b/cmake-external/extra_local_settings.cmake @@ -1,11 +1,16 @@ -option(ENABLE_IPO - "Enable Iterprocedural Optimization, aka Link Time Optimization (LTO)" - OFF) +option( + ENABLE_IPO + "Enable Iterprocedural Optimization, aka Link Time Optimization (LTO)" + OFF +) option(ARCH_NATIVE "Build with -march=native" OFF) option(USE_LIBCXX "Use the libc++ STL" OFF) -option(ENABLE_BUILD_WITH_TIME_TRACE - "Enable -ftime-trace to generate time tracing .json files on clang" OFF) +option( + ENABLE_BUILD_WITH_TIME_TRACE + "Enable -ftime-trace to generate time tracing .json files on clang" + OFF +) if(ENABLE_BUILD_WITH_TIME_TRACE AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") add_compile_options("-ftime-trace") endif() @@ -27,11 +32,11 @@ endif() if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Debug' as none was specified.") - set(CMAKE_BUILD_TYPE - Debug - CACHE STRING "Choose the type of build." FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" - "MinSizeRel" "RelWithDebInfo") + set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) + set_property( + CACHE CMAKE_BUILD_TYPE + PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo" + ) endif() if(ENABLE_IPO) diff --git a/cmake-external/sanitizers.cmake b/cmake-external/sanitizers.cmake index ccb4c5546..7c54c8eb4 100644 --- a/cmake-external/sanitizers.cmake +++ b/cmake-external/sanitizers.cmake @@ -1,7 +1,8 @@ function(enable_sanitizers project_name) - - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL - "Clang") + if( + CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + ) option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" FALSE) if(ENABLE_COVERAGE) @@ -14,23 +15,34 @@ function(enable_sanitizers project_name) option(ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" OFF) if(ENABLE_SANITIZER_ADDRESS) list(APPEND SANITIZERS "address") - target_compile_options(${project_name} - INTERFACE -fsanitize-address-use-after-scope) - target_link_libraries(${project_name} - INTERFACE -fsanitize-address-use-after-scope) + target_compile_options( + ${project_name} + INTERFACE -fsanitize-address-use-after-scope + ) + target_link_libraries( + ${project_name} + INTERFACE -fsanitize-address-use-after-scope + ) endif() option(ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" OFF) if(ENABLE_SANITIZER_MEMORY) list(APPEND SANITIZERS "memory") - target_compile_options(${project_name} - INTERFACE -fsanitize-memory-track-origins=2) - target_link_libraries(${project_name} - INTERFACE -fsanitize-memory-track-origins=2) + target_compile_options( + ${project_name} + INTERFACE -fsanitize-memory-track-origins=2 + ) + target_link_libraries( + ${project_name} + INTERFACE -fsanitize-memory-track-origins=2 + ) endif() - option(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR - "Enable undefined behavior sanitizer" OFF) + option( + ENABLE_SANITIZER_UNDEFINED_BEHAVIOR + "Enable undefined behavior sanitizer" + OFF + ) if(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR) list(APPEND SANITIZERS "undefined") endif() @@ -41,20 +53,24 @@ function(enable_sanitizers project_name) endif() list(JOIN SANITIZERS "," LIST_OF_SANITIZERS) - endif() if(LIST_OF_SANITIZERS) if(NOT "${LIST_OF_SANITIZERS}" STREQUAL "") target_compile_options( ${project_name} - INTERFACE -fsanitize=${LIST_OF_SANITIZERS} -fno-omit-frame-pointer - -fno-optimize-sibling-calls) + INTERFACE + -fsanitize=${LIST_OF_SANITIZERS} + -fno-omit-frame-pointer + -fno-optimize-sibling-calls + ) target_link_libraries( ${project_name} - INTERFACE -fsanitize=${LIST_OF_SANITIZERS} -fno-omit-frame-pointer - -fno-optimize-sibling-calls) + INTERFACE + -fsanitize=${LIST_OF_SANITIZERS} + -fno-omit-frame-pointer + -fno-optimize-sibling-calls + ) endif() endif() - endfunction() diff --git a/cmake-external/static_analyzers.cmake b/cmake-external/static_analyzers.cmake index 5878823e4..255478f11 100644 --- a/cmake-external/static_analyzers.cmake +++ b/cmake-external/static_analyzers.cmake @@ -3,8 +3,15 @@ option(ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" OFF) if(ENABLE_CPPCHECK) find_program(CPPCHECK cppcheck) if(CPPCHECK) - set(CMAKE_CXX_CPPCHECK ${CPPCHECK} --suppress=missingInclude --enable=all - --inconclusive -i ${CMAKE_SOURCE_DIR}/imgui/lib) + set( + CMAKE_CXX_CPPCHECK + ${CPPCHECK} + --suppress=missingInclude + --enable=all + --inconclusive + -i + ${CMAKE_SOURCE_DIR}/imgui/lib + ) else() message(SEND_ERROR "cppcheck requested but executable not found") endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 1e027648d..6208b183a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -7,11 +7,12 @@ endif(BUILD_PYTHON_INTERFACE) if(TEST_JULIA_INTERFACE) find_package(Julia REQUIRED) - julia_check_package(PyCall) + JULIA_CHECK_PACKAGE(PyCall) if(NOT Julia_PyCall_found) message( FATAL_ERROR - "PyCall not installed. Please use import Pkg; Pkg.add(\"PyCall\")") + "PyCall not installed. Please use import Pkg; Pkg.add(\"PyCall\")" + ) endif() add_subdirectory(julia) endif() diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt index fc055fc2e..6ae1bd686 100644 --- a/examples/cpp/CMakeLists.txt +++ b/examples/cpp/CMakeLists.txt @@ -7,7 +7,7 @@ add_custom_target(${PROJECT_NAME}-example-cpp) function(ADD_PROXSUITE_CPP_EXAMPLE EXAMPLE) get_filename_component(EXAMPLE_NAME ${EXAMPLE} NAME_WE) set(EXAMPLE_TARGET "${PROJECT_NAME}-example-cpp-${EXAMPLE_NAME}") - add_unit_test(${EXAMPLE_TARGET} "${EXAMPLE}") + ADD_UNIT_TEST(${EXAMPLE_TARGET} "${EXAMPLE}") target_link_libraries(${EXAMPLE_TARGET} PRIVATE proxsuite-test-util) add_dependencies(${PROJECT_NAME}-example-cpp ${EXAMPLE_TARGET}) diff --git a/examples/julia/CMakeLists.txt b/examples/julia/CMakeLists.txt index e7022ade0..051eb61a4 100644 --- a/examples/julia/CMakeLists.txt +++ b/examples/julia/CMakeLists.txt @@ -1,8 +1,15 @@ file(GLOB_RECURSE ${PROJECT_NAME}_JULIA_EXAMPLES *.jl) foreach(EXAMPLE ${${PROJECT_NAME}_JULIA_EXAMPLES}) - string(REGEX REPLACE "${PROJECT_SOURCE_DIR}/examples/julia/" "" EXAMPLE - ${EXAMPLE}) - add_julia_unit_test("${PROJECT_NAME}-example-jl-${EXAMPLE}" - "examples/julia/${EXAMPLE}") + string( + REGEX REPLACE + "${PROJECT_SOURCE_DIR}/examples/julia/" + "" + EXAMPLE + ${EXAMPLE} + ) + ADD_JULIA_UNIT_TEST( + "${PROJECT_NAME}-example-jl-${EXAMPLE}" + "examples/julia/${EXAMPLE}" + ) endforeach() diff --git a/examples/python/CMakeLists.txt b/examples/python/CMakeLists.txt index fb26dcb3c..31f46b63d 100644 --- a/examples/python/CMakeLists.txt +++ b/examples/python/CMakeLists.txt @@ -3,6 +3,9 @@ file(GLOB_RECURSE ${PROJECT_NAME}_PYTHON_EXAMPLES *.py) foreach(EXAMPLE_FILE ${${PROJECT_NAME}_PYTHON_EXAMPLES}) get_filename_component(EXAMPLE_NAME ${EXAMPLE_FILE} NAME_WE) string(REGEX REPLACE "${PROJECT_SOURCE_DIR}" "" EXAMPLE_FILE ${EXAMPLE_FILE}) - add_python_unit_test("${PROJECT_NAME}-example-py-${EXAMPLE_NAME}" - "${EXAMPLE_FILE}" "bindings/python") + ADD_PYTHON_UNIT_TEST( + "${PROJECT_NAME}-example-py-${EXAMPLE_NAME}" + "${EXAMPLE_FILE}" + "bindings/python" + ) endforeach() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f1fcd7a95..dbea3694d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -8,10 +8,15 @@ target_link_libraries(cnpy Eigen3::Eigen) target_include_directories(cnpy PUBLIC ./include) file(GLOB_RECURSE TEST_HEADERS ./include/*.hpp) -add_header_group(TEST_HEADERS) +ADD_HEADER_GROUP(TEST_HEADERS) -add_library(proxsuite-test-util STATIC ./src/util_f64.cpp ./src/util_f32.cpp - ${TEST_HEADERS}) +add_library( + proxsuite-test-util + STATIC + ./src/util_f64.cpp + ./src/util_f32.cpp + ${TEST_HEADERS} +) target_include_directories(proxsuite-test-util PUBLIC ./include) if(BUILD_WITH_VECTORIZATION_SUPPORT) target_link_libraries(proxsuite-test-util proxsuite-vectorized matio) @@ -23,10 +28,14 @@ macro(proxsuite_test name path) set(target_name ${PROJECT_NAME}-test-cpp-${name}) add_executable(${target_name} ${path}) doctest_discover_tests(${target_name}) - target_link_libraries(${target_name} PUBLIC proxsuite ${PROJECT_NAME}-doctest - proxsuite-test-util) - target_compile_definitions(${target_name} - PRIVATE PROBLEM_PATH="${CMAKE_CURRENT_SOURCE_DIR}") + target_link_libraries( + ${target_name} + PUBLIC proxsuite ${PROJECT_NAME}-doctest proxsuite-test-util + ) + target_compile_definitions( + ${target_name} + PRIVATE PROBLEM_PATH="${CMAKE_CURRENT_SOURCE_DIR}" + ) add_dependencies(build_tests ${target_name}) endmacro() @@ -46,16 +55,15 @@ proxsuite_test(cvxpy src/cvxpy.cpp) if(BUILD_WITH_OPENMP_SUPPORT) proxsuite_test(parallel src/parallel_qp_solve.cpp) - target_link_libraries(${PROJECT_NAME}-test-cpp-parallel - PRIVATE OpenMP::OpenMP_CXX) + target_link_libraries( + ${PROJECT_NAME}-test-cpp-parallel + PRIVATE OpenMP::OpenMP_CXX + ) endif() # Test serialization macro(ADD_TEST_CFLAGS target flag) - set_property( - TARGET ${target} - APPEND_STRING - PROPERTY COMPILE_FLAGS " ${flag}") + set_property(TARGET ${target} APPEND_STRING PROPERTY COMPILE_FLAGS " ${flag}") endmacro() make_directory("${CMAKE_CURRENT_BINARY_DIR}/serialization-data") @@ -65,12 +73,16 @@ add_test_cflags( "-DTEST_SERIALIZATION_FOLDER=\\\\\"${CMAKE_CURRENT_BINARY_DIR}/serialization-data\\\\\"" ) if(cereal_FOUND) - target_link_libraries(${PROJECT_NAME}-test-cpp-serialization - PRIVATE cereal::cereal) + target_link_libraries( + ${PROJECT_NAME}-test-cpp-serialization + PRIVATE cereal::cereal + ) else() target_include_directories( - ${PROJECT_NAME}-test-cpp-serialization SYSTEM - PRIVATE ${PROJECT_SOURCE_DIR}/external/cereal/include) + ${PROJECT_NAME}-test-cpp-serialization + SYSTEM + PRIVATE ${PROJECT_SOURCE_DIR}/external/cereal/include + ) endif() if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT MSVC) @@ -81,16 +93,24 @@ endif() if(BUILD_PYTHON_INTERFACE) file(GLOB_RECURSE ${PROJECT_NAME}_PYTHON_UNITTEST *.py) - if((CMAKE_BUILD_TYPE STREQUAL "Debug" AND MSVC) OR NOT - BUILD_WITH_OPENMP_SUPPORT) - list_filter("${${PROJECT_NAME}_PYTHON_UNITTEST}" "parallel_qp_solve" - ${PROJECT_NAME}_PYTHON_UNITTEST) + if( + (CMAKE_BUILD_TYPE STREQUAL "Debug" AND MSVC) + OR NOT BUILD_WITH_OPENMP_SUPPORT + ) + list_filter( + "${${PROJECT_NAME}_PYTHON_UNITTEST}" + "parallel_qp_solve" + ${PROJECT_NAME}_PYTHON_UNITTEST + ) endif() foreach(TEST_FILE ${${PROJECT_NAME}_PYTHON_UNITTEST}) get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE) string(REGEX REPLACE "${PROJECT_SOURCE_DIR}/" "" TEST_FILE ${TEST_FILE}) - add_python_unit_test("${PROJECT_NAME}-test-py-${TEST_NAME}" "${TEST_FILE}" - "bindings/python") + ADD_PYTHON_UNIT_TEST( + "${PROJECT_NAME}-test-py-${TEST_NAME}" + "${TEST_FILE}" + "bindings/python" + ) endforeach() endif(BUILD_PYTHON_INTERFACE)