summaryrefslogtreecommitdiffstats
path: root/cmake/clang-arm-gcc-toolchain.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/clang-arm-gcc-toolchain.cmake')
-rw-r--r--cmake/clang-arm-gcc-toolchain.cmake91
1 files changed, 91 insertions, 0 deletions
diff --git a/cmake/clang-arm-gcc-toolchain.cmake b/cmake/clang-arm-gcc-toolchain.cmake
new file mode 100644
index 0000000..091dad3
--- /dev/null
+++ b/cmake/clang-arm-gcc-toolchain.cmake
@@ -0,0 +1,91 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR ARM)
+
+set(TOOLCHAIN_PREFIX arm-none-eabi-)
+set(TOOLCHAIN_TRIPLE arm-none-eabi)
+find_program(BINUTILS_PATH ${TOOLCHAIN_PREFIX}gcc NO_CACHE)
+
+if (NOT BINUTILS_PATH)
+ message(FATAL_ERROR "ARM GCC toolchain not found")
+endif ()
+
+cmake_path(GET BINUTILS_PATH PARENT_PATH ARM_TOOLCHAIN_DIR)
+set(ARM_GCC_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
+execute_process(COMMAND ${ARM_GCC_C_COMPILER} -print-sysroot
+ OUTPUT_VARIABLE ARM_GCC_SYSROOT OUTPUT_STRIP_TRAILING_WHITESPACE)
+# get GNU ARM GCC version
+execute_process(COMMAND ${ARM_GCC_C_COMPILER} --version
+ OUTPUT_VARIABLE ARM_GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+string(REGEX MATCH " [0-9]+\.[0-9]+\.[0-9]+" ARM_GCC_VERSION ${ARM_GCC_VERSION})
+string(STRIP ${ARM_GCC_VERSION} ARM_GCC_VERSION)
+
+# set compiler triple
+set(triple ${TOOLCHAIN_TRIPLE})
+set(CMAKE_ASM_COMPILER clang)
+set(CMAKE_ASM_COMPILER_TARGET ${triple})
+set(CMAKE_C_COMPILER clang)
+set(CMAKE_C_COMPILER_TARGET ${triple})
+set(CMAKE_CXX_COMPILER clang++)
+set(CMAKE_CXX_COMPILER_TARGET ${triple})
+
+set(CMAKE_C_FLAGS_INIT " -B${ARM_TOOLCHAIN_DIR}")
+set(CMAKE_CXX_FLAGS_INIT " -B${ARM_TOOLCHAIN_DIR} ")
+# Without that flag CMake is not able to pass test compilation check
+if (${CMAKE_VERSION} VERSION_EQUAL "3.6.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.6")
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+else ()
+ set(CMAKE_EXE_LINKER_FLAGS_INIT "-nostdlib")
+endif ()
+
+set(CMAKE_OBJCOPY llvm-objcopy CACHE INTERNAL "objcopy tool")
+set(CMAKE_SIZE_UTIL llvm-size CACHE INTERNAL "size tool")
+# Default C compiler flags
+set(CMAKE_C_FLAGS_DEBUG_INIT "-g3 -Og -Wall -pedantic -DDEBUG")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG_INIT}" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_RELEASE_INIT "-O3 -Wall")
+set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE_INIT}" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_MINSIZEREL_INIT "-Oz -Wall")
+set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL_INIT}" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g -Wall")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING "" FORCE)
+# Default C++ compiler flags
+set(TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG "")
+string(APPEND TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG " -cxx-isystem ${ARM_GCC_SYSROOT}/include/c++/${ARM_GCC_VERSION}")
+string(APPEND TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG " -cxx-isystem ${ARM_GCC_SYSROOT}/include/c++/${ARM_GCC_VERSION}/arm-none-eabi")
+string(APPEND TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG " -cxx-isystem ${ARM_GCC_SYSROOT}/include/c++/${ARM_GCC_VERSION}/backward")
+set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g3 -Og -Wall -pedantic -DDEBUG ${TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG}")
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG_INIT}" CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3 -Wall ${TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG}")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE_INIT}" CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Oz -Wall ${TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG}")
+set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL_INIT}" CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g -Wall ${TOOLCHAIN_CXX_INCLUDE_DIRS_FLAG}")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING "" FORCE)
+
+set(CMAKE_SYSROOT ${ARM_GCC_SYSROOT})
+set(CMAKE_FIND_ROOT_PATH ${ARM_GCC_SYSROOT})
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
+
+
+if (ARCH_FLAGS)
+ execute_process(COMMAND ${ARM_GCC_C_COMPILER} ${ARCH_FLAGS} -print-libgcc-file-name
+ OUTPUT_VARIABLE __ARM_GCC_LIBGCC
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ cmake_path(GET __ARM_GCC_LIBGCC PARENT_PATH LIBGCC_DIR)
+
+ execute_process(COMMAND ${ARM_GCC_C_COMPILER} ${ARCH_FLAGS} -print-multi-directory
+ OUTPUT_VARIABLE ARM_GCC_MULTIDIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ if (NOT TARGET toolchain)
+ add_library(toolchain INTERFACE)
+ target_compile_options(toolchain INTERFACE "-fno-exceptions")
+ target_link_directories(toolchain INTERFACE "${LIBGCC_DIR}")
+ target_link_libraries(toolchain INTERFACE -nostdlib -lc_nano -lnosys -lgcc -lstdc++_nano -lm)
+ target_link_options(toolchain INTERFACE "-Wl,--gc-sections" "-Wl,--print-memory-usage")
+
+ target_sources(toolchain INTERFACE "${LIBGCC_DIR}/crti.o" "${ARM_GCC_SYSROOT}/lib/${ARM_GCC_MULTIDIR}/crt0.o" "${LIBGCC_DIR}/crtbegin.o" "${LIBGCC_DIR}/crtend.o" "${LIBGCC_DIR}/crtn.o")
+ endif ()
+endif ()