include_guard()

# Find ccache executable
find_program(CCACHE_PROGRAM NAMES ccache)

if(CCACHE_PROGRAM)
    message(STATUS "ccache found: ${CCACHE_PROGRAM}, enabling via CMake launcher and environment.")
    if (CMAKE_GENERATOR MATCHES "Visual Studio")
        # Copy original ccache.exe and rename to cl.exe, this way intermediate cmd file is not needed
        file(COPY_FILE ${CCACHE_PROGRAM} ${CMAKE_BINARY_DIR}/cl.exe ONLY_IF_DIFFERENT)

        # Set Visual Studio global variables:
        # - Use above cl.exe (ccache.exe) as a compiler 
        # - Enable parallel compilation
        list(APPEND CMAKE_VS_GLOBALS
            "CLToolExe=cl.exe"
            "CLToolPath=${CMAKE_BINARY_DIR}"
            "UseMultiToolTask=true"
            "UseStructuredOutput=false"
        )
    elseif(CMAKE_GENERATOR MATCHES "Ninja" OR CMAKE_GENERATOR MATCHES "Unix Makefiles")
        message(STATUS "Using ccache as compiler launcher for Ninja or Makefiles.")
        set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM} CACHE FILEPATH "CXX compiler cache used" FORCE)
        set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM} CACHE FILEPATH "C compiler cache used" FORCE)
    else()
        message(WARNING "Unsupported generator for ccache integration: ${CMAKE_GENERATOR}. ccache will not be used.")
    endif()
else()
    message(WARNING "ccache not found. Not enabling ccache integration.")
endif()