This commit also converts our own copyright headers to directly use SPDX, but leaves all other copyright header intact, only adding the SPDX ident. As far as possible this commit also merges multiple Data61 copyright statements/headers into one for consistency.
123 lines
4.7 KiB
CMake
123 lines
4.7 KiB
CMake
#
|
|
# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
|
|
cmake_minimum_required(VERSION 3.7.2)
|
|
|
|
set(CMAKE_SYSTEM_NAME Generic)
|
|
# For a generic system this is unused, so define it to something that will be
|
|
# obvious if someone accidentally uses it
|
|
set(CMAKE_SYSTEM_PROCESSOR seL4CPU)
|
|
|
|
set(CMAKE_SYSROOT "${CMAKE_BINARY_DIR}")
|
|
set(CMAKE_STAGING_PREFIX "${CMAKE_BINARY_DIR}/staging")
|
|
|
|
# When this file is passed to configure_file in cmake, these variables get set to
|
|
# the kernel platform configuration.
|
|
set(sel4_arch @KernelSel4Arch@)
|
|
set(arch @KernelArch@)
|
|
set(mode @KernelWordSize@)
|
|
|
|
# This function hunts for an extant `gcc` with one of the candidate prefixes
|
|
# specified in `ARGN`, allowing us to try different target triple prefixes for
|
|
# cross-compilers built in various ways.
|
|
function(FindPrefixedGCC out_var)
|
|
set("${out_var}" "PrefixedGCC-NOTFOUND")
|
|
foreach(prefix ${ARGN})
|
|
set("test_var" "_GCC_${prefix}")
|
|
find_program("${test_var}" "${prefix}gcc")
|
|
if(${test_var})
|
|
message(STATUS "Found GCC with prefix ${prefix}")
|
|
set("${out_var}" "${prefix}")
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
if(${out_var})
|
|
set("${out_var}" "${${out_var}}" PARENT_SCOPE)
|
|
else()
|
|
message(FATAL_ERROR "Unable to find valid cross-compiling GCC")
|
|
endif()
|
|
endfunction(FindPrefixedGCC)
|
|
|
|
if("${CROSS_COMPILER_PREFIX}" STREQUAL "")
|
|
if(("${arch}" STREQUAL "arm") OR ("${arch}" STREQUAL "x86") OR ("${arch}" STREQUAL "riscv"))
|
|
if(${sel4_arch} STREQUAL "aarch32" OR ${sel4_arch} STREQUAL "arm_hyp")
|
|
FindPrefixedGCC(CROSS_COMPILER_PREFIX "arm-linux-gnueabi-" "arm-linux-gnu-")
|
|
elseif(${sel4_arch} STREQUAL "aarch64")
|
|
set(CROSS_COMPILER_PREFIX "aarch64-linux-gnu-" CACHE INTERNAL "")
|
|
elseif(${arch} STREQUAL "riscv")
|
|
set(CROSS_COMPILER_PREFIX "riscv64-unknown-linux-gnu-" CACHE INTERNAL "")
|
|
endif()
|
|
else()
|
|
# For backwards compatibility reasons we allow this file to work without templating.
|
|
# If initialised with -DCMAKE_TOOLCHAIN_FILE="$SCRIPT_PATH/gcc.cmake" this script
|
|
# understood the following arguments: ARM, AARCH32, AARCH32HF, AARCH64, RISCV32, RISCV64, APPLE
|
|
if(AARCH32 OR ARM)
|
|
FindPrefixedGCC(CROSS_COMPILER_PREFIX "arm-linux-gnueabi-" "arm-linux-gnu-")
|
|
if(ARM)
|
|
message("ARM flag is deprecated, please use AARCH32")
|
|
endif()
|
|
elseif(AARCH64)
|
|
set(CROSS_COMPILER_PREFIX "aarch64-linux-gnu-" CACHE INTERNAL "")
|
|
elseif(RISCV32 OR RISCV64)
|
|
set(CROSS_COMPILER_PREFIX "riscv64-unknown-linux-gnu-" CACHE INTERNAL "")
|
|
endif()
|
|
endif()
|
|
if(AARCH32HF)
|
|
FindPrefixedGCC(
|
|
CROSS_COMPILER_PREFIX
|
|
"arm-linux-gnueabihf-"
|
|
"arm-linux-gnu-" # Later checks should confirm this has `hardfp`
|
|
)
|
|
endif()
|
|
|
|
if("${CROSS_COMPILER_PREFIX}" STREQUAL "")
|
|
# If we haven't set a target above we assume x86_64/ia32 target
|
|
if(APPLE)
|
|
# APPLE is a CMake variable that evaluates to True on a Mac OSX system
|
|
set(CROSS_COMPILER_PREFIX "x86_64-unknown-linux-gnu-" CACHE INTERNAL "")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
set(CMAKE_C_COMPILER ${CROSS_COMPILER_PREFIX}gcc)
|
|
set(CMAKE_ASM_COMPILER ${CROSS_COMPILER_PREFIX}gcc)
|
|
set(CMAKE_CXX_COMPILER ${CROSS_COMPILER_PREFIX}g++)
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
|
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|
|
|
mark_as_advanced(FORCE CMAKE_TOOLCHAIN_FILE)
|
|
|
|
# Invoke compiler via ccache. This has no effect if ccache cannot be found.
|
|
# Projects can override this effect by resetting the RULE_LAUNCH_COMPILE and
|
|
# RULE_LAUNCH_LINK properties.
|
|
find_program(CCACHE ccache)
|
|
if(NOT ("${CCACHE}" STREQUAL CCACHE-NOTFOUND))
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
|
|
endif()
|
|
mark_as_advanced(CCACHE)
|
|
|
|
# GCC color options:
|
|
# Ninja and ccache cause gcc to not emit colored output when -fdiagnostics-color=auto.
|
|
# We upgrade this to -fdiagnostics-color=always if FORCE_COLORED_OUTPUT is set
|
|
# We default FORCE_COLORED_OUTPUT=ON if GCC_COLORS is set in the environment
|
|
# otherwise FORCE_COLORED_OUTPUT is left off.
|
|
if($ENV{GCC_COLORS})
|
|
set(coloured_output ON)
|
|
else()
|
|
set(coloured_output OFF)
|
|
endif()
|
|
option(FORCE_COLORED_OUTPUT "Always produce ANSI-colored output." ${coloured_output})
|
|
mark_as_advanced(FORCE_COLORED_OUTPUT)
|
|
if(${FORCE_COLORED_OUTPUT})
|
|
include_guard(GLOBAL)
|
|
add_compile_options(-fdiagnostics-color=always)
|
|
endif()
|