Commit c683fe5f authored by jan.koester's avatar jan.koester
Browse files

test

parent 5d990fda
Loading
Loading
Loading
Loading
+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