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 ()