Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xor-gate/c1e0a538bb3b60ac7299701192726f36 to your computer and use it in GitHub Desktop.
Save xor-gate/c1e0a538bb3b60ac7299701192726f36 to your computer and use it in GitHub Desktop.
# CMake Toolchain file for cross compilation to Alpine 3.7 running on a Raspberry Pi via LLVM.
# Dec. 2017, Oliver Kuckertz <oliver.kuckertz@mologie.de>
# https://mologie.github.io/blog/programming/2017/12/25/cross-compiling-cpp-with-cmake-llvm.html
# License: MIT
# Where did you create the Alpine sysroot? Oliver has his cross-toolchains in ~/Toolchains.
SET(CMAKE_SYSROOT "$ENV{HOME}/Toolchains/sysroots/alpine-armhf")
# Where is LLVM/clang installed on your host? These are defaults for common platforms:
IF(APPLE)
# LLVM 5.0 from Homebrew with Homebrew at its default path
SET(CROSS_LLVM_PREFIX "/usr/local/opt/llvm@5")
ELSEIF(UNIX)
# LLVM 5.0 installation from https://apt.llvm.org/
SET(CROSS_LLVM_PREFIX "/usr/lib/llvm-5.0")
ELSE()
MESSAGE(FATAL_ERROR "You'll have to edit this toolchain file and add rules for your platform.")
ENDIF()
# Configure target platform, change these when porting:
SET(CMAKE_SYSTEM_NAME Linux) # uname -o
SET(CMAKE_SYSTEM_PROCESSOR armv6) # uname -p
SET(CROSS_TARGET armv6-alpine-linux-musleabihf)
SET(CROSS_GCC_BASEVER "6.4.0") # Alpine 3.7 uses GCC 6.4
SET(CROSS_MACHINE_FLAGS "-marm -march=armv6zk -mfloat-abi=hard -mfpu=vfp")
# Here be dragons! This is boilerplate code for wrangling CMake into working with a standalone LLVM
# installation and all of CMake's quirks. Side effect: Linker flags are no longer passed to ar (and
# neither should they be.) When editing, use plenty of fish to keep the dragon sated.
SET(CROSS_LIBSTDCPP_INC_DIR "/usr/include/c++/${CROSS_GCC_BASEVER}")
SET(CROSS_LIBSTDCPPBITS_INC_DIR "${CROSS_LIBSTDCPP_INC_DIR}/${CROSS_TARGET}")
SET(CROSS_LIBGCC_DIR "/usr/lib/gcc/${CROSS_TARGET}/${CROSS_GCC_BASEVER}")
SET(CROSS_COMPILER_FLAGS "")
SET(CROSS_LINKER_FLAGS "-fuse-ld=lld -stdlib=libstdc++ -L \"${CROSS_LIBGCC_DIR}\"")
SET(CMAKE_CROSSCOMPILING ON)
SET(CMAKE_AR "${CROSS_LLVM_PREFIX}/bin/llvm-ar" CACHE FILEPATH "" FORCE)
SET(CMAKE_NM "${CROSS_LLVM_PREFIX}/bin/llvm-nm" CACHE FILEPATH "" FORCE)
SET(CMAKE_RANLIB "${CROSS_LLVM_PREFIX}/bin/llvm-ranlib" CACHE FILEPATH "" FORCE)
SET(CMAKE_C_COMPILER ${CROSS_LLVM_PREFIX}/bin/clang)
SET(CMAKE_C_COMPILER_TARGET ${CROSS_TARGET})
SET(CMAKE_C_FLAGS "${CROSS_COMPILER_FLAGS} ${CROSS_MACHINE_FLAGS}" CACHE STRING "" FORCE)
SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <OBJECTS>")
SET(CMAKE_CXX_COMPILER ${CROSS_LLVM_PREFIX}/bin/clang++)
SET(CMAKE_CXX_COMPILER_TARGET ${CROSS_TARGET})
SET(CMAKE_CXX_FLAGS "${CROSS_COMPILER_FLAGS} ${CROSS_MACHINE_FLAGS}" CACHE STRING "" FORCE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -iwithsysroot \"${CROSS_LIBSTDCPP_INC_DIR}\"")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -iwithsysroot \"${CROSS_LIBSTDCPPBITS_INC_DIR}\"")
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <OBJECTS>")
SET(CMAKE_EXE_LINKER_FLAGS ${CROSS_LINKER_FLAGS} CACHE STRING "" FORCE)
SET(CMAKE_MODULE_LINKER_FLAGS ${CROSS_LINKER_FLAGS} CACHE STRING "" FORCE)
SET(CMAKE_SHARED_LINKER_FLAGS ${CROSS_LINKER_FLAGS} CACHE STRING "" FORCE)
SET(CMAKE_STATIC_LINKER_FLAGS ${CROSS_LINKER_FLAGS} CACHE STRING "" FORCE)
SET(CMAKE_FIND_ROOT_PATH ${CROSS_LLVM_PREFIX})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment