#!/bin/bash # This version is heavily based on the work of mz-fuzzy (https://github.com/mz-fuzzy) # adapted to work with MySensors project. # Original work: https://github.com/TMRh20/RF24/blob/master/configure function help { cat < CPU defining/optimizing flags to be used. [configure autodetected] --extra-cxxflags= Extra C flags passed to C/C++ compilation. [] --extra-ldflags= Extra C flags passed to linking. [] --cxx_compiler= C++ compiler [arm-linux-gnueabihf-g++][g++] --no-clean Don't clean previous build artifacts. Installation options: --prefix= Installation prefix path. [/usr/local] --gateway-dir= Gateway files installation directory. [PREFIX/bin] MySensors options: --my-debug=[enable|disable] Enables or disables MySensors core debugging. [enable] --my-config-file= Config file path. [/etc/mysensors.dat] --my-gateway=[ethernet|serial|mqtt] Gateway type, set to none to disable gateway feature. [ethernet] --my-node-id= Disable gateway feature and run as a node with given id. --my-controller-url-address= Controller or MQTT broker url. --my-controller-ip-address= Controller or MQTT broker ip. --my-port= The port to keep open on gateway mode. If gateway is set to mqtt, it sets the broker port. --my-serial-port= Serial port. [/dev/ttyACM0] --my-serial-baudrate= Serial baud rate. [115200] --my-serial-is-pty Set the serial port to be a pseudo terminal. Use this if you want to connect to a controller running on the same device. --my-serial-pty= Symlink name for the PTY device. [/dev/ttyMySensorsGateway] --my-serial-groupname= Grant access to the specified system group for the serial device. --my-mqtt-client-id= MQTT client id. --my-mqtt-publish-topic-prefix= MQTT publish topic prefix. --my-mqtt-subscribe-topic-prefix= MQTT subscribe topic prefix. --my-transport=[none|nrf24|rs485] Transport type, set to none to disable transport feature. [nrf24] --my-rf24-channel=<0-125> RF channel for the sensor net, 0-125. [76] --my-rf24-pa-level=[RF24_PA_MAX|RF24_PA_LOW] RF24 PA level. [RF24_PA_MAX] --my-rf24-irq-pin= Pin number connected to nRF24L01 IRQ pin. --my-rx-message-buffer-size= Buffer size for incoming messages when using rf24 interrupts. [20] --my-rs485-serial-port= RS485 serial port. You must provide a port. --my-rs485-baudrate= RS485 baudrate. [9600] --my-rs485-de-pin= Pin number connected to RS485 driver enable pin. --my-rs485-max-msg-length= The maximum message length used for RS485. --my-leds-err-pin= Error LED pin. --my-leds-rx-pin= Receive LED pin. --my-leds-tx-pin= Transmit LED pin. --my-leds-blinking-inverse Inverse the blinking feature. EOF } function die { echo "[ERROR] $1" exit $2 } function detect_rpi_revision { # get PI Revision from cpuinfo local pirev=$(eval "cat /proc/cpuinfo 2>/dev/null | grep Revision | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$$//'") echo ${pirev} } function detect_machine { local cpu=$(eval "uname -m 2>/dev/null") local machine=$(eval "cat /sys/firmware/devicetree/base/model 2>/dev/null") local hardware=$(eval "grep sunxi_platform /sys/class/sunxi_info/sys_info 2>/dev/null | sed 's/^.*: \(.*\)$/\1/'") if [ -z "$hardware" ]; then local hardware=$(eval "grep Hardware /proc/cpuinfo 2>/dev/null | sed 's/^.*: \(.*\)$/\1/'") fi local soc="unknown" local tp="unknown" local rev="unknown" if [ -z "$cpu" ]; then cpu="unknown" fi case $hardware in BCM2708) soc="BCM2835" if [[ $machine == "Raspberry"* ]]; then tp="RPi" rev=($(detect_rpi_revision)) fi ;; BCM2709) soc="BCM2836" if [[ $machine == "Raspberry"* ]]; then rev=($(detect_rpi_revision)) if [[ $rev == "a02082" || $rev == "a22082" ]]; then tp="RPi3" else tp="Rpi2" fi fi ;; sun4i|Sun4iw1p1) soc="A10" ;; sun5i|Sun4iw2p1) soc="A13" ;; Sun4iw2p2) soc="A12" ;; Sun4iw2p3) soc="A10s" ;; sun6i|Sun8iw1p1) soc="A31" ;; Sun8iw1p2) soc="A31s" ;; sun7i|Sun8iw2p1) soc="A20" if [[ $machine == "Banana Pi"* ]]; then tp="BananaPi" elif [[ $machine == "Banana Pro"* ]]; then tp="BananaPro" fi ;; sun8i|Sun8iw7p1) soc="H3" ;; Sun8iw3p1) soc="A23" ;; Sun8iw5p1) soc="A33" ;; Sun8iw6p1) soc="A83t" ;; sun9i|Sun9iw1p1) soc="A80" ;; Sun9iw1p2) soc="A80t" ;; sun50i|Sun50iw1p1) soc="A64" ;; 'Generic AM33XX'*) soc="AM33XX" ;; *) soc="unknown" esac echo "${soc} ${tp} ${cpu} ${rev}" } function gcc_cpu_flags { local soc=$1 case $soc in BCM2835) flags="-march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -DLINUX_ARCH_RASPBERRYPI" ;; BCM2836) flags="-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -DLINUX_ARCH_RASPBERRYPI" ;; AM33XX) flags="-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard" ;; A10) flags="-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard" ;; A13) flags="-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard" ;; A20) flags="-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard" ;; H3) flags="-march=armv8-a -mtune=cortex-a53 -mfpu=neon-vfpv4 -mfloat-abi=hard" ;; *) flags="" esac echo ${flags} } # Default values debug=enable gateway_type=ethernet transport_type=nrf24 params="SOC CXXFLAGS LDFLAGS PREFIX CXX GATEWAY_DIR INIT_SYSTEM" for opt do if [ "$opt" = "-h" ] || [ "$opt" = "--help" ]; then help exit 0 fi optarg="${opt#*=}" case "$opt" in --soc=*) SOC="$optarg" ;; --cpu-flags=*) CPUFLAGS="$optarg" ;; --extra-cxxflags=*) CXXFLAGS="$optarg" ;; --extra-ldflags=*) LDFLAGS="$optarg" ;; --cxx_compiler=*) CXX="$optarg" ;; --no-clean*) NO_CLEAN="1" ;; --prefix=*) PREFIX="$optarg" ;; --gateway-dir=*) GATEWAY_DIR="$optarg" ;; --my-debug=*) debug=${optarg} ;; --my-gateway=*) gateway_type=${optarg} ;; --my-node-id=*) gateway_type="none"; CXXFLAGS="-DMY_NODE_ID=${optarg} $CXXFLAGS" ;; --my-config-file=*) CXXFLAGS="-DMY_LINUX_CONFIG_FILE=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-transport=*) transport_type=${optarg} ;; --my-radio=*) echo "Warning: --my-radio is deprecated, please use --my-transport" transport_type=${optarg} ;; --my-serial-port=*) CXXFLAGS="-DMY_LINUX_SERIAL_PORT=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-serial-baudrate=*) CXXFLAGS="-DMY_BAUD_RATE=${optarg} $CXXFLAGS" ;; --my-serial-is-pty*) CXXFLAGS="-DMY_IS_SERIAL_PTY $CXXFLAGS" ;; --my-serial-pty=*) CXXFLAGS="-DMY_LINUX_SERIAL_PTY=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-serial-groupname=*) CXXFLAGS="-DMY_LINUX_SERIAL_GROUPNAME=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-rf24-channel=*) CXXFLAGS="-DMY_RF24_CHANNEL=${optarg} $CXXFLAGS" ;; --my-rf24-pa-level=*) CXXFLAGS="-DMY_RF24_PA_LEVEL=${optarg} $CXXFLAGS" ;; --my-controller-url-address=*) CXXFLAGS="-DMY_CONTROLLER_URL_ADDRESS=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-controller-ip-address=*) controller_ip=`echo ${optarg//./,}` CXXFLAGS="-DMY_CONTROLLER_IP_ADDRESS=${controller_ip} $CXXFLAGS" ;; --my-port=*) CXXFLAGS="-DMY_PORT=${optarg} $CXXFLAGS" ;; --my-mqtt-client-id=*) CXXFLAGS="-DMY_MQTT_CLIENT_ID=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-mqtt-publish-topic-prefix=*) CXXFLAGS="-DMY_MQTT_PUBLISH_TOPIC_PREFIX=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-mqtt-subscribe-topic-prefix=*) CXXFLAGS="-DMY_MQTT_SUBSCRIBE_TOPIC_PREFIX=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-rf24-irq-pin=*) CXXFLAGS="-DMY_RX_MESSAGE_BUFFER_FEATURE -DMY_RF24_IRQ_PIN=${optarg} $CXXFLAGS" ;; --my-rx-message-buffer-size=*) CXXFLAGS="-DMY_RX_MESSAGE_BUFFER_SIZE=${optarg} $CXXFLAGS" ;; --my-rs485-serial-port=*) CXXFLAGS="-DMY_RS485_HWSERIAL=\\\"${optarg}\\\" $CXXFLAGS" ;; --my-rs485-baudrate=*) CXXFLAGS="-DMY_RS485_BAUD_RATE=${optarg} $CXXFLAGS" ;; --my-rs485-de-pin=*) CXXFLAGS="-DMY_RS485_DE_PIN=${optarg} $CXXFLAGS" ;; --my-rs485-max-msg-length=*) CXXFLAGS="-DMY_RS485_MAX_MESSAGE_LENGTH=${optarg} $CXXFLAGS" ;; --my-leds-err-pin=*) CXXFLAGS="-DMY_DEFAULT_ERR_LED_PIN=${optarg} $CXXFLAGS" ;; --my-leds-rx-pin=*) CXXFLAGS="-DMY_DEFAULT_RX_LED_PIN=${optarg} $CXXFLAGS" ;; --my-leds-tx-pin=*) CXXFLAGS="-DMY_DEFAULT_TX_LED_PIN=${optarg} $CXXFLAGS" ;; --my-leds-blinking-inverse*) CXXFLAGS="-DMY_WITH_LEDS_BLINKING_INVERSE $CXXFLAGS" ;; *) echo "[WARNING] Unknown option detected:$opt, ignored" ;; esac done PREFIX=${PREFIX:-/usr/local} GATEWAY_DIR=${GATEWAY_DIR:-${PREFIX}/bin} CXX=${CXX:-g++} if [ -z "${SOC}" ]; then echo "[SECTION] Detecting target machine." info=($(detect_machine)) SOC=${info[0]} TYPE=${info[1]} CPU=${info[2]} REV=${info[3]} echo "[OK] machine detected: SoC=${SOC}, Type=${TYPE}, CPU=${CPU}, REV=${REV}." fi if [ -z "${CPUFLAGS}" ]; then CPUFLAGS=$(gcc_cpu_flags $SOC) fi CXXFLAGS="$CPUFLAGS -Ofast -g -Wall -Wextra $CXXFLAGS" CFLAGS="-Ofast -g -Wall -Wextra $CFLAGS" if [[ $TYPE == "RPi2" || $TYPE == "RPi3" || $REV == "0010" ]]; then CXXFLAGS+="-D__RPI_BPLUS" fi if [[ ${debug} == "enable" ]]; then CXXFLAGS="-DMY_DEBUG $CXXFLAGS" fi if [[ ${gateway_type} == "ethernet" ]]; then CXXFLAGS="-DMY_GATEWAY_LINUX $CXXFLAGS" elif [[ ${gateway_type} == "serial" ]]; then CXXFLAGS="-DMY_GATEWAY_SERIAL $CXXFLAGS" elif [[ ${gateway_type} == "mqtt" ]]; then CXXFLAGS="-DMY_GATEWAY_LINUX -DMY_GATEWAY_MQTT_CLIENT $CXXFLAGS" fi if [[ ${transport_type} == "nrf24" ]]; then CXXFLAGS="-DMY_RADIO_NRF24 $CXXFLAGS" elif [[ ${transport_type} == "rs485" ]]; then CXXFLAGS="-DMY_RS485 $CXXFLAGS" fi LDFLAGS="-pthread $LDFLAGS" if [ -x /usr/bin/systemctl ] || [ -x /bin/systemctl ]; then INIT_SYSTEM=systemd echo "[OK] init system detected: systemd" elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then INIT_SYSTEM=sysvinit echo "[OK] init system detected: sysvinit" else echo "[FAILED] unknown init system" fi echo "[SECTION] Saving configuration." echo -n "" > Makefile.inc for param in ${params}; do if [[ ${!param} ]]; then echo "${param}=${!param}" >> Makefile.inc fi done if [ -z "${NO_CLEAN}" ]; then echo "[SECTION] Cleaning previous builds." make clean >/dev/null fi echo "[OK] Finished."