cmake_minimum_required(VERSION 3.16)
project(qwen_lora_finetune_cli CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

option(QWEN_USE_HF_TOKENIZERS "Enable native HF tokenizers-cpp (Rust) for Qwen" ON)
if(QWEN_USE_HF_TOKENIZERS)
    find_program(QWEN_RUSTC rustc)
    find_program(QWEN_CARGO cargo)
    if(NOT QWEN_RUSTC OR NOT QWEN_CARGO)
        message(FATAL_ERROR "HF tokenizers require rustc and cargo on PATH. Install a modern Rust toolchain using https://rust-lang.org/tools/install/ and configure again.")
    endif()
    execute_process(COMMAND "${QWEN_RUSTC}" --version
                    RESULT_VARIABLE QWEN_RUST_RESULT OUTPUT_VARIABLE QWEN_RUST_VERSION)
    string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" QWEN_RUST_VERSION "${QWEN_RUST_VERSION}")
    if(NOT QWEN_RUST_RESULT EQUAL 0 OR NOT QWEN_RUST_VERSION OR QWEN_RUST_VERSION VERSION_LESS "1.77.0")
        message(FATAL_ERROR "Rust ${QWEN_RUST_VERSION} is too old for the resolved tokenizer dependencies (thiserror needs >=1.77). Use a current supported toolchain; see https://rust-lang.org/tools/install/. This check does not change the system toolchain.")
    endif()
    set(USE_HF_TOKENIZERS ON CACHE BOOL "Enable HF tokenizers-cpp (from Qwen build)" FORCE)
endif()

set(MFT_OPERATORS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../third_party/mobilefinetuner/operators")
add_subdirectory(${MFT_OPERATORS_DIR} ${CMAKE_BINARY_DIR}/operators)
include_directories(${MFT_OPERATORS_DIR})

# Unified training entrypoint
add_executable(train
    src/main.cpp
)
target_link_libraries(train PRIVATE operators)

if(APPLE)
    find_library(ACCELERATE_LIBRARY Accelerate)
    if(ACCELERATE_LIBRARY)
        target_link_libraries(train PRIVATE ${ACCELERATE_LIBRARY})
    endif()
endif()
