include(ExternalProject)
include(ProcessorCount)

find_program(NINJA NAMES ninja ninja-build)
find_program(MAKE NAMES make gmake)

if(NINJA)
    message(STATUS "Using Ninja as build system")
    set(GENERATOR "Ninja")  # Preferred generator
    ProcessorCount(NPROC)
    if(NPROC EQUAL 0)
        set(NPROC 1)
    endif()
    set(BUILD_COMMAND ${NINJA} -j ${NPROC})
    set(INSTALL_COMMAND ${NINJA} install)
else()
    message(STATUS "Falling back to Make as build system")
    set(GENERATOR "Unix Makefiles")  # Fallback generator
    ProcessorCount(NPROC)
    if(NPROC EQUAL 0)
        set(NPROC 1)
    endif()
    set(BUILD_COMMAND ${MAKE} -j ${NPROC})
    set(INSTALL_COMMAND ${MAKE} install)
endif()

set(MSDEBUG_MI_SOURCE_DIR "${ROOT_DIR}/msdebug-mi")
set(MSDEBUG_MI_BINARY_DIR "${PROJECT_BUILD_DIR}/msdebug-mi-build")

ExternalProject_Add(msdebug_mi_project
    SOURCE_DIR ${MSDEBUG_MI_SOURCE_DIR}
    BINARY_DIR ${MSDEBUG_MI_BINARY_DIR}
    CMAKE_ARGS
        -G ${GENERATOR}  # Uses appropriate generator automatically
        -DMS_DEBUGGER=1
        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
        -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
        -DLLVM_DIR=${LLVM_BINARY_DIR}/lib/cmake/llvm
        -DLLVM_BUILD_BINARY_DIR=${LLVM_BINARY_DIR}
        -DLibEdit_LIBRARIES=${LIBEDIT_INSTALL_DIR}/lib/libedit.so.0
        -DLibEdit_INCLUDE_DIRS=${LIBEDIT_INSTALL_DIR}/include
        -DLLVM_BUILD_BINARY_DIR=${LLVM_BINARY_DIR}/lib
        -DLLVM_ENABLE_LANGUAGE_C=OFF
        -DMS_DEBUGGER_LIBEDIT=${LIBEDIT_INSTALL_DIR}/lib
        -DMS_DEBUGGER_NCURSES=${NCURSES_INSTALL_DIR}/lib
        -DCMAKE_PREFIX_PATH=${LIBEDIT_INSTALL_DIR}/lib
        -DCMAKE_EXE_LINKER_FLAGS=-Wl,-rpath-link,${LIBEDIT_INSTALL_DIR}/lib

    USES_TERMINAL_BUILD TRUE    
    BUILD_COMMAND ${BUILD_COMMAND}
    INSTALL_COMMAND ${INSTALL_COMMAND}
    BUILD_ALWAYS ON
    DEPENDS llvm_project
)