Loading cmake/FindYAML.cmake +79 −82 Original line number Diff line number Diff line # yaml-config.cmake # Unterstützt find_package(YAML) ohne REQUIRED-Flag. # ===================================================================== # FindYAML.cmake (Adaptiert nach Findjson-c.cmake) # ===================================================================== # -------------------------------------------------------------------------- # 1. Definieren der Pfadvariablen (Pfadsuche und Fallbacks) # -------------------------------------------------------------------------- include(FindPackageHandleStandardArgs) set(YAML_FOUND FALSE) # Standardmäßig nicht gefunden # --- Definiere plattformspezifische Dateinamen --- # --- Define platform-specific names --- if (WIN32) set(_YAML_DLL_NAME "yaml.dll") set(_YAML_IMPLIB_NAME "yaml.lib") endif() if(DEFINED CMAKE_PREFIX_PATH) foreach(PREFIX_PATH ${CMAKE_PREFIX_PATH}) # Prüfen auf YAML-Header (yaml.h) set(_POTENTIAL_HEADER_FILE "${PREFIX_PATH}/include/yaml.h") if (EXISTS "${_POTENTIAL_HEADER_FILE}") set(YAML_ROOT "${PREFIX_PATH}") message(STATUS "yaml-config: Found YAML_ROOT at ${YAML_ROOT}") break() endif() endforeach() endif() if(NOT YAML_ROOT) if(DEFINED CMAKE_INSTALL_PREFIX) set(YAML_ROOT "${CMAKE_INSTALL_PREFIX}") # FIX: Füge den UNIX-Standardpfad-Fallback hinzu, um /usr/local/lib Fehler zu verhindern elseif(UNIX) set(YAML_ROOT "/usr") set(_YAML_LIB_NAME "yaml") # Für find_library (findet die .lib) else() get_filename_component(YAML_ROOT "${CMAKE_CURRENT_LIST_DIR}/../../" ABSOLUTE) endif() set(_YAML_LIB_NAME "yaml") endif() # Setze den Include-Pfad set(YAML_INCLUDE_DIR "${YAML_ROOT}/include") # ----------------------------------------------------------------------------- # 1. Find Header and Link Libraries # ----------------------------------------------------------------------------- find_path(YAML_INCLUDE_DIR NAMES yaml.h PATH_SUFFIXES include ) # -------------------------------------------------------------------------- # 2. Bibliothek suchen und FOUND-Variable setzen (Multiarch- & Optional-Fix) # -------------------------------------------------------------------------- # Find out the path to the library (Findet die .lib-Datei auf Windows) find_library(YAML_LIBRARY NAMES ${_YAML_LIB_NAME} ) if (WIN32) # Windows: Wir gehen davon aus, dass die Dateien unter ${YAML_ROOT}/lib liegen set(YAML_LIBRARY_DIR "${YAML_ROOT}/lib") # ----------------------------------------------------------------------------- # 2. Handle Required Arguments # ----------------------------------------------------------------------------- # Prüfe die Existenz der Release-DLL, um YAML_FOUND zu setzen if (EXISTS "${YAML_LIBRARY_DIR}/${_YAML_DLL_NAME}") set(YAML_FOUND TRUE) endif() else() # Unix/Linux: Verwende find_library für Multiarch-Unterstützung find_library(YAML_LIBRARY NAMES yaml) if (YAML_LIBRARY) set(YAML_FOUND TRUE) endif() endif() find_package_handle_standard_args(YAML FOUND_VAR YAML_FOUND REQUIRED_VARS YAML_INCLUDE_DIR YAML_LIBRARY FAIL_MESSAGE "Could NOT find libyaml shared library or headers." ) # ----------------------------------------------------------------------------- # 3. Define Imported Shared Target (Internal Name) # ----------------------------------------------------------------------------- # -------------------------------------------------------------------------- # 3. Erstellen des Namespaced IMPORTED Targets (Nur wenn gefunden) # -------------------------------------------------------------------------- if(YAML_FOUND) if (NOT TARGET yaml::yaml AND YAML_FOUND) add_library(yaml::yaml SHARED IMPORTED) # 1. Define the primary target with the name 'YAML::YAML' (Großschreibung) add_library(YAML::YAML SHARED IMPORTED) set_target_properties(yaml::yaml PROPERTIES IMPORTED_CONFIGURATIONS "Release;Debug" # 2. Set the public interface (headers) set_target_properties(YAML::YAML PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${YAML_INCLUDE_DIR}" ) # --- Windows Implementierung (.dll/.lib) --- # 3. Set the location properties if(WIN32) # Pfade wurden oben bereits definiert und geprüft set_target_properties(yaml::yaml PROPERTIES IMPORTED_LOCATION_RELEASE "${YAML_LIBRARY_DIR}/${_YAML_DLL_NAME}" IMPORTED_IMPLIB_RELEASE "${YAML_LIBRARY_DIR}/${_YAML_IMPLIB_NAME}" IMPORTED_LOCATION_DEBUG "${YAML_LIBRARY_DIR}/yaml-d.dll" IMPORTED_IMPLIB_DEBUG "${YAML_LIBRARY_DIR}/yaml-d.lib" # Bestimme Pfade basierend auf dem Speicherort der gefundenen .lib-Datei. # (Logik aus Findjson-c) get_filename_component(_LIB_DIR "${YAML_LIBRARY}" DIRECTORY) # z.B. C:/.../install/lib get_filename_component(_PARENT_DIR "${_LIB_DIR}" DIRECTORY) # z.B. C:/.../install # Set IMPORTED_IMPLIB (the .lib) for linking [cite: 10] set_target_properties(YAML::YAML PROPERTIES IMPORTED_IMPLIB "${YAML_LIBRARY}" # Der gefundene .lib Pfad ) # --- Linux/Unix Implementierung (.so) --- # Set IMPORTED_LOCATION for configurations (geht davon aus, dass die DLL nach /bin geht) [cite: 12] set_target_properties(YAML::YAML PROPERTIES IMPORTED_LOCATION_RELEASE "${_PARENT_DIR}/bin/${_YAML_DLL_NAME}" IMPORTED_LOCATION_DEBUG "${_PARENT_DIR}/bin/yaml-d.dll" # Annahme für Debug-DLL IMPORTED_LOCATION_RELWITHDEBINFO "${_PARENT_DIR}/bin/${_YAML_DLL_NAME}" ) else() # NUTZT den von find_library gefundenen ABSOLUTEN PFAD (Multiarch-kompatibel) set_target_properties(yaml::yaml PROPERTIES IMPORTED_LOCATION_RELEASE "${YAML_LIBRARY}" IMPORTED_LOCATION_DEBUG "${YAML_LIBRARY}" # Non-Windows systems: link file is the runtime file set_target_properties(YAML::YAML PROPERTIES IMPORTED_LOCATION "${YAML_LIBRARY}" ) endif() # ----------------------------------------------------------------------------- # 4. Define Alias for Consumer (Fixes the yaml::yaml-NOTFOUND error) # ----------------------------------------------------------------------------- # Der Konsument (libconfplus) sucht nach yaml::yaml (Kleinbuchstaben-Namespace). # Erstelle ein ALIAS-Target, das auf das primäre Target YAML::YAML zeigt. add_library(yaml::yaml ALIAS YAML::YAML) endif() # Verhindert, dass die Variable am Ende des Skripts auf FALSE zurückgesetzt wird set(YAML_LIBRARIES "yaml::yaml" CACHE STRING "The YAML library target.") # Hide internal variables from the CMake GUI mark_as_advanced( YAML_INCLUDE_DIR YAML_LIBRARY ) No newline at end of file Loading
cmake/FindYAML.cmake +79 −82 Original line number Diff line number Diff line # yaml-config.cmake # Unterstützt find_package(YAML) ohne REQUIRED-Flag. # ===================================================================== # FindYAML.cmake (Adaptiert nach Findjson-c.cmake) # ===================================================================== # -------------------------------------------------------------------------- # 1. Definieren der Pfadvariablen (Pfadsuche und Fallbacks) # -------------------------------------------------------------------------- include(FindPackageHandleStandardArgs) set(YAML_FOUND FALSE) # Standardmäßig nicht gefunden # --- Definiere plattformspezifische Dateinamen --- # --- Define platform-specific names --- if (WIN32) set(_YAML_DLL_NAME "yaml.dll") set(_YAML_IMPLIB_NAME "yaml.lib") endif() if(DEFINED CMAKE_PREFIX_PATH) foreach(PREFIX_PATH ${CMAKE_PREFIX_PATH}) # Prüfen auf YAML-Header (yaml.h) set(_POTENTIAL_HEADER_FILE "${PREFIX_PATH}/include/yaml.h") if (EXISTS "${_POTENTIAL_HEADER_FILE}") set(YAML_ROOT "${PREFIX_PATH}") message(STATUS "yaml-config: Found YAML_ROOT at ${YAML_ROOT}") break() endif() endforeach() endif() if(NOT YAML_ROOT) if(DEFINED CMAKE_INSTALL_PREFIX) set(YAML_ROOT "${CMAKE_INSTALL_PREFIX}") # FIX: Füge den UNIX-Standardpfad-Fallback hinzu, um /usr/local/lib Fehler zu verhindern elseif(UNIX) set(YAML_ROOT "/usr") set(_YAML_LIB_NAME "yaml") # Für find_library (findet die .lib) else() get_filename_component(YAML_ROOT "${CMAKE_CURRENT_LIST_DIR}/../../" ABSOLUTE) endif() set(_YAML_LIB_NAME "yaml") endif() # Setze den Include-Pfad set(YAML_INCLUDE_DIR "${YAML_ROOT}/include") # ----------------------------------------------------------------------------- # 1. Find Header and Link Libraries # ----------------------------------------------------------------------------- find_path(YAML_INCLUDE_DIR NAMES yaml.h PATH_SUFFIXES include ) # -------------------------------------------------------------------------- # 2. Bibliothek suchen und FOUND-Variable setzen (Multiarch- & Optional-Fix) # -------------------------------------------------------------------------- # Find out the path to the library (Findet die .lib-Datei auf Windows) find_library(YAML_LIBRARY NAMES ${_YAML_LIB_NAME} ) if (WIN32) # Windows: Wir gehen davon aus, dass die Dateien unter ${YAML_ROOT}/lib liegen set(YAML_LIBRARY_DIR "${YAML_ROOT}/lib") # ----------------------------------------------------------------------------- # 2. Handle Required Arguments # ----------------------------------------------------------------------------- # Prüfe die Existenz der Release-DLL, um YAML_FOUND zu setzen if (EXISTS "${YAML_LIBRARY_DIR}/${_YAML_DLL_NAME}") set(YAML_FOUND TRUE) endif() else() # Unix/Linux: Verwende find_library für Multiarch-Unterstützung find_library(YAML_LIBRARY NAMES yaml) if (YAML_LIBRARY) set(YAML_FOUND TRUE) endif() endif() find_package_handle_standard_args(YAML FOUND_VAR YAML_FOUND REQUIRED_VARS YAML_INCLUDE_DIR YAML_LIBRARY FAIL_MESSAGE "Could NOT find libyaml shared library or headers." ) # ----------------------------------------------------------------------------- # 3. Define Imported Shared Target (Internal Name) # ----------------------------------------------------------------------------- # -------------------------------------------------------------------------- # 3. Erstellen des Namespaced IMPORTED Targets (Nur wenn gefunden) # -------------------------------------------------------------------------- if(YAML_FOUND) if (NOT TARGET yaml::yaml AND YAML_FOUND) add_library(yaml::yaml SHARED IMPORTED) # 1. Define the primary target with the name 'YAML::YAML' (Großschreibung) add_library(YAML::YAML SHARED IMPORTED) set_target_properties(yaml::yaml PROPERTIES IMPORTED_CONFIGURATIONS "Release;Debug" # 2. Set the public interface (headers) set_target_properties(YAML::YAML PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${YAML_INCLUDE_DIR}" ) # --- Windows Implementierung (.dll/.lib) --- # 3. Set the location properties if(WIN32) # Pfade wurden oben bereits definiert und geprüft set_target_properties(yaml::yaml PROPERTIES IMPORTED_LOCATION_RELEASE "${YAML_LIBRARY_DIR}/${_YAML_DLL_NAME}" IMPORTED_IMPLIB_RELEASE "${YAML_LIBRARY_DIR}/${_YAML_IMPLIB_NAME}" IMPORTED_LOCATION_DEBUG "${YAML_LIBRARY_DIR}/yaml-d.dll" IMPORTED_IMPLIB_DEBUG "${YAML_LIBRARY_DIR}/yaml-d.lib" # Bestimme Pfade basierend auf dem Speicherort der gefundenen .lib-Datei. # (Logik aus Findjson-c) get_filename_component(_LIB_DIR "${YAML_LIBRARY}" DIRECTORY) # z.B. C:/.../install/lib get_filename_component(_PARENT_DIR "${_LIB_DIR}" DIRECTORY) # z.B. C:/.../install # Set IMPORTED_IMPLIB (the .lib) for linking [cite: 10] set_target_properties(YAML::YAML PROPERTIES IMPORTED_IMPLIB "${YAML_LIBRARY}" # Der gefundene .lib Pfad ) # --- Linux/Unix Implementierung (.so) --- # Set IMPORTED_LOCATION for configurations (geht davon aus, dass die DLL nach /bin geht) [cite: 12] set_target_properties(YAML::YAML PROPERTIES IMPORTED_LOCATION_RELEASE "${_PARENT_DIR}/bin/${_YAML_DLL_NAME}" IMPORTED_LOCATION_DEBUG "${_PARENT_DIR}/bin/yaml-d.dll" # Annahme für Debug-DLL IMPORTED_LOCATION_RELWITHDEBINFO "${_PARENT_DIR}/bin/${_YAML_DLL_NAME}" ) else() # NUTZT den von find_library gefundenen ABSOLUTEN PFAD (Multiarch-kompatibel) set_target_properties(yaml::yaml PROPERTIES IMPORTED_LOCATION_RELEASE "${YAML_LIBRARY}" IMPORTED_LOCATION_DEBUG "${YAML_LIBRARY}" # Non-Windows systems: link file is the runtime file set_target_properties(YAML::YAML PROPERTIES IMPORTED_LOCATION "${YAML_LIBRARY}" ) endif() # ----------------------------------------------------------------------------- # 4. Define Alias for Consumer (Fixes the yaml::yaml-NOTFOUND error) # ----------------------------------------------------------------------------- # Der Konsument (libconfplus) sucht nach yaml::yaml (Kleinbuchstaben-Namespace). # Erstelle ein ALIAS-Target, das auf das primäre Target YAML::YAML zeigt. add_library(yaml::yaml ALIAS YAML::YAML) endif() # Verhindert, dass die Variable am Ende des Skripts auf FALSE zurückgesetzt wird set(YAML_LIBRARIES "yaml::yaml" CACHE STRING "The YAML library target.") # Hide internal variables from the CMake GUI mark_as_advanced( YAML_INCLUDE_DIR YAML_LIBRARY ) No newline at end of file