* Signing support with MAX_PAYLOAD>32 Support in the signing backends to handle configurations where MAX_PAYLOAD is more than 32 bytes. Fixes #748 * Support big message signatures Support for signing messages larger than 32 bytes. This is not fully testable with the current version of the library but the change would add theoretical support for signing any sized messages. Fixes #749 * Have gw properly indicate whitelisting preferences If the gateway hold a signing whitelist, inform all nodes of this requirement and not just nodes that hold whitelists themselves. Fixes #806 * Harden security The flag MY_SIGNING_GW_REQUEST_SIGNATURES_FROM_ALL has been removed. Gateway will now request signatures from everyone by default. In addition to this, no nodes in the network will allow clearing of signing/whitelisting preferences by OTA commands by default. If the old behaviour is needed (suitable for gradual signing roll out and development purposes) a new flag, MY_SIGNING_WEAK_SECURITY can be set. Fixes #807 * Signing debug messages rewritten All signing related debug has been rewritten to better match other core debug printouts. Also, backends are updated to have a smaller implementation delta. * Simplified signing option implemented Enable by MY_SIGNING_SIMPLE_PASSWD. Signing, and signing requirements will be enabled, as will encryption. Whitelisting is optional. The value provided to MY_SIGNING_SIMPLE_PASSWD is used as HMAC and AES key. Whitelists use the first 8 bytes of the password and the ninth byte from the node ID as serial. Password is required to be at least 8 characters wide. It is zero padded if it is not long enough to cover the AES (16 bytes) and HMAC (32 bytes) keys. It is not recommended to have a password shorter than 32 bytes, and there is no need for a password longer than 32 bytes. * Add documentation section for signing debug * Add nRF5 encryption to simple signing option * Restructure MySigning documentation * Minor fixes for Linux
618 lines
20 KiB
Bash
Executable File
618 lines
20 KiB
Bash
Executable File
#!/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 <<EOF
|
|
configure script for MySensors gateway.
|
|
Options:
|
|
|
|
Help:
|
|
-h, --help print this message
|
|
|
|
SPI driver options:
|
|
--spi-driver=[BCM|SPIDEV]
|
|
--spi-spidev-device=<DEVICE>
|
|
Device path. [/dev/spidev0.0]
|
|
|
|
Building options:
|
|
--soc=[BCM2835|BCM2836|BCM2837|AM33XX|A10|A13|A20|H3]
|
|
SoC type to be used. [configure autodetected]
|
|
--cpu-flags=<CPUFLAGS> CPU defining/optimizing flags to be used. [configure autodetected]
|
|
--extra-cflags=<CFLAGS> Extra C flags passed to C compilation. []
|
|
--extra-cxxflags=<CXXFLAGS> Extra C++ flags passed to C++ compilation. []
|
|
--extra-ldflags=<LDFLAGS> Extra C flags passed to linking. []
|
|
--c_compiler=<CC> C compiler. [arm-linux-gnueabihf-gcc][gcc]
|
|
--cxx_compiler=<CXX> C++ compiler. [arm-linux-gnueabihf-g++][g++]
|
|
--build-dir=<DIR> Compiler directory to store object files. [build]
|
|
--bin-dir=<DIR> Compiler directory to store binary files. [bin]
|
|
--arduino-lib-dir=<DIR> Arduino library directory.
|
|
--no-clean Don't clean previous build artifacts.
|
|
|
|
Installation options:
|
|
--prefix=<PREFIX> Installation prefix path. [/usr/local]
|
|
--gateway-dir=<DIR> Gateway files installation directory. [PREFIX/bin]
|
|
|
|
MySensors options:
|
|
--my-debug=[enable|disable] Enables or disables MySensors core debugging. [enable]
|
|
--my-config-file=<FILE> Config file path. [/etc/mysensors.dat]
|
|
--my-gateway=[none|ethernet|serial|mqtt]
|
|
Set the protocol used to communicate with the controller.
|
|
[ethernet]
|
|
--my-node-id=<ID> Disable gateway feature and run as a node with the specified id.
|
|
--my-controller-url-address=<URL>
|
|
Controller or MQTT broker url.
|
|
--my-controller-ip-address=<IP>
|
|
Controller or MQTT broker ip.
|
|
--my-port=<PORT> The port to keep open on gateway mode.
|
|
If gateway is set to mqtt, it sets the broker port.
|
|
--my-serial-port=<PORT> Serial port. [/dev/ttyACM0]
|
|
--my-serial-baudrate=<BAUD> 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=<NAME> Symlink name for the PTY device. [/dev/ttyMySensorsGateway]
|
|
--my-serial-groupname=<GROUP>
|
|
Grant access to the specified system group for the serial device.
|
|
--my-mqtt-client-id=<ID> MQTT client id.
|
|
--my-mqtt-user=<UID> MQTT user id.
|
|
--my-mqtt-password=<PASS> MQTT password.
|
|
--my-mqtt-publish-topic-prefix=<PREFIX>
|
|
MQTT publish topic prefix.
|
|
--my-mqtt-subscribe-topic-prefix=<PREFIX>
|
|
MQTT subscribe topic prefix.
|
|
--my-transport=[none|nrf24|rs485|rfm95|rfm69]
|
|
Set the transport to be used to communicate with other nodes.
|
|
[nrf24]
|
|
--my-rf24-channel=<0-125> RF channel for the sensor net. [76]
|
|
--my-rf24-pa-level=[RF24_PA_MAX|RF24_PA_LOW]
|
|
RF24 PA level. [RF24_PA_MAX]
|
|
--my-rf24-ce-pin=<PIN> Pin number to use for rf24 Chip-Enable.
|
|
--my-rf24-cs-pin=<PIN> Pin number to use for rf24 Chip-Select.
|
|
--my-rf24-irq-pin=<PIN> Pin number connected to nRF24L01 IRQ pin.
|
|
--my-rf24-encryption-enabled
|
|
Enables RF24 encryption.
|
|
All nodes and gateway must have this enabled, and all must be
|
|
personalized with the same AES key
|
|
--my-rx-message-buffer-size=<SIZE>
|
|
Buffer size for incoming messages when using rf24 interrupts. [20]
|
|
--my-rfm69-frequency=[315|433|868|915]
|
|
RFM69 Module Frequency. [868]
|
|
--my-is-rfm69hw Enable high-powered rfm69hw.
|
|
--my-rfm69-irq-pin=<PIN> Pin number connected to RFM69 IRQ pin.
|
|
--my-rfm69-cs-pin=<PIN> Pin number to use for RFM69 Chip-Select.
|
|
--my-rs485-serial-port=<PORT>
|
|
RS485 serial port. You must provide a port.
|
|
--my-rs485-baudrate=<BAUD> RS485 baudrate. [9600]
|
|
--my-rs485-de-pin=<PIN> Pin number connected to RS485 driver enable pin.
|
|
--my-rs485-max-msg-length=<LENGTH>
|
|
The maximum message length used for RS485. [40]
|
|
--my-leds-err-pin=<PIN> Error LED pin.
|
|
--my-leds-rx-pin=<PIN> Receive LED pin.
|
|
--my-leds-tx-pin=<PIN> Transmit LED pin.
|
|
--my-leds-blinking-inverse Inverse the blinking feature.
|
|
--my-signing=[none|software|password]
|
|
Message signing. [none]
|
|
--my-signing-debug Enable signing related debug.
|
|
--my-signing-request-signatures
|
|
Enable signature request from nodes that in turn requested
|
|
gateway signature.
|
|
--my-signing-weak_security Enable this to permit downgrade of security preferences and
|
|
relaxed gateway signing requirements.
|
|
--my-signing-password=<PASSWORD>
|
|
If you are using password as the signature type, set your password here.
|
|
|
|
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 |tr -d '\0'")
|
|
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"
|
|
|
|
if [ -z "$cpu" ]; then
|
|
cpu="unknown"
|
|
fi
|
|
|
|
case $hardware in
|
|
BCM*)
|
|
if [[ $machine == "Raspberry"* ]]; then
|
|
# Calculation done by joolswills(https://github.com/joolswills) for the RetroPie-Setup project
|
|
# and based on information from https://github.com/AndrewFromMelbourne/raspberry_pi_revision
|
|
local 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
|
|
soc="BCM2835"
|
|
tp="rpi1"
|
|
else
|
|
# if bit 23 is set, get the cpu from bits 12-15
|
|
case "$((($rev >> 12) & 15))" in
|
|
0)
|
|
soc="BCM2835"
|
|
tp="rpi1"
|
|
;;
|
|
1)
|
|
soc="BCM2836"
|
|
tp="rpi2"
|
|
;;
|
|
2)
|
|
soc="BCM2837"
|
|
tp="rpi3"
|
|
;;
|
|
esac
|
|
fi
|
|
elif [[ $hardware == "BCM2708"* ]]; then
|
|
soc="BCM2835"
|
|
elif [[ $hardware == "BCM2709"* ]]; then
|
|
soc="BCM2836"
|
|
elif [[ $hardware == "BCM2710"* ]]; then
|
|
soc="BCM2837"
|
|
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}"
|
|
}
|
|
|
|
function gcc_cpu_flags {
|
|
local soc=$1
|
|
case $soc in
|
|
BCM2835)
|
|
flags="-march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard"
|
|
;;
|
|
BCM2836)
|
|
flags="-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard"
|
|
;;
|
|
BCM2837)
|
|
flags="-march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard"
|
|
;;
|
|
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=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard"
|
|
;;
|
|
*)
|
|
flags=""
|
|
esac
|
|
echo ${flags}
|
|
}
|
|
|
|
# Default values
|
|
debug=enable
|
|
gateway_type=ethernet
|
|
transport_type=nrf24
|
|
signing=none
|
|
signing_request_signatures=false
|
|
|
|
params="SOC CFLAGS CXXFLAGS CPPFLAGS LDFLAGS PREFIX CC CXX ARDUINO_LIB_DIR BUILDDIR BINDIR GATEWAY_DIR INIT_SYSTEM SPI_DRIVER"
|
|
|
|
for opt do
|
|
if [ "$opt" = "-h" ] || [ "$opt" = "--help" ]; then
|
|
help
|
|
exit 0
|
|
fi
|
|
optarg="${opt#*=}"
|
|
case "$opt" in
|
|
--spi-driver=*)
|
|
SPI_DRIVER="$optarg"
|
|
;;
|
|
--spi-spidev-device=*)
|
|
CPPFLAGS="-DSPI_SPIDEV_DEVICE=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--soc=*)
|
|
SOC="$optarg"
|
|
;;
|
|
--platform-type=*)
|
|
PT="$optarg"
|
|
;;
|
|
--cpu-flags=*)
|
|
CPUFLAGS="$optarg"
|
|
;;
|
|
--extra-cflags=*)
|
|
CFLAGS="$optarg"
|
|
;;
|
|
--extra-cxxflags=*)
|
|
CXXFLAGS="$optarg"
|
|
;;
|
|
--extra-ldflags=*)
|
|
LDFLAGS="$optarg"
|
|
;;
|
|
--c_compiler=*)
|
|
CC="$optarg"
|
|
;;
|
|
--cxx_compiler=*)
|
|
CXX="$optarg"
|
|
;;
|
|
--arduino-lib-dir=*)
|
|
ARDUINO_LIB_DIR=$optarg
|
|
;;
|
|
--build-dir=*)
|
|
BUILDDIR="$optarg"
|
|
;;
|
|
--bin-dir=*)
|
|
BINDIR="$optarg"
|
|
;;
|
|
--no-clean*)
|
|
NO_CLEAN="1"
|
|
;;
|
|
--prefix=*)
|
|
PREFIX="$optarg"
|
|
;;
|
|
--exec-prefix=*)
|
|
PREFIX="$optarg"
|
|
;;
|
|
--no_init_system*)
|
|
NO_INIT="1"
|
|
;;
|
|
--gateway-dir=*)
|
|
GATEWAY_DIR="$optarg"
|
|
;;
|
|
--my-debug=*)
|
|
debug=${optarg}
|
|
;;
|
|
--my-gateway=*)
|
|
gateway_type=${optarg}
|
|
;;
|
|
--my-node-id=*)
|
|
gateway_type="none";
|
|
CPPFLAGS="-DMY_NODE_ID=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-config-file=*)
|
|
CPPFLAGS="-DMY_LINUX_CONFIG_FILE=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-transport=*)
|
|
transport_type=${optarg}
|
|
;;
|
|
--my-radio=*)
|
|
echo "Warning: --my-radio is deprecated, please use --my-transport"
|
|
transport_type=${optarg}
|
|
;;
|
|
--my-serial-port=*)
|
|
CPPFLAGS="-DMY_LINUX_SERIAL_PORT=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-serial-baudrate=*)
|
|
CPPFLAGS="-DMY_BAUD_RATE=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-serial-is-pty*)
|
|
CPPFLAGS="-DMY_LINUX_IS_SERIAL_PTY $CPPFLAGS"
|
|
;;
|
|
--my-serial-pty=*)
|
|
CPPFLAGS="-DMY_LINUX_SERIAL_PTY=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-serial-groupname=*)
|
|
CPPFLAGS="-DMY_LINUX_SERIAL_GROUPNAME=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-rf24-channel=*)
|
|
CPPFLAGS="-DMY_RF24_CHANNEL=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rf24-pa-level=*)
|
|
CPPFLAGS="-DMY_RF24_PA_LEVEL=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rf24-ce-pin=*)
|
|
CPPFLAGS="-DMY_RF24_CE_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rf24-cs-pin=*)
|
|
CPPFLAGS="-DMY_RF24_CS_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-controller-url-address=*)
|
|
CPPFLAGS="-DMY_CONTROLLER_URL_ADDRESS=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-controller-ip-address=*)
|
|
controller_ip=`echo ${optarg//./,}`
|
|
CPPFLAGS="-DMY_CONTROLLER_IP_ADDRESS=${controller_ip} $CPPFLAGS"
|
|
;;
|
|
--my-port=*)
|
|
CPPFLAGS="-DMY_PORT=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-mqtt-client-id=*)
|
|
CPPFLAGS="-DMY_MQTT_CLIENT_ID=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-mqtt-user=*)
|
|
CPPFLAGS="-DMY_MQTT_USER=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-mqtt-password=*)
|
|
CPPFLAGS="-DMY_MQTT_PASSWORD=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-mqtt-publish-topic-prefix=*)
|
|
CPPFLAGS="-DMY_MQTT_PUBLISH_TOPIC_PREFIX=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-mqtt-subscribe-topic-prefix=*)
|
|
CPPFLAGS="-DMY_MQTT_SUBSCRIBE_TOPIC_PREFIX=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-rf24-irq-pin=*)
|
|
CPPFLAGS="-DMY_RX_MESSAGE_BUFFER_FEATURE -DMY_RF24_IRQ_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rf24-encryption-enabled*)
|
|
CPPFLAGS="-DMY_RF24_ENABLE_ENCRYPTION $CPPFLAGS"
|
|
;;
|
|
--my-rx-message-buffer-size=*)
|
|
CPPFLAGS="-DMY_RX_MESSAGE_BUFFER_SIZE=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rfm69-frequency=*)
|
|
if [[ ${optarg} == "315" ]]; then
|
|
CPPFLAGS="-DMY_RFM69_FREQUENCY=RFM69_315MHZ $CPPFLAGS"
|
|
elif [[ ${optarg} == "433" ]]; then
|
|
CPPFLAGS="-DMY_RFM69_FREQUENCY=RFM69_433MHZ $CPPFLAGS"
|
|
elif [[ ${optarg} == "868" ]]; then
|
|
CPPFLAGS="-DMY_RFM69_FREQUENCY=RFM69_868MHZ $CPPFLAGS"
|
|
elif [[ ${optarg} == "915" ]]; then
|
|
CPPFLAGS="-DMY_RFM69_FREQUENCY=RFM69_915MHZ $CPPFLAGS"
|
|
else
|
|
echo "[WARNING] Illegal value for --my-rfm69-frequency=${optarg}, ignored"
|
|
fi
|
|
;;
|
|
--my-is-rfm69hw*)
|
|
CPPFLAGS="-DMY_IS_RFM69HW $CPPFLAGS"
|
|
;;
|
|
--my-rfm69-irq-pin=*)
|
|
CPPFLAGS="-DMY_RFM69_IRQ_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rfm69-cs-pin=*)
|
|
CPPFLAGS="-DMY_RFM69_CS_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rs485-serial-port=*)
|
|
CPPFLAGS="-DMY_RS485_HWSERIAL=\\\"${optarg}\\\" $CPPFLAGS"
|
|
;;
|
|
--my-rs485-baudrate=*)
|
|
CPPFLAGS="-DMY_RS485_BAUD_RATE=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rs485-de-pin=*)
|
|
CPPFLAGS="-DMY_RS485_DE_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-rs485-max-msg-length=*)
|
|
CPPFLAGS="-DMY_RS485_MAX_MESSAGE_LENGTH=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-leds-err-pin=*)
|
|
CPPFLAGS="-DMY_DEFAULT_ERR_LED_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-leds-rx-pin=*)
|
|
CPPFLAGS="-DMY_DEFAULT_RX_LED_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-leds-tx-pin=*)
|
|
CPPFLAGS="-DMY_DEFAULT_TX_LED_PIN=${optarg} $CPPFLAGS"
|
|
;;
|
|
--my-leds-blinking-inverse*)
|
|
CPPFLAGS="-DMY_WITH_LEDS_BLINKING_INVERSE $CPPFLAGS"
|
|
;;
|
|
--my-signing=*)
|
|
signing=${optarg}
|
|
;;
|
|
--my-signing-debug*)
|
|
CPPFLAGS="-DMY_DEBUG_VERBOSE_SIGNING $CPPFLAGS"
|
|
;;
|
|
--my-signing-request-signatures*)
|
|
signing_request_signatures=true
|
|
;;
|
|
--my-signing-weak_security*)
|
|
CPPFLAGS="-DMY_SIGNING_WEAK_SECURITY $CPPFLAGS"
|
|
;;
|
|
--my-signing-password=*)
|
|
signing_password=${optarg}
|
|
;;
|
|
*)
|
|
echo "[WARNING] Unknown option detected:$opt, ignored"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
PREFIX=${PREFIX:-/usr/local}
|
|
BUILDDIR=${BUILDDIR:-build}
|
|
BINDIR=${BINDIR:-bin}
|
|
GATEWAY_DIR=${GATEWAY_DIR:-${PREFIX}/bin}
|
|
CC=${CC:-gcc}
|
|
CXX=${CXX:-g++}
|
|
|
|
if [ -z "${SOC}" ]; then
|
|
echo "[SECTION] Detecting target machine."
|
|
info=($(detect_machine))
|
|
SOC=${info[0]}
|
|
TYPE=${info[1]}
|
|
CPU=${info[2]}
|
|
echo " [OK] machine detected: SoC=${SOC}, Type=${TYPE}, CPU=${CPU}."
|
|
fi
|
|
|
|
if [ -z "${CPUFLAGS}" ]; then
|
|
CPUFLAGS=$(gcc_cpu_flags $SOC)
|
|
fi
|
|
|
|
if [[ $SOC == "BCM2835" || $SOC == "BCM2836" || $SOC == "BCM2837" ]]; then
|
|
CPPFLAGS="-DLINUX_ARCH_RASPBERRYPI -DRPI_TYPE=\\\"$TYPE\\\" $CPPFLAGS"
|
|
else
|
|
echo "[SECTION] Checking GPIO Sysfs."
|
|
if [[ $(eval 'ls /sys/class/gpio/export 2>/dev/null') ]]; then
|
|
echo " [OK] /sys/class/gpio/export found"
|
|
else
|
|
echo " [WARNING] /sys/class/gpio/export not found."
|
|
fi
|
|
fi
|
|
|
|
if [ -z "${SPI_DRIVER}" ]; then
|
|
echo "[SECTION] Detecting SPI driver."
|
|
if [[ $SOC == "BCM2835" || $SOC == "BCM2836" || $SOC == "BCM2837" ]]; then
|
|
SPI_DRIVER=BCM
|
|
elif [[ $(eval 'ls /dev/spidev* 2>/dev/null') ]]; then
|
|
SPI_DRIVER=SPIDEV
|
|
fi
|
|
if [ -n "${SPI_DRIVER}" ]; then
|
|
echo " [OK] SPI driver detected:${SPI_DRIVER}."
|
|
else
|
|
echo " [WARNING] No supported SPI driver detected. Using SPIDEV."
|
|
SPI_DRIVER=SPIDEV
|
|
fi
|
|
fi
|
|
if [ -n "${SPI_DRIVER}" ]; then
|
|
case ${SPI_DRIVER} in
|
|
BCM)
|
|
if [[ $SOC != "BCM2835" && $SOC != "BCM2836" && $SOC != "BCM2837" ]]; then
|
|
die "BCM SPI driver is only supported for SOCs BCM2835, BCM2836 or BCM2837" 5
|
|
fi
|
|
CPPFLAGS="-DLINUX_SPI_BCM $CPPFLAGS"
|
|
;;
|
|
SPIDEV)
|
|
CPPFLAGS="-DLINUX_SPI_SPIDEV $CPPFLAGS"
|
|
;;
|
|
*)
|
|
die "Unsupported SPI driver: ${SPI_DRIVER}." 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if [[ ${debug} == "enable" ]]; then
|
|
CPPFLAGS="-DMY_DEBUG $CPPFLAGS"
|
|
fi
|
|
|
|
if [[ ${gateway_type} == "none" ]]; then
|
|
# Node mode selected
|
|
:
|
|
elif [[ ${gateway_type} == "ethernet" ]]; then
|
|
CPPFLAGS="-DMY_GATEWAY_LINUX $CPPFLAGS"
|
|
elif [[ ${gateway_type} == "serial" ]]; then
|
|
CPPFLAGS="-DMY_GATEWAY_SERIAL $CPPFLAGS"
|
|
elif [[ ${gateway_type} == "mqtt" ]]; then
|
|
CPPFLAGS="-DMY_GATEWAY_LINUX -DMY_GATEWAY_MQTT_CLIENT $CPPFLAGS"
|
|
else
|
|
die "Invalid gateway type." 2
|
|
fi
|
|
|
|
if [[ ${transport_type} == "none" ]]; then
|
|
# Transport disabled
|
|
:
|
|
elif [[ ${transport_type} == "nrf24" ]]; then
|
|
CPPFLAGS="-DMY_RADIO_NRF24 $CPPFLAGS"
|
|
elif [[ ${transport_type} == "rfm69" ]]; then
|
|
CPPFLAGS="-DMY_RADIO_RFM69 -DMY_RFM69_NEW_DRIVER $CPPFLAGS"
|
|
elif [[ ${transport_type} == "rs485" ]]; then
|
|
CPPFLAGS="-DMY_RS485 $CPPFLAGS"
|
|
elif [[ ${transport_type} == "rfm95" ]]; then
|
|
CPPFLAGS="-DMY_RADIO_RFM95 $CPPFLAGS"
|
|
else
|
|
die "Invalid transport type." 3
|
|
fi
|
|
|
|
if [[ ${signing} == "none" ]]; then
|
|
# Signing disabled
|
|
:
|
|
elif [[ ${signing} == "software" ]]; then
|
|
CPPFLAGS="-DMY_SIGNING_SOFT $CPPFLAGS"
|
|
if [[ ${signing_request_signatures} == true ]]; then
|
|
CPPFLAGS="-DMY_SIGNING_REQUEST_SIGNATURES $CPPFLAGS"
|
|
fi
|
|
elif [[ ${signing} == "password" ]]; then
|
|
if [ -z "${signing_password}" ]; then
|
|
die "You need to set the password for signing with --my-signing-password= option" 6
|
|
fi
|
|
echo "Simplified signing using password"
|
|
CPPFLAGS="-DMY_SIGNING_SIMPLE_PASSWD=\\\"${signing_password}\\\" $CPPFLAGS"
|
|
else
|
|
die "Invalid signing type." 7
|
|
fi
|
|
|
|
LDFLAGS="-pthread $LDFLAGS"
|
|
CPPFLAGS="$CPUFLAGS $CPPFLAGS"
|
|
|
|
echo "[SECTION] Detecting init system."
|
|
if [ "${NO_INIT}" ]; then
|
|
echo " [OK] no init system chosen."
|
|
elif [ -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."
|