toolchain.cmake 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. if (WIN32)
  2. set(EXT ".exe")
  3. else ()
  4. set(EXT "")
  5. endif ()
  6. message(STATUS "Check for RISCV toolchain ...")
  7. if(NOT TOOLCHAIN)
  8. find_path(_TOOLCHAIN riscv64-unknown-elf-gcc${EXT})
  9. global_set(TOOLCHAIN "${_TOOLCHAIN}")
  10. elseif(NOT "${TOOLCHAIN}" MATCHES "/$")
  11. global_set(TOOLCHAIN "${TOOLCHAIN}")
  12. endif()
  13. if (NOT TOOLCHAIN)
  14. message(FATAL_ERROR "TOOLCHAIN must be set, to absolute path of kendryte-toolchain dist/bin folder.")
  15. endif ()
  16. message(STATUS "Using ${TOOLCHAIN} RISCV toolchain")
  17. global_set(CMAKE_C_COMPILER "${TOOLCHAIN}/riscv64-unknown-elf-gcc${EXT}")
  18. global_set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/riscv64-unknown-elf-g++${EXT}")
  19. global_set(CMAKE_LINKER "${TOOLCHAIN}/riscv64-unknown-elf-ld${EXT}")
  20. global_set(CMAKE_AR "${TOOLCHAIN}/riscv64-unknown-elf-ar${EXT}")
  21. global_set(CMAKE_OBJCOPY "${TOOLCHAIN}/riscv64-unknown-elf-objcopy${EXT}")
  22. global_set(CMAKE_SIZE "${TOOLCHAIN}/riscv64-unknown-elf-size${EXT}")
  23. global_set(CMAKE_OBJDUMP "${TOOLCHAIN}/riscv64-unknown-elf-objdump${EXT}")
  24. global_set(CMAKE_RANLIB "${TOOLCHAIN}/riscv64-unknown-elf-ranlib${EXT}")
  25. if (WIN32)
  26. if(EXISTS "${TOOLCHAIN}/make${EXT}")
  27. global_set(CMAKE_MAKE_PROGRAM "${TOOLCHAIN}/make${EXT}")
  28. else()
  29. global_set(CMAKE_MAKE_PROGRAM "${TOOLCHAIN}/mingw32-make${EXT}")
  30. endif()
  31. endif ()
  32. execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crt0.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRT0_OBJ)
  33. execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crtbegin.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTBEGIN_OBJ)
  34. execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crtend.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTEND_OBJ)
  35. execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crti.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTI_OBJ)
  36. execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crtn.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTN_OBJ)
  37. global_set(CMAKE_C_LINK_EXECUTABLE
  38. "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> \"${CRTI_OBJ}\" \"${CRTBEGIN_OBJ}\" <OBJECTS> \"${CRTEND_OBJ}\" \"${CRTN_OBJ}\" -o <TARGET> <LINK_LIBRARIES>")
  39. global_set(CMAKE_CXX_LINK_EXECUTABLE
  40. "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> \"${CRTI_OBJ}\" \"${CRTBEGIN_OBJ}\" <OBJECTS> \"${CRTEND_OBJ}\" \"${CRTN_OBJ}\" -o <TARGET> <LINK_LIBRARIES>")
  41. get_filename_component(_BIN_DIR "${CMAKE_C_COMPILER}" DIRECTORY)
  42. if (NOT "${TOOLCHAIN}" STREQUAL "${_BIN_DIR}")
  43. message(FATAL_ERROR "CMAKE_C_COMPILER is not in kendryte-toolchain dist/bin folder.")
  44. endif ()