Changelog

Changes since 2020.06

New features

Containers library

Utility library

Changes and improvements

Utility library

Build system

  • The -o option in the Single-header generator tool utility now treats the argument as a file if it doesn't exist and a directory only if it exists and is a directory (see mosra/corrade#90)
  • Fixed a potential error in UseCorrade.cmake that would happen when compiling with an unrecognized compiler (see mosra/magnum#457)

Potential compatibility breakages, removed APIs

2020.06

Released 2020-06-27, tagged as v2020.06.

New features

Containers library

PluginManager library

TestSuite library

Utility library

Changes and improvements

  • TestSuite::Tester and the CORRADE_INTERNAL_ASSERT() family of macros now prints file/line info in test failures as a more compact <file>:<line>, which is consistent with Utility::Debug source location and how GCC or GDB print those
  • Added an ability to disable unique globals across shared libraries using CORRADE_BUILD_STATIC_UNIQUE_GLOBALS on static builds that don't need it
  • Library version is now exposed through CORRADE_VERSION_YEAR, CORRADE_VERSION_MONTH, CORRADE_VERSION_COMMIT, CORRADE_VERSION_HASH and CORRADE_VERSION_STRING preprocessor defines in a new Corrade/version.h header. This header is not included by any other header to avoid trigerring a full rebuild when Git commit changes. If Git is not found, only the first two defines are present.

Containers library

Interconnect library

  • Interconnect::connect() now can recognize trivially copyable lambdas also on GCC versions before 5 and store them more efficiently

PluginManager library

TestSuite library

Utility library

Build system

  • Fixed compilation of the Corrade::Main library on i686 MinGW
  • UseCorrade.cmake defined NOMINMAX and WIN32_LEAN_AND_MEAN by mistake only on MSVC, causing windows.h to leak unforgivable crimes when compiling under MinGW (see mosra/magnum-plugins#74)
  • Fixed MSVC detection in conanfile.py, made it aware of the MSVC2019_COMPATIBILITY option as well (see mosra/corrade#93)
  • The library again compiles and tests cleanly with CORRADE_NO_ASSERT enabled, and this setup is verified on the CI to avoid further regressions
  • Fixes to make the library work under MinGW Clang (see mosra/corrade#95)
  • Fixed compilation on GCC 10 (see mosra/corrade#97)
  • UseAndroid.cmake no longer expects adb to be in $PATH, but it locates it relatively to Android SDK (see mosra/toolchains#10)
  • Various warning fixes (see mosra/corrade#96)

Bug fixes

  • The CORRADE_TARGET_LIBSTDCXX macro was defined on GCC < 5 only when certain headers were included before. That caused problems especially with the new CORRADE_STD_IS_TRIVIALLY_TRAITS_SUPPORTED macro and is now fixed to assume old GCC versions always use libstdc++.
  • Fixed an assertion in Utility::Arguments when a single - was passed on the command-line
  • Utility::Endianness::swapInPlace() and other in-place APIs were fixed to work correctly on platforms that don't allow unaligned reads and writes
  • Utility::ConfigurationValue was saving double and long double with only 6 precision digits due to silly std::ostream defaults. Now it prints those with 15 and 18 digits respectively, consistent with Utility::Debug and Utility::format() output
  • As internals of PluginManager::Manager were rewritten to not need any shared global state anymore, various corner cases and crashes on destruction are not happening anymore. In particular, it's now also possible to have two instances of the same manager type without the two interferring with each other in any way.

Documentation

Deprecated APIs

  • Utility::Directory::map(const std::string&, std::size_t) is deprecated and renamed to Utility::Directory::mapWrite() as it doesn't preserve original file contents and thus can't be used for read-write access
  • The internal CORRADE_BIG_ENDIAN macro got renamed to CORRADE_TARGET_BIG_ENDIAN and made public. The old variant is still present for backwards compatibility, but will be removed in the future.

Potential compatibility breakages, removed APIs

2019.10

Released 2019-10-24, tagged as v2019.10.

Dependency changes

  • Minimal supported CMake version is now 3.4. Older versions are not supported anymore and all workarounds for them were removed. Download a prebuilt release of a newer version if you need to use Corrade on older systems (such as Ubuntu 14.04 or Debian 8). This is a conservative change that shouldn't affect any additional distribution compared to the CMake 3.1 requirement in 2019.01.

New features

Containers library

PluginManager library

TestSuite library

  • Custom TestSuite comparators can now optionally save diagnostic files as well as print formatted messages to the output. See Saving diagnostic files for more information.
  • Added TestSuite::Tester::setTestCaseTemplateName() for convenient distinction of different specializations of templated test cases
  • TestSuite::Tester now warns when dynamic CPU scaling is used on Linux and benchmarks are being run, as that makes the measurements rather noisy. With the --verbose command-line option it prints further information.

Utility library

Changes and improvements

Containers library

Interconnect library

  • The Interconnect library internals got reworked with less allocations, better memory usage, improved signal emitting performance and support for connecting to arbitrary function objects along with std::function. See also mosra/corrade#63 for more information.

PluginManager library

  • Instantiating a PluginManager::Manager without an explicit plugin directory will only print a warning about no dynamic plugins found if there's no statically linked plugin either. That makes it behave better on setups where all plugins are always linked statically.
  • PluginManager::Manager now explicitly checks for presence of a plugin metadata file for dynamic plugins and fails with PluginManager::LoadState::WrongMetadataFile if it's not found. Previously it was silently ignoring missing metadata files, often resulting in a runtime linker error due to a dependency not being loaded.
  • CORRADE_PLUGIN_REGISTER() now operates completely without heap access, making it safe to run in restricted phases of application execution
  • PluginManager::AbstractPlugin now implements a destructive move constructor

TestSuite library

Utility library

Build system

  • MSYS2 packages are now in official repositories, installable directly via pacman
  • The CORRADE_CXX_STANDARD preprocessor macro learned support for the upcoming C++2a standard. The equivalent CMake property can now be set to 20 to pass the -std=c++2a flag to GCC and Clang and /std:c++latest to MSVC.
  • It's now possible to use the TestSuite library via CMake subprojects also on Android, iOS and Emscripten
  • Explicitly disabling a MSVC linker optimization that causes seemingly similar signals to be conflated together, causing erratic behavior. This is done automatically for CMake-based projects, see the Interconnect::Emitter documentation for more information when using custom buildsystems, see also mosra/corrade#51.
  • Fixed compilation with Clang and -std=gnu++14 (see mosra/corrade#62)
  • CORRADE_VISIBILITY_STATIC no longer exports symbols in static libraries to be consistent with hidden visibility by default, additionally -fvisibility-inlines-hidden is passed along with -fvisibility=hidden when CORRADE_USE_PEDANTIC_FLAGS property is enabled in CMake on GCC and Clang to avoid linker warnings on macOS (see mosra/corrade#53)
  • The Emscripten CMake toolchain now sets the EMSCRIPTEN variable to help 3rd party projects (see mosra/toolchains#7)
  • The Emscripten CMake toolchain now looks for emcc on $PATH as a last resort and then uses the parent directory as EMSCRIPTEN_PREFIX (see mosra/toolchains#8)
  • On Windows, if the Emscripten toolchain detects Visual Studio being used as a generator, it'll fail with an error suggesting to use a different generator instead. Previously, CMake silently fell back to using Visual Studio as a C++ compiler, resulting in seemingly impossible errors. See mosra/corrade#78.
  • Clarified interaction of -fvisibility-inlines-hidden and/or -Wl,-Bsymbolic-functions GCC/Clang flags and Interconnect::Emitter
  • The TestSuite library and all tests created with corrade_add_test() are now built with -s DISABLE_EXCEPTION_CATCHING=0 being explicitly specified both for the compiler and linker to work correctly on Emscripten 1.38.36 and newer
  • Emscripten builds now have the -fPIC option disabled by default as it causes linker errors related to __memory_base on 1.38.36 (see also emscripten-core/emscripten#8761)
  • Fixed dynamic plugin metadata location when CMAKE_LIBRARY_OUTPUT_DIRECTORY is set (see mosra/corrade#74)
  • With CMake 3.15 there's an unfortunate collision between CORRADE_CXX_STANDARD and CMake's own COMPILE_FEATURES target property, where a request to use C++14 from a 3rd party library would get ignored with C++11 being used instead. To fix that, the CORRADE_CXX_STANDARD property does nothing if the COMPILE_FEATURES property is set on the target as well. See Using Corrade with CMake for more information.
  • Fixed corrade_add_test() when library output path is set in CMake (see mosra/corrade#77)
  • Plugin metadata are now copied next to the binary as a post-build command instead of only during a full build
  • Updated the iOS toolchain to make find_package(Threads) work correctly

Bug fixes

  • The TestSuite::Comparator class by mistake did not have fuzzy comparison for long double
  • Fixed TestSuite::Compare::around() for types that don't have a total ordering (for example, for Magnum matrix and vector types, !(a < b) might not neccesarily imply that a >= b).
  • Fixed build on big-endian platforms (see mosra/corrade#58)
  • Fixed Utility::Sha1 calculation on big-endian platforms (see mosra/corrade#60)
  • Fixed Utility::Directory::read() to not use ftello() on 32-bit Android and API levels below 24
  • Fixed Utility::Directory::read() to work with files that report an early EOF (such as stuff from /sys on Linux)
  • Fixed Interconnect::Emitter::emit() for signals from multiply-inherited base classes on MSVC — it was due to an insufficiently tested workaround for a template deduction limitation in the compiler (see mosra/corrade#51)
  • Interconnect::Emitter::emit() now works correctly on MSVC for signals from classes where multiple and/or virtual inheritance is involved (see mosra/corrade#51)
  • Fixed CORRADE_COMPARE_WITH() to be callable with expressions such as *comparator
  • Fixed Utility::Tweakable to work correctly with buildsystems using absolute paths for __FILE__ macros (such as Makefiles, Ninja is using relative paths). See mosra/corrade#61.
  • In some corner cases, automatic registering / unregistering of Utility::Resource data happens more than once. While this was allowed for registration, the unregistration caused an assert to be fired. Fixed this to be allowed on both.
  • Utility::Directory::copy() wasn't properly freeing both opened files if one of them failed to open (see mosra/corrade#70)
  • Interconnect::Emitter::emit() (and signal/slot connections in general) now work correctly with non-copyable arguments
  • Fixed Utility::Debug::isTty() (and thus also TestSuite colored output) to reliably work on macOS. Because Xcode output window doesn't support ANSI color escape codes, tt was relying on an undocumented $XPC_SERVICE_NAME variable that was always defined inside Xcode to disable colored output. Nowadays this variable is sometimes defined outside as well, making the check unreliable. Fixed by testing for $TERM instead, see mosra/corrade#73 for more information.

Deprecated APIs

  • Single-argument Utility::Arguments::setHelp() is now deprecated in favor of Utility::Arguments::setGlobalHelp() to avoid it being used for documenting named arguments by accident.
  • Utility::Directory::fileExists() is now deprecated in favor of Utility::Directory::exists(). It was named like this to prevent it from looking like it works on directories only, but such name then caused people to ask if it works on directories as well, not helping anything.
  • Interconnect::Connection::isConnected() and Interconnect::Connection::disconnect() are deprecated and print a warning at runtime as the redesigned internals of the Interconnect library now make it impossible to check that the original Interconnect::Emitter object still exists. Use Interconnect::Emitter::isConnected() and Interconnect::disconnect() instead.
  • Re-connecting a disconnected signal using Interconnect::Connection::isConnectionPossible() and Interconnect::Connection::connect() is not possible anymore in order to make the Interconnect library more efficient. These two functions are now deprecated and just returningthe value of (also deprecated) isConnected().
  • Signatures of TestSuite::Comparator methods were changed in order to support new features. The old variant with operator()() returning a bool and printErrorMessage() instead of printMessage() is still supported for backwards compatibility but custom comparators are strongly advised to upgrade

Potential compatibility breakages, removed APIs

Documentation

2019.01

Released 2019-02-04, tagged as v2019.01.

Dependency changes

  • Minimal supported GCC version is now 4.8.1, GCC 4.7 is not supported anymore. Minimal Clang version is now 3.3, since that's the first version with a complete C++11 support. See also mosra/magnum#274.
  • Minimal supported CMake version is now 3.1. Older versions are not supported anymore and all workarounds for them were removed. Download a prebuilt release of a newer version if you need to use Corrade on older systems (such as Ubuntu 14.04 or Debian 8). See also mosra/magnum#274.

New features

  • Various Corrade features are now being available also as single-header libraries for easier integration into your projects. See Single-header libraries for more information.

Containers library

Utility library

Changes and improvements

Containers library

PluginManager library

Utility library

  • Prefixed or prefix-ignoring Utility::Arguments now work better with 3rd party argument parsers which may be less restrictive about argument name format; arguments that are ignored are not checked for key validity anymore (see mosra/magnum#305)

Build system

Bug fixes

Deprecated APIs

Potential compatibility breakages, removed APIs

Documentation

2018.10

Released 2018-10-23, tagged as v2018.10.

New features

Containers library

PluginManager library

Utility library

Changes and improvements

Containers library

PluginManager library

  • Plugins are now loaded from the filesystem in an alphabetical order for predictable behavior across different systems

TestSuite library

  • Adapted Emscripten test runner markup for consistency with the m.css theme used in Magnum
  • It's now possible to have non-copyable and non-moveable TestSuite::Comparator specializations

Utility library

Build system

  • There's now a PPA for Ubuntu packages. See Packages for Debian, Ubuntu and derivatives for more information.
  • The Resource compiler utility is now fully standalone even with shared builds to minimize annoying first-time-use issues. It's also possible to build just this utility without anything else for example for crosscompiling, by enabling only WITH_RC and disabling all other CMake options.
  • Due to changes in Xcode 10, CMake before 3.12 would fail during the build of Corrade. To prevent that, when Xcode 10 is detected, the build aborts with a clear message upfront, telling the user to upgrade to CMake 3.12. See mosra/corrade#52 and cmake/cmake#18099.

Bug fixes

Documentation

  • All code snippets are now compiled, ensuring no deprecated APIs are used and no accidental compile errors are present
  • TestSuite::Comparator documentation mistakenly stated that it's possible to have multiple operator()() overloads for a single pseudo-type. Due to implementation limitations it's not.

Changelogs for previous versions are available in Archived changelogs.