From 9d7499bddc548b735260988316211e5f698aeae5 Mon Sep 17 00:00:00 2001 From: Milian Wolff Date: Wed, 9 Jun 2021 11:48:31 +0200 Subject: [PATCH] Allow building against system libs instead of bundled dependencies When DIP_BUILD_BUNDLED_DEPENDENCIES=OFF is passed to cmake, we will rely on find_package to find Eigen3, zlib, jpeg, ics and tiff libraries. The fftw_api.h header will always be used, as it's not public API that's included in the fftw3 package on ArchLinux e.g. The default for this option is still ON, i.e. this is an opt-in feature. To allow building against an externally provided doctest, the includes are normalized to follow the suggested upstream format: ``` #include ``` Change-Id: I4ed9095eefbfd889642d1c3d42b3d9af0dfc15ae --- CMakeLists.txt | 3 + dependencies/libics/CMakeLists.txt | 4 +- dependencies/libtiff/CMakeLists.txt | 6 +- pydip/CMakeLists.txt | 6 +- src/CMakeLists.txt | 58 ++++++++++++++----- src/analysis/findshift.cpp | 2 +- src/binary/binary_basic.cpp | 2 +- src/binary/sup_inf_generator.cpp | 2 +- src/color/color.cpp | 2 +- src/detection/hough.cpp | 2 +- src/distance/separable_dt.cpp | 2 +- src/file_io/ics.cpp | 2 +- src/file_io/tiff_write.cpp | 2 +- src/geometry/interpolation.cpp | 2 +- src/histogram/distribution.cpp | 2 +- src/histogram/histogram.cpp | 2 +- src/library/copy_buffer.cpp | 2 +- src/library/graph.cpp | 2 +- src/library/image_copy.cpp | 2 +- src/library/image_data.cpp | 2 +- src/library/image_indexing.cpp | 2 +- src/library/image_manip.cpp | 2 +- src/library/image_views.cpp | 2 +- src/library/iterators.cpp | 2 +- src/library/neighborhood.cpp | 2 +- src/library/physical_dimensions.cpp | 2 +- src/library/pixel_table.cpp | 2 +- src/library/types.cpp | 2 +- src/library/unit_tests.cpp | 6 +- src/linear/convolution.cpp | 2 +- src/linear/finitediff.cpp | 2 +- src/linear/gauss.cpp | 2 +- src/linear/gaussiir.cpp | 2 +- src/linear/separate_filter.cpp | 2 +- src/mapping/lookup_table.cpp | 2 +- src/math/arithmetic.cpp | 2 +- src/math/projection.cpp | 2 +- src/measurement/chain_code.cpp | 2 +- src/measurement/image_chain_code.cpp | 2 +- src/measurement/measure_polygon.cpp | 2 +- src/measurement/measurement.cpp | 2 +- src/measurement/polygon.cpp | 2 +- src/morphology/basic.cpp | 2 +- src/regions/label.cpp | 2 +- src/support/accumulators.cpp | 2 +- src/support/gaussian_mixture.cpp | 2 +- src/support/matrix.cpp | 2 +- src/support/numeric.cpp | 2 +- src/transform/fourier.cpp | 2 +- tools/FindEigen3.cmake | 83 ++++++++++++++++++++++++++++ tools/FindICS.cmake | 48 ++++++++++++++++ 51 files changed, 235 insertions(+), 65 deletions(-) create mode 100644 tools/FindEigen3.cmake create mode 100644 tools/FindICS.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 96546898a..ee1c37580 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,9 @@ endif() set(DIP_SHARED_LIBRARY ON CACHE BOOL "Build a shared library (off for static library)") set(BUILD_SHARED_LIBS ${DIP_SHARED_LIBRARY}) +# build bundled dependencies or use find_package? +set(DIP_BUILD_BUNDLED_DEPENDENCIES ON CACHE BOOL "Build the bundled dependencies or use find_package otherwise") + # Installation path set(CMAKE_INSTALL_PREFIX "${CMAKE_BUILD_TYPE}" CACHE PATH "Installation directory") set(DOCUMENTATION_OUTPUT share/doc/DIPlib) diff --git a/dependencies/libics/CMakeLists.txt b/dependencies/libics/CMakeLists.txt index 572f64bb1..a24ebbd6d 100644 --- a/dependencies/libics/CMakeLists.txt +++ b/dependencies/libics/CMakeLists.txt @@ -100,8 +100,8 @@ endif(UNIX) #endif() # DIPlib-specific zlib -if(TARGET zlibstatic) - target_link_libraries(libics PRIVATE zlibstatic) +if(TARGET ZLIB::ZLIB) + target_link_libraries(libics PRIVATE ZLIB::ZLIB) target_compile_definitions(libics PUBLIC -DICS_ZLIB) endif() diff --git a/dependencies/libtiff/CMakeLists.txt b/dependencies/libtiff/CMakeLists.txt index 8d08268e1..2dd46696c 100644 --- a/dependencies/libtiff/CMakeLists.txt +++ b/dependencies/libtiff/CMakeLists.txt @@ -378,7 +378,7 @@ set(MDI_SUPPORT TRUE) # ZLIB set(ZLIB_SUPPORT FALSE) -if(TARGET zlibstatic) +if(TARGET ZLIB::ZLIB) set(ZLIB_SUPPORT TRUE) endif() set(ZIP_SUPPORT ${ZLIB_SUPPORT}) @@ -468,10 +468,10 @@ if(M_LIBRARY) list(APPEND TIFF_LIBRARY_DEPS ${M_LIBRARY}) endif() if(ZLIB_SUPPORT) - list(APPEND TIFF_LIBRARY_DEPS zlibstatic) + list(APPEND TIFF_LIBRARY_DEPS ZLIB::ZLIB) endif() if(JPEG_SUPPORT) - list(APPEND TIFF_LIBRARY_DEPS jpeg) + list(APPEND TIFF_LIBRARY_DEPS JPEG::JPEG) endif() if(JPEG12_LIBRARIES) list(APPEND TIFF_LIBRARY_DEPS ${JPEG12_LIBRARIES}) diff --git a/pydip/CMakeLists.txt b/pydip/CMakeLists.txt index 145e7d3ab..239a9528b 100644 --- a/pydip/CMakeLists.txt +++ b/pydip/CMakeLists.txt @@ -1,5 +1,9 @@ set(PYBIND11_PYTHON_VERSION ${PYTHON_VERSION}) # Avoid a warning message -add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/pybind11" "${PROJECT_BINARY_DIR}/pybind11" EXCLUDE_FROM_ALL) +if(DIP_BUILD_BUNDLED_DEPENDENCIES) + add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/pybind11" "${PROJECT_BINARY_DIR}/pybind11" EXCLUDE_FROM_ALL) +else() + find_package(pybind11 REQUIRED) +endif() # Find sources file(GLOB DIP_PYTHON_SRC "${CMAKE_CURRENT_LIST_DIR}/src/*.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/*.h") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9b9df17b4..43e189a20 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -68,7 +68,15 @@ endif() # that uses DIPlib, hence we define a variable here that removes all of DocTest from the DIPlib sources. set(DIP_ENABLE_DOCTEST ON CACHE BOOL "Turn off to not include doctest.h in the library headers") if(DIP_ENABLE_DOCTEST) - target_include_directories(DIP PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/doctest") + if(DIP_BUILD_BUNDLED_DEPENDENCIES) + list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/dependencies/doctest") + add_library(doctest INTERFACE) + target_include_directories(doctest INTERFACE "${PROJECT_SOURCE_DIR}/dependencies") + add_library(doctest::doctest ALIAS doctest) + else() + find_package(doctest REQUIRED) + endif() + target_link_libraries(DIP PRIVATE doctest::doctest) target_compile_definitions(DIP PRIVATE DIP_CONFIG_ENABLE_DOCTEST DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES @@ -95,7 +103,12 @@ endif() set(HAS_128_INT ${HAS_128_INT} PARENT_SCOPE) # Eigen -target_include_directories(DIP PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/eigen3") +if(DIP_BUILD_BUNDLED_DEPENDENCIES) + target_include_directories(DIP PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/eigen3") +else() + find_package(Eigen3 REQUIRED) + target_include_directories(DIP PRIVATE ${EIGEN3_INCLUDE_DIR}) +endif() target_compile_definitions(DIP PRIVATE EIGEN_MPL2_ONLY # This makes sure we only use parts of the Eigen library that use the MPL2 license or more permissive ones. EIGEN_DONT_PARALLELIZE) # This to prevent Eigen algorithms trying to run in parallel -- we parallelize at a larger scale. @@ -103,31 +116,51 @@ target_compile_definitions(DIP PRIVATE # zlib (for use in libics and libtiff) set(DIP_ENABLE_ZLIB ON CACHE BOOL "Enable zlib compression in ICS and TIFF (deflate)") if(DIP_ENABLE_ZLIB) - add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/zlib" "${PROJECT_BINARY_DIR}/zlib" EXCLUDE_FROM_ALL) + if(DIP_BUILD_BUNDLED_DEPENDENCIES) + add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/zlib" "${PROJECT_BINARY_DIR}/zlib" EXCLUDE_FROM_ALL) + add_library(ZLIB::ZLIB ALIAS zlibstatic) + else() + find_package(ZLIB REQUIRED) + endif() endif() # libjpeg (for use in libtiff) set(DIP_ENABLE_JPEG ON CACHE BOOL "Enable JPEG file support and compression in TIFF") if(DIP_ENABLE_JPEG) - add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libjpeg" "${PROJECT_BINARY_DIR}/libjpeg" EXCLUDE_FROM_ALL) - target_link_libraries(DIP PRIVATE jpeg) + if(DIP_BUILD_BUNDLED_DEPENDENCIES) + add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libjpeg" "${PROJECT_BINARY_DIR}/libjpeg" EXCLUDE_FROM_ALL) + add_library(JPEG::JPEG ALIAS jpeg) + else() + find_package(JPEG REQUIRED) + endif() + target_link_libraries(DIP PRIVATE JPEG::JPEG) target_compile_definitions(DIP PRIVATE DIP_CONFIG_HAS_JPEG) endif() # libics set(DIP_ENABLE_ICS ON CACHE BOOL "Enable ICS file support") if(DIP_ENABLE_ICS) - set(LIBICS_INCLUDE_CPP Off) # TODO: we should start using the C++ interface - add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libics" "${PROJECT_BINARY_DIR}/libics" EXCLUDE_FROM_ALL) - target_link_libraries(DIP PRIVATE libics) + if(DIP_BUILD_BUNDLED_DEPENDENCIES) + set(LIBICS_INCLUDE_CPP Off) # TODO: we should start using the C++ interface + add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libics" "${PROJECT_BINARY_DIR}/libics" EXCLUDE_FROM_ALL) + add_library(ICS::ICS ALIAS libics) + else() + find_package(ICS REQUIRED) + endif() + target_link_libraries(DIP PRIVATE ICS::ICS) target_compile_definitions(DIP PRIVATE DIP_CONFIG_HAS_ICS) endif() # libtiff set(DIP_ENABLE_TIFF ON CACHE BOOL "Enable TIFF file support") if(DIP_ENABLE_TIFF) - add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libtiff" "${PROJECT_BINARY_DIR}/libtiff" EXCLUDE_FROM_ALL) - target_link_libraries(DIP PRIVATE tiff) + if(DIP_BUILD_BUNDLED_DEPENDENCIES) + add_subdirectory("${PROJECT_SOURCE_DIR}/dependencies/libtiff" "${PROJECT_BINARY_DIR}/libtiff" EXCLUDE_FROM_ALL) + add_library(TIFF::TIFF ALIAS tiff) + else() + find_package(TIFF REQUIRED) + endif() + target_link_libraries(DIP PRIVATE TIFF::TIFF) target_compile_definitions(DIP PRIVATE DIP_CONFIG_HAS_TIFF) endif() @@ -157,8 +190,7 @@ install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/" DESTINATION include # DIPlib unit tests if(DIP_ENABLE_DOCTEST) add_executable(unit_tests EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/library/unit_tests.cpp") - target_include_directories(unit_tests PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/doctest") - target_link_libraries(unit_tests PRIVATE DIP) + target_link_libraries(unit_tests PRIVATE DIP doctest::doctest) target_compile_definitions(unit_tests PRIVATE DIP_IMPLEMENT_UNIT_TESTS DIP_CONFIG_ENABLE_DOCTEST @@ -171,7 +203,7 @@ if(DIP_ENABLE_DOCTEST) set_target_properties(unit_tests PROPERTIES INSTALL_RPATH "$ORIGIN") endif() else() - include("${PROJECT_SOURCE_DIR}/dependencies/doctest/doctest_force_link_static_lib_in_target.cmake") + include(doctest_force_link_static_lib_in_target.cmake) doctest_force_link_static_lib_in_target(unit_tests DIP) # This pulls in all object files from the static DIP library endif() add_custom_target(check COMMAND unit_tests) diff --git a/src/analysis/findshift.cpp b/src/analysis/findshift.cpp index e2daf95d6..322c24e8f 100644 --- a/src/analysis/findshift.cpp +++ b/src/analysis/findshift.cpp @@ -426,7 +426,7 @@ FloatArray FindShift( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/generation.h" DOCTEST_TEST_CASE("[DIPlib] testing the FindShift function") { diff --git a/src/binary/binary_basic.cpp b/src/binary/binary_basic.cpp index a84696a2f..185fdd533 100644 --- a/src/binary/binary_basic.cpp +++ b/src/binary/binary_basic.cpp @@ -225,7 +225,7 @@ void BinaryAreaOpening( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/statistics.h" DOCTEST_TEST_CASE("[DIPlib] testing the binary morphological filters") { diff --git a/src/binary/sup_inf_generator.cpp b/src/binary/sup_inf_generator.cpp index 7e340e79d..13a3f0a7a 100644 --- a/src/binary/sup_inf_generator.cpp +++ b/src/binary/sup_inf_generator.cpp @@ -620,7 +620,7 @@ IntervalArray ConvexHullInterval2D() { } #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/testing.h" DOCTEST_TEST_CASE("[DIPlib] testing private function RotateBy45Degrees") { diff --git a/src/color/color.cpp b/src/color/color.cpp index b6b33a701..5e65aa475 100644 --- a/src/color/color.cpp +++ b/src/color/color.cpp @@ -395,7 +395,7 @@ void ColorSpaceManager::SetWhitePoint( dip::XYZ whitePoint ) { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/math.h" DOCTEST_TEST_CASE("[DIPlib] testing the ColorSpaceManager class") { diff --git a/src/detection/hough.cpp b/src/detection/hough.cpp index 5cd89558f..4eaf48cbc 100644 --- a/src/detection/hough.cpp +++ b/src/detection/hough.cpp @@ -325,7 +325,7 @@ FloatCoordinateArray FindHoughCircles( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/linear.h" #include "diplib/segmentation.h" #include "diplib/math.h" diff --git a/src/distance/separable_dt.cpp b/src/distance/separable_dt.cpp index f584b47fb..30d3b29f5 100644 --- a/src/distance/separable_dt.cpp +++ b/src/distance/separable_dt.cpp @@ -216,7 +216,7 @@ void SeparableDistanceTransform( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/math.h" #include "diplib/statistics.h" #include "diplib/generation.h" diff --git a/src/file_io/ics.cpp b/src/file_io/ics.cpp index 419c22b7d..7a95f76aa 100644 --- a/src/file_io/ics.cpp +++ b/src/file_io/ics.cpp @@ -816,7 +816,7 @@ void ImageWriteICS( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/testing.h" DOCTEST_TEST_CASE( "[DIPlib] testing ICS file reading and writing" ) { diff --git a/src/file_io/tiff_write.cpp b/src/file_io/tiff_write.cpp index ab1989d6b..d9913a0eb 100644 --- a/src/file_io/tiff_write.cpp +++ b/src/file_io/tiff_write.cpp @@ -374,7 +374,7 @@ void ImageWriteTIFF( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/testing.h" DOCTEST_TEST_CASE( "[DIPlib] testing TIFF file reading and writing" ) { diff --git a/src/geometry/interpolation.cpp b/src/geometry/interpolation.cpp index ea1b724c2..42aae8d6d 100644 --- a/src/geometry/interpolation.cpp +++ b/src/geometry/interpolation.cpp @@ -654,7 +654,7 @@ void Rotation( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/generation.h" #include "diplib/transform.h" #include "diplib/testing.h" diff --git a/src/histogram/distribution.cpp b/src/histogram/distribution.cpp index 961eb2705..b0093d6f7 100644 --- a/src/histogram/distribution.cpp +++ b/src/histogram/distribution.cpp @@ -244,7 +244,7 @@ void Distribution::SetSampling( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/random.h" DOCTEST_TEST_CASE( "[DIPlib] testing dip::Distribution" ) { diff --git a/src/histogram/histogram.cpp b/src/histogram/histogram.cpp index efcbb7a45..2fd45b2fb 100644 --- a/src/histogram/histogram.cpp +++ b/src/histogram/histogram.cpp @@ -593,7 +593,7 @@ Histogram& Histogram::Smooth( FloatArray sigma ) { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/random.h" DOCTEST_TEST_CASE( "[DIPlib] testing dip::Histogram" ) { diff --git a/src/library/copy_buffer.cpp b/src/library/copy_buffer.cpp index 26d6a3e12..56c6728f3 100644 --- a/src/library/copy_buffer.cpp +++ b/src/library/copy_buffer.cpp @@ -758,7 +758,7 @@ void ExpandBuffer( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include DOCTEST_TEST_CASE("[DIPlib] testing the CopyBuffer function") { diff --git a/src/library/graph.cpp b/src/library/graph.cpp index 7e0a45631..0a7e17abc 100644 --- a/src/library/graph.cpp +++ b/src/library/graph.cpp @@ -520,7 +520,7 @@ LowestCommonAncestorSolver::LowestCommonAncestorSolver( Graph const& graph ) } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing dip::Graph") { dip::Image img( { 4, 5 }, 1, dip::DT_UINT8 ); diff --git a/src/library/image_copy.cpp b/src/library/image_copy.cpp index 4b3501885..9b5d3cd26 100644 --- a/src/library/image_copy.cpp +++ b/src/library/image_copy.cpp @@ -642,7 +642,7 @@ void Image::Fill( Image::Sample const& sample ) { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE( "[DIPlib] testing dip::Image::SwapBytesInSample" ) { dip::Image img( { 5, 8 }, 3, dip::DT_SINT16 ); diff --git a/src/library/image_data.cpp b/src/library/image_data.cpp index d1a39fc17..a13c70f3c 100644 --- a/src/library/image_data.cpp +++ b/src/library/image_data.cpp @@ -746,7 +746,7 @@ CoordinatesComputer Image::IndexToCoordinatesComputer() const { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/random.h" DOCTEST_TEST_CASE( "[DIPlib] testing dip::Image::Forge" ) { diff --git a/src/library/image_indexing.cpp b/src/library/image_indexing.cpp index 5c0607afc..309bb7dd7 100644 --- a/src/library/image_indexing.cpp +++ b/src/library/image_indexing.cpp @@ -160,7 +160,7 @@ void DefineROI( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing image indexing") { // Note that this also tests parts of dip::Image::View and dip::Image::Pixel functionality, which is diff --git a/src/library/image_manip.cpp b/src/library/image_manip.cpp index 2c0864ae2..bd1a053ca 100644 --- a/src/library/image_manip.cpp +++ b/src/library/image_manip.cpp @@ -626,7 +626,7 @@ RangeArray Image::CropWindow( UnsignedArray const& sizes, String const& cropLoca #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing dip::Image dimension manipulation functions") { dip::Image src( { 5, 10, 15 }, 3 ); diff --git a/src/library/image_views.cpp b/src/library/image_views.cpp index 0448b973c..82abd421b 100644 --- a/src/library/image_views.cpp +++ b/src/library/image_views.cpp @@ -430,7 +430,7 @@ Image::View::Iterator Image::View::end() const { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/testing.h" DOCTEST_TEST_CASE( "[DIPlib] testing dip::Image::Pixel and related classes" ) { diff --git a/src/library/iterators.cpp b/src/library/iterators.cpp index a02db9e1e..6e06b1a5e 100644 --- a/src/library/iterators.cpp +++ b/src/library/iterators.cpp @@ -19,7 +19,7 @@ */ #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/generic_iterators.h" DOCTEST_TEST_CASE("[DIPlib] testing ImageIterator and GenericImageIterator") { diff --git a/src/library/neighborhood.cpp b/src/library/neighborhood.cpp index 9b6ac9544..35b600b1c 100644 --- a/src/library/neighborhood.cpp +++ b/src/library/neighborhood.cpp @@ -485,7 +485,7 @@ NeighborList NeighborList::SelectForward( dip::uint procDim ) const { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing the NeighborList class") { dip::dfloat x = 1.2; diff --git a/src/library/physical_dimensions.cpp b/src/library/physical_dimensions.cpp index 64c3fb4f9..69ff54e57 100644 --- a/src/library/physical_dimensions.cpp +++ b/src/library/physical_dimensions.cpp @@ -518,7 +518,7 @@ dip::String Units::StringRepresentation( bool unicode ) const { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing the dip::Units class") { // Note: further tested at the same time as dip::PhysicalQuantity below diff --git a/src/library/pixel_table.cpp b/src/library/pixel_table.cpp index 9ceaef9d4..0a05dd4b4 100644 --- a/src/library/pixel_table.cpp +++ b/src/library/pixel_table.cpp @@ -461,7 +461,7 @@ void PixelTable::AddDistanceToOriginAsWeights() { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing the PixelTable class") { dip::PixelTable pt( "elliptic", dip::FloatArray{ 10.1, 12.7, 5.3 }, 1 ); diff --git a/src/library/types.cpp b/src/library/types.cpp index baa217637..b8ccf41c4 100644 --- a/src/library/types.cpp +++ b/src/library/types.cpp @@ -19,7 +19,7 @@ */ #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/library/types.h" DOCTEST_TEST_CASE("[DIPlib] testing the dip::bin class") { diff --git a/src/library/unit_tests.cpp b/src/library/unit_tests.cpp index 9e3830263..0fb3a8148 100644 --- a/src/library/unit_tests.cpp +++ b/src/library/unit_tests.cpp @@ -26,7 +26,7 @@ #ifdef DIP_CONFIG_DOCTEST_IN_SHARED_LIB #define DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL -#include "doctest.h" +#include #include "diplib.h" #include "diplib/linear.h" @@ -51,7 +51,7 @@ int main( int argc, const char* const* argv ) { #else // !DIP_CONFIG_DOCTEST_IN_SHARED_LIB #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN -#include "doctest.h" +#include #endif // DIP_CONFIG_DOCTEST_IN_SHARED_LIB @@ -61,7 +61,7 @@ int main( int argc, const char* const* argv ) { #define DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL #define DOCTEST_CONFIG_IMPLEMENT -#include "doctest.h" +#include #endif // DIP_CONFIG_DOCTEST_IN_SHARED_LIB diff --git a/src/linear/convolution.cpp b/src/linear/convolution.cpp index 4a909bb85..e60f48620 100644 --- a/src/linear/convolution.cpp +++ b/src/linear/convolution.cpp @@ -556,7 +556,7 @@ void GeneralConvolution( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/statistics.h" #include "diplib/generation.h" #include "diplib/iterators.h" diff --git a/src/linear/finitediff.cpp b/src/linear/finitediff.cpp index 3b8996557..86a4c6346 100644 --- a/src/linear/finitediff.cpp +++ b/src/linear/finitediff.cpp @@ -71,7 +71,7 @@ void FiniteDifference( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/statistics.h" #include "diplib/iterators.h" diff --git a/src/linear/gauss.cpp b/src/linear/gauss.cpp index 727d375a6..b3053166c 100644 --- a/src/linear/gauss.cpp +++ b/src/linear/gauss.cpp @@ -402,7 +402,7 @@ void GaussFT( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/statistics.h" #include "diplib/iterators.h" #include "diplib/testing.h" diff --git a/src/linear/gaussiir.cpp b/src/linear/gaussiir.cpp index 8ae260311..4ddd8131f 100644 --- a/src/linear/gaussiir.cpp +++ b/src/linear/gaussiir.cpp @@ -795,7 +795,7 @@ void GaussIIR( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/statistics.h" #include "diplib/iterators.h" #include "diplib/testing.h" diff --git a/src/linear/separate_filter.cpp b/src/linear/separate_filter.cpp index c69cdcef7..55226debb 100644 --- a/src/linear/separate_filter.cpp +++ b/src/linear/separate_filter.cpp @@ -128,7 +128,7 @@ OneDimensionalFilterArray SeparateFilter( Image const& c_in ) { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/statistics.h" //#include "diplib/timer.h" diff --git a/src/mapping/lookup_table.cpp b/src/mapping/lookup_table.cpp index 44f8241ad..41b94fdb4 100644 --- a/src/mapping/lookup_table.cpp +++ b/src/mapping/lookup_table.cpp @@ -459,7 +459,7 @@ Image::Pixel LookupTable::Apply( dfloat value, InterpolationMode interpolation ) #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/iterators.h" DOCTEST_TEST_CASE( "[DIPlib] testing dip::LookupTable" ) { diff --git a/src/math/arithmetic.cpp b/src/math/arithmetic.cpp index df06841ea..d64ce6be8 100644 --- a/src/math/arithmetic.cpp +++ b/src/math/arithmetic.cpp @@ -493,7 +493,7 @@ void Invert( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/math.h" #include "diplib/testing.h" diff --git a/src/math/projection.cpp b/src/math/projection.cpp index d1ec9f499..20958ecd0 100644 --- a/src/math/projection.cpp +++ b/src/math/projection.cpp @@ -1361,7 +1361,7 @@ void PositionPercentile( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing the projection function mechanics") { // Testing that the ProjectionScan framework works appropriately. diff --git a/src/measurement/chain_code.cpp b/src/measurement/chain_code.cpp index d88bc0b83..0f28fdc61 100644 --- a/src/measurement/chain_code.cpp +++ b/src/measurement/chain_code.cpp @@ -200,7 +200,7 @@ dip::Polygon ChainCode::Polygon() const { } #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/pixel_table.h" #include "diplib/morphology.h" diff --git a/src/measurement/image_chain_code.cpp b/src/measurement/image_chain_code.cpp index 270fa0821..0449e74f6 100644 --- a/src/measurement/image_chain_code.cpp +++ b/src/measurement/image_chain_code.cpp @@ -220,7 +220,7 @@ void ChainCode::Image( dip::Image& out ) const { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing chain code conversion to image and back") { dip::ChainCode cc; diff --git a/src/measurement/measure_polygon.cpp b/src/measurement/measure_polygon.cpp index 9d00ca505..cc2069ded 100644 --- a/src/measurement/measure_polygon.cpp +++ b/src/measurement/measure_polygon.cpp @@ -324,7 +324,7 @@ dfloat Polygon::BendingEnergy() const { #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing chain code polygons") { dip::ChainCode cc; diff --git a/src/measurement/measurement.cpp b/src/measurement/measurement.cpp index 4a169be66..debaf5533 100644 --- a/src/measurement/measurement.cpp +++ b/src/measurement/measurement.cpp @@ -401,7 +401,7 @@ StatisticsAccumulator SampleStatistics( Measurement::IteratorFeature const& feat #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE( "[DIPlib] testing dip::Measurement" ) { diff --git a/src/measurement/polygon.cpp b/src/measurement/polygon.cpp index 538363ffe..a13f73fed 100644 --- a/src/measurement/polygon.cpp +++ b/src/measurement/polygon.cpp @@ -251,7 +251,7 @@ ConvexHull::ConvexHull( dip::Polygon const& polygon ) { } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing polygon manipulation") { dip::Polygon p; diff --git a/src/morphology/basic.cpp b/src/morphology/basic.cpp index 096d18b68..910431d79 100644 --- a/src/morphology/basic.cpp +++ b/src/morphology/basic.cpp @@ -874,7 +874,7 @@ void BasicMorphology( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/statistics.h" #include "diplib/iterators.h" diff --git a/src/regions/label.cpp b/src/regions/label.cpp index 6e9ce2018..d20f7b16f 100644 --- a/src/regions/label.cpp +++ b/src/regions/label.cpp @@ -425,7 +425,7 @@ dip::uint Label( } // namespace dip #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/generation.h" #include "diplib/statistics.h" #include "diplib/binary.h" diff --git a/src/support/accumulators.cpp b/src/support/accumulators.cpp index a97622e51..af6bf7dd1 100644 --- a/src/support/accumulators.cpp +++ b/src/support/accumulators.cpp @@ -19,7 +19,7 @@ */ #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/accumulators.h" #include "diplib/random.h" diff --git a/src/support/gaussian_mixture.cpp b/src/support/gaussian_mixture.cpp index 9e2952dbd..2752fb455 100644 --- a/src/support/gaussian_mixture.cpp +++ b/src/support/gaussian_mixture.cpp @@ -149,7 +149,7 @@ std::vector< GaussianParameters > GaussianMixtureModel( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/generation.h" DOCTEST_TEST_CASE("[DIPlib] testing GaussianMixtureModel") { diff --git a/src/support/matrix.cpp b/src/support/matrix.cpp index 1cb6544d3..a2c1cc003 100644 --- a/src/support/matrix.cpp +++ b/src/support/matrix.cpp @@ -406,7 +406,7 @@ void Solve( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include DOCTEST_TEST_CASE("[DIPlib] testing the EigenDecomposition functions") { // Test generic symmetric code with 2x2 matrix diff --git a/src/support/numeric.cpp b/src/support/numeric.cpp index d16e17050..e1f43ff56 100644 --- a/src/support/numeric.cpp +++ b/src/support/numeric.cpp @@ -235,7 +235,7 @@ dfloat BesselYN( #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/library/clamp_cast.h" #include "diplib/saturated_arithmetic.h" diff --git a/src/transform/fourier.cpp b/src/transform/fourier.cpp index 7e235f509..4bb7d8eeb 100644 --- a/src/transform/fourier.cpp +++ b/src/transform/fourier.cpp @@ -899,7 +899,7 @@ dip::uint OptimalFourierTransformSize( dip::uint size, dip::String const& which #ifdef DIP_CONFIG_ENABLE_DOCTEST -#include "doctest.h" +#include #include "diplib/random.h" DOCTEST_TEST_CASE("[DIPlib] testing the OptimalFourierTransformSize function") { diff --git a/tools/FindEigen3.cmake b/tools/FindEigen3.cmake new file mode 100644 index 000000000..98ab43d9e --- /dev/null +++ b/tools/FindEigen3.cmake @@ -0,0 +1,83 @@ +# - Try to find Eigen3 lib +# +# This module supports requiring a minimum version, e.g. you can do +# find_package(Eigen3 3.1.2) +# to require version 3.1.2 or newer of Eigen3. +# +# Once done this will define +# +# EIGEN3_FOUND - system has eigen lib with correct version +# EIGEN3_INCLUDE_DIR - the eigen include directory +# EIGEN3_VERSION - eigen version + +# Copyright (c) 2006, 2007 Montel Laurent, +# Copyright (c) 2008, 2009 Gael Guennebaud, +# Copyright (c) 2009 Benoit Jacob +# Redistribution and use is allowed according to the terms of the 2-clause BSD license. + +if(NOT Eigen3_FIND_VERSION) + if(NOT Eigen3_FIND_VERSION_MAJOR) + set(Eigen3_FIND_VERSION_MAJOR 2) + endif(NOT Eigen3_FIND_VERSION_MAJOR) + if(NOT Eigen3_FIND_VERSION_MINOR) + set(Eigen3_FIND_VERSION_MINOR 91) + endif(NOT Eigen3_FIND_VERSION_MINOR) + if(NOT Eigen3_FIND_VERSION_PATCH) + set(Eigen3_FIND_VERSION_PATCH 0) + endif(NOT Eigen3_FIND_VERSION_PATCH) + + set(Eigen3_FIND_VERSION + "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}") +endif(NOT Eigen3_FIND_VERSION) + +macro(_eigen3_check_version) + file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) + + string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match + "${_eigen3_version_header}") + set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match + "${_eigen3_version_header}") + set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match + "${_eigen3_version_header}") + set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") + + set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) + if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + set(EIGEN3_VERSION_OK FALSE) + else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + set(EIGEN3_VERSION_OK TRUE) + endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + + if(NOT EIGEN3_VERSION_OK) + + message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, " + "but at least version ${Eigen3_FIND_VERSION} is required") + endif(NOT EIGEN3_VERSION_OK) +endmacro(_eigen3_check_version) + +if(EIGEN3_INCLUDE_DIR) + + # in cache already + _eigen3_check_version() + set(EIGEN3_FOUND ${EIGEN3_VERSION_OK}) + +else(EIGEN3_INCLUDE_DIR) + + find_path( + EIGEN3_INCLUDE_DIR + NAMES signature_of_eigen3_matrix_library + PATHS ${CMAKE_INSTALL_PREFIX}/include ${KDE4_INCLUDE_DIR} + PATH_SUFFIXES eigen3 eigen) + + if(EIGEN3_INCLUDE_DIR) + _eigen3_check_version() + endif(EIGEN3_INCLUDE_DIR) + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) + + mark_as_advanced(EIGEN3_INCLUDE_DIR) + +endif(EIGEN3_INCLUDE_DIR) diff --git a/tools/FindICS.cmake b/tools/FindICS.cmake new file mode 100644 index 000000000..be7ba45af --- /dev/null +++ b/tools/FindICS.cmake @@ -0,0 +1,48 @@ +# Copyright (C) 2021 LuaDist. +# Created by Peter Kapec +# Modified by Cris Luengo to look for GLFW instead of FreeGLUT, and set a target. +# Modified by Milian Wolff to look for ICS instead of GLFW, and set a target. +# Redistribution and use of this file is allowed according to the terms of the MIT license. +# For details see the COPYRIGHT file distributed with LuaDist. +# Note: +# Searching headers and libraries is very simple and is NOT as powerful as scripts +# distributed with CMake, because LuaDist defines directories to search for. +# Everyone is encouraged to contact the author with improvements. Maybe this file +# becomes part of CMake distribution sometime. + +# - Find ICS +# Find the native ICS headers and libraries. +# +# ICS_INCLUDE_DIRS - where to find libics.h +# ICS_LIBRARIES - List of libraries when using ICS. +# ICS_FOUND - True if ICS found. +# ICS::ICS - Target to link to (automatically sets include directories and linked libraries) + +# Look for the header file. +find_path(ICS_INCLUDE_DIR NAMES libics.h) + +# Look for the library. +find_library(ICS_LIBRARY NAMES ics) + +# Handle the QUIETLY and REQUIRED arguments and set ICS_FOUND to TRUE if all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ICS DEFAULT_MSG ICS_LIBRARY ICS_INCLUDE_DIR) + +# Copy the results to the output variables. +if(ICS_FOUND) + set(ICS_LIBRARIES ${ICS_LIBRARY}) + set(ICS_INCLUDE_DIRS ${ICS_INCLUDE_DIR}) + if (NOT TARGET ICS::ICS) + add_library(ICS::ICS UNKNOWN IMPORTED) + set_target_properties(ICS::ICS PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${ICS_INCLUDE_DIRS}" + IMPORTED_LOCATION "${ICS_LIBRARY}") + endif() + message(STATUS "ICS found: ${ICS_LIBRARY} -- ${ICS_INCLUDE_DIR}") +else() + set(ICS_LIBRARIES) + set(ICS_INCLUDE_DIRS) + message(STATUS "ICS not found") +endif() + +mark_as_advanced(ICS_INCLUDE_DIRS ICS_LIBRARIES)