if(DEFINED ENV{ZYNQ_7020_SYSROOT}) set(ENV{ZYNQ_7020_ROOTFS} $ENV{ZYNQ_7020_SYSROOT}) endif() # CROSS_COMPILE also needs to be set accordingly or passed to the CMake command if(NOT DEFINED ENV{ZYNQ_7020_ROOTFS}) # Sysroot has not been cached yet and was not set in environment either if(NOT DEFINED SYSROOT_PATH) message(FATAL_ERROR "Define the ZYNQ_7020_ROOTFS variable to point to the Zynq-7020 rootfs." ) endif() else() set(SYSROOT_PATH "$ENV{ZYNQ_7020_ROOTFS}" CACHE PATH "Zynq-7020 root filesystem path") endif() if(NOT DEFINED ENV{CROSS_COMPILE}) set(CROSS_COMPILE "arm-linux-gnueabihf") message(STATUS "No CROSS_COMPILE environmental variable set, using default ARM linux " "cross compiler name ${CROSS_COMPILE}" ) else() set(CROSS_COMPILE "$ENV{CROSS_COMPILE}") message(STATUS "Using environmental variable CROSS_COMPILE as cross-compiler: " "$ENV{CROSS_COMPILE}" ) endif() message(STATUS "Using sysroot path: ${SYSROOT_PATH}") set(CROSS_COMPILE_CC "${CROSS_COMPILE}-gcc") set(CROSS_COMPILE_CXX "${CROSS_COMPILE}-g++") set(CROSS_COMPILE_LD "${CROSS_COMPILE}-ld") set(CROSS_COMPILE_AR "${CROSS_COMPILE}-ar") set(CROSS_COMPILE_RANLIB "${CROSS_COMPILE}-ranlib") set(CROSS_COMPILE_STRIP "${CROSS_COMPILE}-strip") set(CROSS_COMPILE_NM "${CROSS_COMPILE}-nm") set(CROSS_COMPILE_OBJCOPY "${CROSS_COMPILE}-objcopy") set(CROSS_COMPILE_SIZE "${CROSS_COMPILE}-size") # At the very least, cross compile gcc and g++ have to be set! find_program (CMAKE_C_COMPILER ${CROSS_COMPILE_CC} REQUIRED) find_program (CMAKE_CXX_COMPILER ${CROSS_COMPILE_CXX} REQUIRED) # Useful utilities, not strictly necessary find_program(CMAKE_SIZE ${CROSS_COMPILE_SIZE}) find_program(CMAKE_OBJCOPY ${CROSS_COMPILE_OBJCOPY}) find_program(CMAKE_STRIP ${CROSS_COMPILE_STRIP}) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_SYSROOT "${SYSROOT_PATH}") # Define name of the target system set(CMAKE_SYSTEM_NAME "Linux") set(CMAKE_SYSTEM_PROCESSOR "armv7") # Define the compiler set(CMAKE_C_COMPILER ${CROSS_COMPILE_CC}) set(CMAKE_CXX_COMPILER ${CROSS_COMPILE_CXX}) if(EIVE_SYSROOT_MAGIC) # List of library dirs where LD has to look. Pass them directly through gcc. set(LIB_DIRS "${SYSROOT_PATH}/usr/include" "${SYSROOT_PATH}/usr/include/linux" "${SYSROOT_PATH}/usr/lib" "${SYSROOT_PATH}/lib" "${SYSROOT_PATH}" "${SYSROOT_PATH}/usr/lib/arm-xiphos-linux-gnueabi" ) # You can additionally check the linker paths if you add the # flags ' -Xlinker --verbose' set(COMMON_FLAGS "-I${SYSROOT_PATH}/usr/lib") foreach(LIB ${LIB_DIRS}) set(COMMON_FLAGS "${COMMON_FLAGS} -L${LIB} -Wl,-rpath-link,${LIB}") endforeach() endif() set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" # "${SYSROOT_PATH}/usr/lib/${CROSS_COMPILE}" ) set(C_FLAGS -mcpu=cortex-a9 -mfpu=neon-vfpv3 -mfloat-abi=hard ${COMMON_FLAGS} -lgpiod ) string (REPLACE ";" " " C_FLAGS "${C_FLAGS}") set(CMAKE_C_FLAGS ${C_FLAGS} CACHE STRING "C flags for Zynq-7020" ) set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "CPP flags for Zynq-7020" ) # search for programs in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)