cmake_minimum_required(VERSION 3.16)
project(rustApps NONE)

function(add_rust_app NAME)
    set(RUST_TARGET "x86_64-termos")
    set(RUST_ELF_FILE "${CMAKE_CURRENT_SOURCE_DIR}/target/${RUST_TARGET}/release/${NAME}")
    
    set(STARTUP_VOLUME_DIR "${CMAKE_BINARY_DIR}/StartupVolume/System/CoreServices")
    set(FINAL_HOT_PATH "${STARTUP_VOLUME_DIR}/${NAME}")
    set(STRIPPED_ELF "${CMAKE_CURRENT_BINARY_DIR}/${NAME}.stripped")
    set(ELF2HOT_DIR "${CMAKE_SOURCE_DIR}/tools/elf2hot")

    file(MAKE_DIRECTORY "${STARTUP_VOLUME_DIR}")

    add_custom_target(${NAME} ALL
        COMMAND cargo build --package ${NAME} --release --target ${RUST_TARGET}
        
        COMMAND objcopy --strip-all ${RUST_ELF_FILE} ${STRIPPED_ELF}
         
        COMMAND ${CMAKE_COMMAND} -E chdir ${ELF2HOT_DIR} cargo run --release --quiet -- ${STRIPPED_ELF} ${FINAL_HOT_PATH}
        
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        COMMENT "Building, stripping and packing ${NAME} to initramfs..."
        VERBATIM
    )
endfunction()

add_rust_app(rtest)