diff --git a/sdk/cmake/functions.cmake b/sdk/cmake/functions.cmake index fe17eea..1b29f4f 100644 --- a/sdk/cmake/functions.cmake +++ b/sdk/cmake/functions.cmake @@ -59,6 +59,34 @@ function(add_module_linker_flags MODULE FLAGS) set_module_property(${MODULE} LINK_FLAGS ${FLAGS}) endfunction() +# This function compiles an assembly bootsector file into a flat binary +function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT) + set(BINARY_NAME "${NAME}.bin") + set(OBJECT_NAME "${NAME}.obj") + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME} + COMMAND ${CMAKE_ASM_COMPILER} + /nologo + --target=i386-none-elf + /Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME} + -c -- ${SOURCE} + COMMAND ${CMAKE_ASM_LINKER} + -m elf_i386 + --image-base=0 + --oformat binary + -Ttext=${BASEADDR} + --entry=_start${ENTRYPOINT} + -o ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME} + DEPENDS ${SOURCE} + ) + + add_custom_target(${NAME} ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME} + ) +endfunction() + # This function sets a property for specified module function(set_module_property MODULE PROPERTY FLAGS) if(NOT ${ARGC} EQUAL 3) diff --git a/sdk/cmake/toolchain.cmake b/sdk/cmake/toolchain.cmake index 051e5c6..1b27a2e 100644 --- a/sdk/cmake/toolchain.cmake +++ b/sdk/cmake/toolchain.cmake @@ -3,8 +3,10 @@ set(CMAKE_SYSTEM_NAME Windows) # Set toolchain compilers set(CMAKE_ASM_COMPILER clang-cl) +set(CMAKE_ASM_LINKER ld.lld) set(CMAKE_C_COMPILER clang-cl) set(CMAKE_CXX_COMPILER clang-cl) +set(CMAKE_LINKER lld-link) set(CMAKE_MC_COMPILER wmc) set(CMAKE_RC_COMPILER wrc) set(CMAKE_SPEC_COMPILER xtcspecc)