diff options
| author | Markus Mittendrein <git@maxmitti.at> | 2025-02-25 23:37:17 +0100 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.at> | 2025-02-25 23:39:45 +0100 |
| commit | 1b3d654c764b25cdd979acca0c956564cfe8358d (patch) | |
| tree | 25b08bca9fb82d4bc7b293d273dc095207e9d0d8 /cmake/clang-arm-gcc-toolchain.cmake | |
| download | msp432_test-master.tar.gz msp432_test-master.zip | |
Diffstat (limited to 'cmake/clang-arm-gcc-toolchain.cmake')
| -rw-r--r-- | cmake/clang-arm-gcc-toolchain.cmake | 91 |
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 () |
