You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
351 lines
8.1 KiB
351 lines
8.1 KiB
5 years ago
|
#!/bin/sh
|
||
|
|
||
|
####
|
||
|
# Copyright (C) 2019 AlephObjects, Inc.
|
||
|
#
|
||
|
#
|
||
|
# The bash script in this page is free software: you can
|
||
|
# redistribute it and/or modify it under the terms of the GNU Affero
|
||
|
# General Public License (GNU AGPL) as published by the Free Software
|
||
|
# Foundation, either version 3 of the License, or (at your option)
|
||
|
# any later version. The code is distributed WITHOUT ANY WARRANTY;
|
||
|
# without even the implied warranty of MERCHANTABILITY or FITNESS
|
||
|
# FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details.
|
||
|
#
|
||
|
|
||
|
####
|
||
|
# usage
|
||
|
#
|
||
|
# Prints out a usage summary
|
||
|
#
|
||
|
usage() {
|
||
|
echo
|
||
|
echo "Usage: $0 [-s|--short-names] [-h|--hash] [-c|--config] [printer toolhead|config_file]"
|
||
|
echo
|
||
|
echo " -s|--short-names Omits LulzBot code names from generated firmware files"
|
||
|
echo
|
||
|
echo " -h|--hash Records md5sum of the firmware files. These files will be generated:"
|
||
|
echo " md5sums-full* Sum w/ embedded version str and timestamp"
|
||
|
echo " md5sums-bare* Sum w/o embedded version str and timestamp"
|
||
|
echo
|
||
|
echo " -c|--config Save the values of 'Configuration.h' and 'Configuration_adv.h'"
|
||
|
echo " that are used for the specified printer and toolhead."
|
||
|
echo " -n|--dry-run Just print commands, don't execute"
|
||
|
echo
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# compile_deps_for_board <board>
|
||
|
#
|
||
|
# Compiles dependencies for the specific board
|
||
|
#
|
||
|
compile_deps_for_board() {
|
||
|
board=$1 ; shift 1
|
||
|
|
||
|
# Only compile dependency once
|
||
|
|
||
|
case "$deps_built" in
|
||
|
*$board*) return ;;
|
||
|
esac
|
||
|
|
||
|
deps_built="$deps_built $board"
|
||
|
|
||
|
# Compile dependency
|
||
|
|
||
|
echo
|
||
|
echo Building dependencies for $board
|
||
|
echo
|
||
|
|
||
|
case $board in
|
||
|
BOARD_ARCHIM2)
|
||
|
SRC="ArduinoAddons/arduino-1.8.5/packages/ultimachine/hardware/sam/1.6.9-b"
|
||
|
(cd "$SRC/system/libsam/build_gcc"; ARM_GCC_TOOLCHAIN="$TOOLS_PATH" make)
|
||
|
cp -u $SRC/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a $SRC/variants/archim/libsam_sam3x8e_gcc_rel.a
|
||
|
cp -u $SRC/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt $SRC/variants/archim/libsam_sam3x8e_gcc_rel.a.txt
|
||
|
;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# locate_gcc_for_board <board>
|
||
|
#
|
||
|
# Locates compilation tools for the specific board
|
||
|
#
|
||
|
locate_gcc_for_board() {
|
||
|
board=$1 ; shift 1
|
||
|
|
||
|
case $board in
|
||
|
BOARD_ARCHIM2)
|
||
|
locate_tools TOOLS_PATH arm-none-eabi
|
||
|
check_tools $TOOLS_PATH arm-none-eabi
|
||
|
;;
|
||
|
*)
|
||
|
locate_tools TOOLS_PATH avr
|
||
|
check_tools $TOOLS_PATH avr
|
||
|
;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# get_config_info <config_dir>
|
||
|
#
|
||
|
# Generates a filename for the hex file in accordance to Lulzbot standards.
|
||
|
# Extracts version and motherboard information from the configuration files.
|
||
|
#
|
||
|
get_config_info() {
|
||
|
config=$1; shift 1
|
||
|
|
||
|
parent=`dirname $config`
|
||
|
printer=`basename $parent`
|
||
|
toolhead=`basename $config`
|
||
|
fw_hash=`git rev-parse --verify HEAD --short`
|
||
|
fw_version=`./version.sh`
|
||
|
fw_filename=Marlin_${printer}_${toolhead}_${fw_version}_${fw_hash}
|
||
|
motherboard_name=`grep "define MOTHERBOARD" $config/Configuration.h | awk '{print $3}'`
|
||
|
motherboard_number=`grep "$motherboard_name\b" Marlin/src/core/boards.h | awk '{print $3}'`
|
||
|
is_lulzbot=`grep "define LULZBOT_" $config/Configuration.h`
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# compile_firmware [makeopts]
|
||
|
#
|
||
|
# Compiles firmware for the specified printer and toolhead
|
||
|
#
|
||
|
compile_firmware() {
|
||
|
(cd Marlin; make clean; make \
|
||
|
$MAKE_FLAGS \
|
||
|
AVR_TOOLS_PATH=$TOOLS_PATH/ \
|
||
|
ARDUINO_INSTALL_DIR=../ArduinoAddons/arduino-1.8.5 \
|
||
|
ARDUINO_VERSION=10805 \
|
||
|
HARDWARE_MOTHERBOARD=$motherboard_number \
|
||
|
LULZBOT_EXTRAS="$EXTRA_OPTS" \
|
||
|
DEFINES="$EXTRA_DEFS" \
|
||
|
$*) || exit
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# record_checksum <checksum-file-prefix>
|
||
|
#
|
||
|
# Records the md5sum of the compiled firmware to the checksum file
|
||
|
#
|
||
|
record_checksum() {
|
||
|
cat Marlin/applet/Marlin.hex Marlin/applet/Marlin.bin | md5sum | sed "s/-/${printer}_${toolhead}/g" >> ${1}-${fw_version}-${fw_hash}.txt
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# build_firmware <config_dir>
|
||
|
#
|
||
|
# Compiles firmware for the specified printer and toolhead
|
||
|
#
|
||
|
build_firmware() {
|
||
|
config=$1; shift 1
|
||
|
|
||
|
if [ ! -f $config/Configuration.h ]; then
|
||
|
echo Cannot locate $config
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
get_config_info $config
|
||
|
locate_gcc_for_board $motherboard_name
|
||
|
compile_deps_for_board $motherboard_name
|
||
|
|
||
|
if [ -z "$is_lulzbot" ]; then
|
||
|
# Bail if the FW is not an official Lulzbot build
|
||
|
echo Skipping $config because it does not appear compatible with this script.
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
# Copy over the configuration files
|
||
|
cp $config/Configuration.h $config/Configuration_adv.h Marlin
|
||
|
|
||
|
# Generate hashes
|
||
|
if [ $MAKE_HASHES ]; then
|
||
|
echo
|
||
|
echo Generating bare checksum for $printer and $toolhead
|
||
|
echo
|
||
|
EXTRA_OPTS='-Wfatal-errors -Wno-builtin-macro-redefined'
|
||
|
# Hide timestamps and versions so binaries can be diffed
|
||
|
EXTRA_DEFS='__DATE__=\"?\" __TIME__=\"?\" LULZBOT_FW_VERSION=\"?\"'
|
||
|
compile_firmware
|
||
|
record_checksum build/md5sums-bare
|
||
|
fi
|
||
|
|
||
|
# Compile the firmware
|
||
|
echo
|
||
|
echo Building for $printer and $toolhead
|
||
|
echo
|
||
|
EXTRA_OPTS='-Wfatal-errors'
|
||
|
EXTRA_DEFS=''
|
||
|
compile_firmware
|
||
|
if [ $MAKE_HASHES ]; then
|
||
|
record_checksum build/md5sums-full
|
||
|
fi
|
||
|
|
||
|
if [ $DRY_RUN ]; then
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
# Copy builds to build directory
|
||
|
|
||
|
if [ $motherboard_name = "BOARD_ARCHIM2" ]; then
|
||
|
mv Marlin/applet/Marlin.bin build/$fw_filename.bin
|
||
|
else
|
||
|
mv Marlin/applet/Marlin.hex build/$fw_filename.hex
|
||
|
fi
|
||
|
chmod a-x build/*
|
||
|
|
||
|
if [ $GENERATE_CONFIG ]; then
|
||
|
cp $config/Configuration_summary.txt build/$fw_filename.config
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# check_tool <path> <exec_name>
|
||
|
#
|
||
|
# Checks whether a tool exists in path
|
||
|
#
|
||
|
check_tool() {
|
||
|
if [ ! -x "$1/$2" ]; then
|
||
|
echo Cannot locate $2 in $1.
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# locate_tools <path_var> <prefix>
|
||
|
#
|
||
|
# Attempts to locate a tool, otherwise prompts
|
||
|
# the user for a location. The found path is
|
||
|
# stored in <path_var>
|
||
|
#
|
||
|
locate_tools() {
|
||
|
DEST_VAR=$1
|
||
|
TOOL_BINARY=`which $2-objcopy`
|
||
|
if [ $? -eq 0 ]; then
|
||
|
TOOLS_PATH=`dirname $TOOL_BINARY`
|
||
|
fi
|
||
|
while [ ! -x $TOOLS_PATH/$2-objcopy ]
|
||
|
do
|
||
|
echo
|
||
|
echo $2-objcopy not found!
|
||
|
echo
|
||
|
read -p "Type path to $2 tools: " TOOLS_PATH
|
||
|
if [ -z $TOOLS_PATH ]; then
|
||
|
echo Aborting.
|
||
|
exit
|
||
|
fi
|
||
|
done
|
||
|
eval "$DEST_VAR=$TOOLS_PATH"
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# check_tools <path> <prefix>
|
||
|
#
|
||
|
# Verify that all the AVR tools we need exist in the located
|
||
|
# directory.
|
||
|
#
|
||
|
check_tools() {
|
||
|
echo
|
||
|
echo Using $1 for $2 tools.
|
||
|
echo
|
||
|
|
||
|
check_tool $1 $2-gcc
|
||
|
check_tool $1 $2-objcopy
|
||
|
check_tool $1 $2-g++
|
||
|
check_tool $1 $2-objdump
|
||
|
check_tool $1 $2-ar
|
||
|
check_tool $1 $2-size
|
||
|
}
|
||
|
|
||
|
####
|
||
|
# build_summary
|
||
|
#
|
||
|
# Print out a summary of hex files that were created
|
||
|
#
|
||
|
build_summary() {
|
||
|
echo
|
||
|
echo
|
||
|
echo
|
||
|
echo Generated files stored in "`pwd`/build":
|
||
|
echo
|
||
|
ls build
|
||
|
echo
|
||
|
}
|
||
|
|
||
|
############################################
|
||
|
# MAIN SCRIPT
|
||
|
############################################
|
||
|
|
||
|
# Parse command line options
|
||
|
|
||
|
while true
|
||
|
do
|
||
|
case $1 in
|
||
|
-h|--hash)
|
||
|
MAKE_HASHES=1
|
||
|
shift
|
||
|
;;
|
||
|
-s|--short-names)
|
||
|
SHORTNAMES=1
|
||
|
shift
|
||
|
;;
|
||
|
-c|--config)
|
||
|
GENERATE_CONFIG=1
|
||
|
shift
|
||
|
;;
|
||
|
-n|--dry-run)
|
||
|
MAKE_FLAGS=-n
|
||
|
DRY_RUN=1
|
||
|
shift
|
||
|
;;
|
||
|
-*|--*)
|
||
|
usage
|
||
|
;;
|
||
|
*)
|
||
|
break
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
MAKE_FLAGS="$MAKE_FLAGS -j $(grep -c ^processor /proc/cpuinfo)"
|
||
|
|
||
|
rm -rf build
|
||
|
mkdir build
|
||
|
|
||
|
# Collect list of configuration directories to build
|
||
|
|
||
|
case $# in
|
||
|
2)
|
||
|
# If the user specified a printer and toolhead, try finding the config files
|
||
|
CONFIG_DIRS="config/examples/AlephObjects/$1/$2"
|
||
|
if [ ! -f "$CONFIG_DIRS/Configuration.h" ]; then
|
||
|
CONFIG_DIRS="config/examples/AlephObjects/EXPERIMENTAL/$1/$2"
|
||
|
fi
|
||
|
;;
|
||
|
1)
|
||
|
# If the user specified a configuration file, use that.
|
||
|
CONFIG_DIRS=`dirname $1`
|
||
|
;;
|
||
|
0)
|
||
|
# Otherwise, build all AlephObjects configuration files
|
||
|
CONFIG_DIRS=`find config/examples/AlephObjects/ -name Configuration.h -exec dirname {} \;`
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
# Build the firmware files
|
||
|
|
||
|
for i in $CONFIG_DIRS; do
|
||
|
build_firmware $i
|
||
|
done
|
||
|
|
||
|
if [ $# -eq 0 ]; then
|
||
|
# If compiling everything, clean up the config files after compilation is done
|
||
|
git checkout Marlin/Configuration.h Marlin/Configuration_adv.h
|
||
|
fi
|
||
|
|
||
|
if [ $SHORTNAMES ]; then
|
||
|
rename 's/Marlin_(.+)_(.+)_(.+)_(.+)_(.+)_(.+)/Marlin_$2_$4_$5_$6/' build/*
|
||
|
fi
|
||
|
|
||
|
build_summary
|