set(MCU_LINKER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/${MCU_LINKER_SCRIPT}")
set(HAL_DIR ${CMAKE_CURRENT_LIST_DIR})

set(USER_STARTUP ${CMAKE_CURRENT_LIST_DIR}/startup_user.S ${CMAKE_CURRENT_LIST_DIR}/startup_user.cpp ${CMAKE_CURRENT_LIST_DIR}/Src/api.cpp)

function(blit_executable_common NAME)
	target_link_libraries(${NAME} BlitEngine)
	set_property(TARGET ${NAME} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Map=${NAME}.map,--cref")
	add_custom_command(TARGET ${NAME} POST_BUILD
		COMMENT "Building ${NAME}.bin"
		COMMAND ${CMAKE_OBJCOPY} -O binary -S $<TARGET_FILE:${NAME}> ${NAME}.bin
		COMMAND ${CMAKE_SIZE} $<TARGET_FILE:${NAME}>
		VERBATIM
	)
endfunction()

function(blit_executable NAME)
	message(STATUS "Processing ${NAME}")
	blit_executable_args(${ARGN})

	if(INTERNAL_FLASH)
		# make sure the HAL is built (external projects)
		if(NOT TARGET BlitHalSTM32)
			add_subdirectory(${HAL_DIR} 32blit-stm32)
		endif()

		blit_executable_int_flash(${NAME} ${SOURCES})
		return()
	endif()

	set_source_files_properties(${USER_STARTUP} PROPERTIES LANGUAGE CXX)
	add_executable(${NAME} ${USER_STARTUP} ${SOURCES})

	# Ideally we want the .blit filename to match the .elf, but TARGET_FILE_BASE_NAME isn't always available
	# (This only affects the firmware updater as it's the only thing setting a custom OUTPUT_NAME)
	if(${CMAKE_VERSION} VERSION_LESS "3.15.0")
		set(BLIT_FILENAME ${NAME}.blit)
	else()
		set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${NAME}>.blit)
	endif()

	install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
		DESTINATION bin
	)

	set_target_properties(${NAME} PROPERTIES
		LINK_FLAGS "-specs=nano.specs -u _printf_float -fPIC -T ${MCU_LINKER_SCRIPT} ${MCU_LINKER_FLAGS_EXT} -Wl,--emit-relocs"
	)
	set_target_properties(${NAME} PROPERTIES LINK_DEPENDS ${MCU_LINKER_SCRIPT} SUFFIX ".elf")

	blit_executable_common(${NAME})
	target_link_libraries(${NAME} ${PIC_STDLIBS})

	add_custom_command(TARGET ${NAME} POST_BUILD
		COMMENT "Building ${NAME}.blit"
		COMMAND ${32BLIT_TOOLS_EXECUTABLE} relocs --elf-file $<TARGET_FILE:${NAME}> --bin-file ${NAME}.bin --output ${BLIT_FILENAME}
		VERBATIM
	)

	add_custom_target(${NAME}.flash DEPENDS ${NAME} COMMAND ${32BLIT_TOOLS_EXECUTABLE} install --port=${FLASH_PORT} --launch ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME})
endfunction()

function(blit_metadata TARGET FILE)
	if(NOT IS_ABSOLUTE ${FILE})
		set(FILE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
	endif()

	# cause cmake to reconfigure whenever the asset list changes
	set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FILE})

	# get the inputs/outputs for the asset tool (at configure time)
	execute_process(
		COMMAND ${32BLIT_TOOLS_EXECUTABLE} cmake --config ${FILE} --cmake ${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake
		RESULT_VARIABLE TOOL_RESULT
	)
	if(${TOOL_RESULT})
		message(FATAL_ERROR "Reading metadata config failed!\n")
	endif()

	include(${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake)

	if(${CMAKE_VERSION} VERSION_LESS "3.15.0")
		set(BLIT_FILENAME ${TARGET}.blit)
	else()
		set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${TARGET}>.blit)
	endif()

	add_custom_command(
		TARGET ${TARGET} POST_BUILD
		COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${32BLIT_TOOLS_EXECUTABLE} metadata --config ${FILE} --file ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
		VERBATIM
	)

	# force relink on change so that the post-build commands are rerun
	set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS ${FILE} ${METADATA_DEPENDS})
endfunction()
