Support Request #16426
closedUsing catch2 with conan and cmake
Description
Supportanfrage
bei uns wurde Catch2 als Alternative zu gtest evaluiert.
Wir haben dabei catch2/2.13.7@dw/stable<mailto:catch2/2.13.7@dw/stable> genutzt.
Damit ein find_package(Catch2) funktioniert, muss der Conan generator cmake_find_package (cmake_find_package generator - conan 1.44.1 documentation<https://docs.conan.io/en/latest/integrations/build_system/cmake/cmake_find_package_generator.html>) genutzt werden.
Der wesentliche Nachteil dabei ist, dass viele andere Pakete eine *Config.cmake enthalten. Diese Dateien der anderen werden durch den generator cmake_find_package ausgeblendet.
Um die ausgeblendeten Dateien wieder auffindbar zu machen, muss für andere Pakete find_package(MyOtherPackage CONFIG) aufgerufen werden.
Dieser Seiteneffekt fühlt sich merkwürdig an, insbesondere, weil Catch2 offenbar auch ein Config-File bereitzustellen scheint: https://github.com/catchorg/Catch2/blob/v2.13.7/CMake/Catch2Config.cmake.in
Gibt es einen Grund, warum es das Config-File von Catch2 es nicht ins Conan-Paket geschafft hat?
Wir sind am überlegen, ob es sinnvoll ist, Catch2 neu zu verpacken, um das fehlende Config-File zu ergänzen.
Dann könnten wir auf den cmake_find_package Generator und seine Seiteneffekte verzichten.
Gibt es Eurerseits Pläne, das File zu künftig zu integrieren?
Lösung
das Problem ist uns bekannt, conan und cmake sind hier nur bedingt kombinierbar, zumindest out of the box...
Wir verwenden das catch2 Paket 1:1 aus dem conan center (redeploy) und dort ist keine cmake Kompatibilität gewährleistet.
Wenn du im ADTF Kontext unterwegs bist, kannst du auch catch2 innherhalb des testing packages von ADTF verwenden, das liefern wir mit.
Beispiel tests findest du in den examples, da gibts dann auch passende cmake Makros von uns, inklusive testbarkeit für UI adtfplugins.
Im Prinzip machst du nur folgendes:
find_package(ADTF COMPONENTS testing) adtf_add_catch_test(NAME test_plugin TIMEOUT 10 SOURCES test_code.cpp )
Wenn du catch2 standalone oder allgemein verwenden willst ohne ADTF, dann nutzen wir den cmake_find_package Generator so (wenn wir ADTF File Plugins zb schreiben):
def removeFindPackage(self, name):
file_name = self.build_folder + "/" + name
if os.path.isfile(file_name):
os.remove(file_name)
def cmake_factory(self):
if not self.cmake:
self.cmake = CMake(self)
# these are proper cmake packages so we do not need the conan generated find scripts
self.removeFindPackage("Findifhd.cmake")
self.removeFindPackage("Finddev_essential.cmake")
# ...
Das sollte dir bei derartigen Problemen unabhängig von diesen spezifischen paket helfen, dann bist du davon unabhängig...