diff --git a/CMakeLists.txt b/CMakeLists.txt index c2bf9693562f853986f4e4b4b5eacff289ee2d3e..9a5f158b2c6fa9e559652871a534edf5a4256379 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,13 +130,11 @@ if(ENABLE_EXPERIMENTAL_SCREENFITTER) endif() endif() -# Casacore depends on HDF5 -> First load HDF5. +# Load HDF5 before Casacore, since some Casacore versions do not load HDF5. find_package( HDF5 COMPONENTS C CXX REQUIRED) -add_definitions(${HDF5_DEFINITIONS}) -include_directories(${HDF5_INCLUDE_DIRS}) find_package( Casacore @@ -144,6 +142,15 @@ find_package( REQUIRED) include_directories(SYSTEM ${CASACORE_INCLUDE_DIR}) +# Reload HDF5, since some Casacore versions also load HDF5, but without C++ +# support. ${HDF5_LIBRARIES} then does not include C++ libraries. +find_package( + HDF5 + COMPONENTS C CXX + REQUIRED) +add_definitions(${HDF5_DEFINITIONS}) +include_directories(${HDF5_INCLUDE_DIRS}) + find_package(CFITSIO REQUIRED) include_directories(${CFITSIO_INCLUDE_DIRS}) @@ -562,7 +569,7 @@ set(SOURCEDB_LIBRARIES Blob Common ParmDB ${CASACORE_LIBRARIES} ${Boost_SYSTEM_LIBRARY}) add_executable(DP3 base/Main.cc) -target_link_libraries(DP3 LIBDP3) +target_link_libraries(DP3 LIBDP3 ${HDF5_LIBRARIES}) add_executable(makesourcedb parmdb/makesourcedb.cc) target_link_libraries(makesourcedb ${SOURCEDB_LIBRARIES}) diff --git a/base/Main.cc b/base/Main.cc index dc676866167bf9990b895d66fb0c9d89443a8a21..1e4b7bedf6ebc09d6b9598299392068a9903c362 100644 --- a/base/Main.cc +++ b/base/Main.cc @@ -4,15 +4,17 @@ // // @author Ger van Diepen -#include <dp3/base/DP3.h> +#include <filesystem> +#include <iostream> +#include <stdexcept> -#include <Version.h> +#include <H5Cpp.h> #include <aocommon/checkblas.h> -#include <filesystem> -#include <iostream> -#include <stdexcept> +#include <dp3/base/DP3.h> + +#include <Version.h> // Define handler that tries to print a backtrace. // Exception::TerminateHandler t(Exception::terminate); @@ -70,9 +72,17 @@ int main(int argc, char* argv[]) { // Execute the parset file. dp3::base::Execute(parsetName, argc, argv); - } catch (std::exception& err) { + } catch (const std::exception& err) { std::cerr << "\nstd exception detected: " << err.what() << '\n'; return 1; + } catch (const H5::Exception& err) { + // Since H5::Exception is not derived from std::exception, DP3 crashes + // if it does not catch them -> Print an error message instead. + std::cerr << "\nH5 exception detected: " << err.getDetailMsg() + << "\nStack trace:\n"; + err.printErrorStack(); + std::cerr << '\n'; + return 1; } return 0; }