diff --git a/scripts/automator/build/compiler-defaults b/scripts/automator/build/compiler-defaults index 9af67cfd..502aec77 100644 --- a/scripts/automator/build/compiler-defaults +++ b/scripts/automator/build/compiler-defaults @@ -5,10 +5,10 @@ cc="" cxx="" ld="" ranlib="" -cflags=(-Wall -pipe) -cxxonly=("") -ldflags=("") -libs=("") +cflags+=(-Wall -pipe) +cxxonly+=("") +ldflags+=("") +libs+=("") # Use ccache if it's available if command -v ccache &> /dev/null; then diff --git a/scripts/automator/build/gcc-linux_armv7_mali b/scripts/automator/build/gcc-linux_armv7_mali new file mode 100644 index 00000000..ed7ba8c2 --- /dev/null +++ b/scripts/automator/build/gcc-linux_armv7_mali @@ -0,0 +1,2 @@ +# GCC flags for generically identified ARMv7 MALI SBCs +cflags_release+=(-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_imx6 b/scripts/automator/build/gcc-linux_imx6 new file mode 100644 index 00000000..7bcb80d0 --- /dev/null +++ b/scripts/automator/build/gcc-linux_imx6 @@ -0,0 +1,3 @@ +# GCC flags specific to NXP's series of i.MX 6 SBCs +cflags_release+=(-march=armv7-a -mfpu=neon -mtune=cortex-a9 + -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_odroid_c1 b/scripts/automator/build/gcc-linux_odroid_c1 new file mode 100644 index 00000000..4773a649 --- /dev/null +++ b/scripts/automator/build/gcc-linux_odroid_c1 @@ -0,0 +1,2 @@ +# GCC flags specific to Hardkernel Co's ODROID-C1 SBC +cflags_release+=(-mcpu=cortex-a5 -mfpu=neon-vfpv4 -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_odroid_c2 b/scripts/automator/build/gcc-linux_odroid_c2 new file mode 100644 index 00000000..2fefb63f --- /dev/null +++ b/scripts/automator/build/gcc-linux_odroid_c2 @@ -0,0 +1,3 @@ +# GCC flags specific to Hardkernel Co's ODROID-C2 SBC +cflags_release+=(-march=armv8-a+crc -mtune=cortex-a53 + -mfpu=neon-fp-armv8) diff --git a/scripts/automator/build/gcc-linux_odroid_xu b/scripts/automator/build/gcc-linux_odroid_xu new file mode 100644 index 00000000..4d1f08e5 --- /dev/null +++ b/scripts/automator/build/gcc-linux_odroid_xu @@ -0,0 +1,2 @@ +# GCC flags specific to Hardkernel Co's ODROID-XU SBC +cflags_release+=(-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_rpi1 b/scripts/automator/build/gcc-linux_rpi1 new file mode 100644 index 00000000..36f4e8c4 --- /dev/null +++ b/scripts/automator/build/gcc-linux_rpi1 @@ -0,0 +1,2 @@ +# GCC flags specific to the Raspberry Pi 1 series of SBC +cflags_release+=(-mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_rpi2 b/scripts/automator/build/gcc-linux_rpi2 new file mode 100644 index 00000000..2db2ac81 --- /dev/null +++ b/scripts/automator/build/gcc-linux_rpi2 @@ -0,0 +1,2 @@ +# GCC flags specific to the Raspberry Pi 2 series of SBC +cflags_release+=(-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_rpi3 b/scripts/automator/build/gcc-linux_rpi3 new file mode 100644 index 00000000..54698406 --- /dev/null +++ b/scripts/automator/build/gcc-linux_rpi3 @@ -0,0 +1,4 @@ +# GCC flags specific to the Raspberry Pi 3 series of SBC +cflags_release+=(-march=armv8-a+crc -mtune=cortex-a53 + -mfpu=neon-fp-armv8 -mfloat-abi=hard) + diff --git a/scripts/automator/build/gcc-linux_rpi4 b/scripts/automator/build/gcc-linux_rpi4 new file mode 100644 index 00000000..bff6f080 --- /dev/null +++ b/scripts/automator/build/gcc-linux_rpi4 @@ -0,0 +1,3 @@ +# GCC flags specific to the Raspberry Pi 4 series of SBC +cflags_release+=(-march=armv8-a+crc -mtune=cortex-a72 + -mfpu=neon-fp-armv8 -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_tinker b/scripts/automator/build/gcc-linux_tinker new file mode 100644 index 00000000..c52d3e61 --- /dev/null +++ b/scripts/automator/build/gcc-linux_tinker @@ -0,0 +1,3 @@ +# GCC flags specific to the ASUS Tinker Board SBC +cflags_release+=(-marm -march=armv7-a -mtune=cortex-a17 -mfpu=neon-vfpv4 + -mfloat-abi=hard) diff --git a/scripts/automator/build/gcc-linux_vero4k b/scripts/automator/build/gcc-linux_vero4k new file mode 100644 index 00000000..e3dcd466 --- /dev/null +++ b/scripts/automator/build/gcc-linux_vero4k @@ -0,0 +1,2 @@ +# GCC flags specific to the OSMC Vero 4K SBC +cflags_release+=(-mcpu=cortex-a7 -mfpu=neon-vfpv4) diff --git a/scripts/automator/build/clang-linux_armv7l b/scripts/automator/build/machine-armv7_mali similarity index 100% rename from scripts/automator/build/clang-linux_armv7l rename to scripts/automator/build/machine-armv7_mali diff --git a/scripts/automator/build/gcc-linux_armv7l b/scripts/automator/build/machine-imx6 similarity index 100% rename from scripts/automator/build/gcc-linux_armv7l rename to scripts/automator/build/machine-imx6 diff --git a/scripts/automator/build/machine-armv7l b/scripts/automator/build/machine-odroid_c1 similarity index 100% rename from scripts/automator/build/machine-armv7l rename to scripts/automator/build/machine-odroid_c1 diff --git a/scripts/automator/build/machine-odroid_c2 b/scripts/automator/build/machine-odroid_c2 new file mode 100644 index 00000000..e69de29b diff --git a/scripts/automator/build/machine-odroid_xu b/scripts/automator/build/machine-odroid_xu new file mode 100644 index 00000000..e69de29b diff --git a/scripts/automator/build/machine-rpi1 b/scripts/automator/build/machine-rpi1 new file mode 100644 index 00000000..e69de29b diff --git a/scripts/automator/build/machine-rpi2 b/scripts/automator/build/machine-rpi2 new file mode 100644 index 00000000..e69de29b diff --git a/scripts/automator/build/machine-rpi3 b/scripts/automator/build/machine-rpi3 new file mode 100644 index 00000000..e69de29b diff --git a/scripts/automator/build/machine-rpi4 b/scripts/automator/build/machine-rpi4 new file mode 100644 index 00000000..e69de29b diff --git a/scripts/automator/build/machine-tinker b/scripts/automator/build/machine-tinker new file mode 100644 index 00000000..e69de29b diff --git a/scripts/automator/build/machine-vero4k b/scripts/automator/build/machine-vero4k new file mode 100644 index 00000000..12372b1b --- /dev/null +++ b/scripts/automator/build/machine-vero4k @@ -0,0 +1,3 @@ +# Universal flags specific to the OSMC Vero 4K SBC +cflags+=(-I/opt/vero3/include) +ldflags+=(-L/opt/vero3/lib) diff --git a/scripts/build.sh b/scripts/build.sh index b9b8861c..d07cf83e 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -9,10 +9,11 @@ # If run without arguments, the script asks for required arguments one # by one, which includes the above two (--compiler and --build-type). # -# Optional arguments include the version of compiler and additional -# build modifiers such as link-time-optimizations (--modifier lto), -# feedback-directed-optimizations (--modifier fdo), and taking advantage -# of the building-machine's full instructions sets (--modifier native). +# Optional arguments allow specifying the version of compiler, +# machine type, and applying build modifiers such as: +# - link-time-optimizations (--modifier lto), +# - feedback-directed-optimizations (--modifier fdo) +# - current processor instructions sets (--modifier native) # All modifiers are available simulatenously. # # Usage examples: @@ -25,6 +26,73 @@ # set -euo pipefail +# Detects the machine type and sets the 'machine' variable +function query_machine() { + # Start with a sane and safe default + machine="$(uname -m | sed 's/-.*//')" + + # Only attempt further detection on Linux-based systems + if [[ ! -f /proc/cpuinfo ]]; then + return + fi + # ARM differentiation based on + # https://github.com/RetroPie/RetroPie-Setup/blob/master/scriptmodules/system.sh + case "$(sed -n '/^Hardware/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo)" in + BCM*) + # calculated based on information from + # https://github.com/AndrewFromMelbourne/raspberry_pi_revision + local rev + rev="0x$(sed -n '/^Revision/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo)" + # if bit 23 is not set, we are on a rpi1 + # (bit 23 means the revision is a bitfield) + if [[ $((("$rev" >> 23) & 1)) -eq 0 ]]; then + machine="rpi1" + else + # if bit 23 is set, get the cpu from bits 12-15 + local cpu + cpu=$((("$rev" >> 12) & 15)) + case $cpu in + 0) + machine="rpi1" + ;; + 1) + machine="rpi2" + ;; + 2) + machine="rpi3" + ;; + 3) + machine="rpi4" + ;; + esac + fi + ;; + ODROIDC) + machine="odroid_c1" + ;; + ODROID-C2) + machine="odroid_c2" + ;; + "Freescale i.MX6 Quad/DualLite (Device Tree)") + machine="imx6" + ;; + ODROID-XU[34]) + machine="odroid_xu" + ;; + "Rockchip (Device Tree)") + machine="tinker" + ;; + Vero4K|Vero4KPlus) + machine="vero4k" + ;; + "Allwinner sun8i Family") + machine="armv7_mali" + ;; + *) + ;; + esac +} + function parse_args() { # Gather the parameters that define this build postfix="" @@ -36,19 +104,32 @@ function parse_args() { -t|--build-type) selected_type="${2}"; shift 2;; -m|--modifier) modifiers+=("${2}"); shift 2;; -p|--bin-path) PATH="${2}:${PATH}"; shift 2;; + -a|--machine) machine="${2}"; shift 2;; *) configure_additions+=("${1}"); shift;; esac; done - # Import our settings and report missing values - machine="$(uname -m | sed 's/-.*//')"; import machine "${machine}" - os="$(uname -s | sed 's/-.*//')"; import os "${os}" + # Determine and import machine-specific rules + if [[ -z "${machine:-}" ]]; then + query_machine + fi + import machine "${machine}" + + # Determine and import OS-specific rules + os="$(uname -s | sed 's/-.*//')" + import os "${os}" + + # Import compiler rules, plus any OS + machine customizations import compiler "${compiler:-}" import "${compiler:-}" "${os}_${machine}" - if [[ -z "${selected_type:-}" ]]; then arg_error "--build-type" "${TYPES[*]}"; fi + if [[ -z "${selected_type:-}" ]]; then + arg_error "--build-type" "${TYPES[*]}" + fi # Create a pretty modifier string that we can add to our build-type printf -v mod_string '+%s' "${modifiers[@]:1}" - if [[ "${mod_string}" == "+" ]]; then mod_string=""; fi + if [[ "${mod_string}" == "+" ]]; then + mod_string="" + fi # Print a summary of our build configuration underline "Compiling a ${selected_type}${mod_string} build using "`