From d0e3e9d2e274a002e94acf5759bd664e0eb585d5 Mon Sep 17 00:00:00 2001 From: 3d-gussner <3d.gussner@gmail.com> Date: Fri, 15 Feb 2019 16:26:47 +0100 Subject: [PATCH] Build firmware under Windows 10 64-bit ... using Linux subsystem Ubuntu or git-bash --- README.md | 49 +++++ build.sh | 496 +++++++++++++++++++++++++++++++++++++++++-- prepare_winbuild.ps1 | 6 + 3 files changed, 533 insertions(+), 18 deletions(-) create mode 100644 prepare_winbuild.ps1 diff --git a/README.md b/README.md index b7fc1155..0f428980 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,55 @@ If you wish to flash from Arduino, follow step [2.c](#2c) from Windows build fir The script downloads Arduino with our modifications and Rambo board support installed, unpacks it into folder PF-build-env-\ on the same level, as your Prusa-Firmware folder is located, builds firmware for MK3 using that Arduino in Prusa-Firmware-build folder on the same level as Prusa-Firmware, runs secondary language support scripts. Firmware with secondary language support is generated in lang subfolder. Use firmware.hex for MK3 variant. Use firmware_\.hex for other printers. Don't forget to follow step [2.b](#2b) first for non-MK3 printers. ## Windows +### If you want to use the automated `build.sh` you gonna need to install on you Windows a Linux subsystem or Git-bash + +###Steps for Linux subsystem und Windows 10 64-bit: +- follow the Microsoft guide https://docs.microsoft.com/en-us/windows/wsl/install-win10 + You can also use the 'prepare_winbuild.ps1' powershell script with Administrator rights +- Tested versions are at this moment + - Ubuntu other may different + - After the installation and reboot please open your Ubuntu bash and do following steps + - run command `apt-get update` + - to install zip run `apt-get install zip` + - add few lines at the top of `~/.bashrc` by running `sudo nano ~/.bashrc` + + export OS="Linux" + export JAVA_TOOL_OPTIONS="-Djava.net.preferIPv4Stack=true" + export GPG_TTY=$(tty) + + use `CRTL-X` to close nano and confirm to write the new entries + - restart Ubuntu bash +Now your Ubuntu subsystem is ready to use the automatic `build.sh` script and compile your firmware correctly + +####Some Tips for Ubuntu +- Linux is case sensetive so please don't forget to use capital letters where needed, like changing to a directory +- To change the path to your Prusa-Firmware location you downloaded and unzipped + - Example: You files are under `C:\Users\\Downloads\Prusa-Firmware-MK3` + - use under Ubuntu the following command `cd /mnt/c/Users//Downloads/Prusa-Firmware-MK3` + to change to the right folder + +####Compile Prusa-firmware with Ubuntu Linux subsystem installed +- open Ubuntu bash +- change to your source code folder (case sensitive) +- run `./build.sh` +- follow the instructions + +###Steps for Git-bash under Windows 10 64-bit: +- Download and install the 64bit Git version https://git-scm.com/download/win +- Also follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058 +- Download and install 7z-zip from its official website https://www.7-zip.org/ + By default, it is installed under the directory /c/Program Files/7-Zip in Windows 10 +- Run `Git-Bash` under Administrator privilege +- navigate to the directory /c/Program Files/Git/mingw64/bin +- run `ln -s /c/Program Files/7-Zip/7z.exe zip.exe` + +####Compile Prusa-firmware with Git-bash installed +- open Git-bash +- change to your source code folder +- run `bash build.sh` +- follow the instructions + + ### 1. Development environment preparation a. install `"Arduino Software IDE"` for your preferred operating system diff --git a/build.sh b/build.sh index 051f1352..97d9d1e2 100755 --- a/build.sh +++ b/build.sh @@ -1,40 +1,500 @@ #!/bin/bash +# This bash script is used to compile automatically the Prusa firmware with a dedecated build enviroment and settings +# +# Supported OS: Windows 10, Linux64 bit +# +# Linux: +# +# Windows: +# To excecute this sciprt you gonna need few things on your Windows machine +# +# Linux Subsystem Ubuntu +# 1. Follow these instructions +# 2. Open Ubuntu bash and get latest updates with 'apt-get upgate' +# 3. Install zip with 'apt-get install zip' +# 4. Add at top of ~/.bashrc following lines by using 'sudo nano ~/.bashrc' +# +# export OS="Linux" +# export JAVA_TOOL_OPTIONS="-Djava.net.preferIPv4Stack=true" +# export GPG_TTY=$(tty) +# +# and confirm them. Restart Ubuntu bash +# +# Or GIT-BASH +# 1. Download and install the correct (64bit or 32bit) Git version https://git-scm.com/download/win +# 2. Also follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058 +# 3. Download and install 7z-zip from its official website. +# By default, it is installed under the directory /c/Program Files/7-Zip in Windows 10 as my case. +# 4. Run git Bash under Administrator privilege and navigate to the directory /c/Program Files/Git/mingw64/bin, +# you can run the command ln -s /c/Program Files/7-Zip/7z.exe zip.exe +# +# Usefull things to edit and compare your custom Firmware +# 1. Download and install current and correct (64bit or 32bit) Notepad++ version https://notepad-plus-plus.org/download +# 2. Another great tool to compare your custom mod and stock firmware is WinMerge http://winmerge.org/downloads/?lang=en +# +# Example for MK3: open git bash and chage to your Firmware directory +# @ MINGW64 //path +# bash build.sh 1_75mm_MK3-EINSy10a-E3Dv6full +# +# Example for MK25: open git bash and chage to your directory +# gussner@WIN01 MINGW64 /d/Data/Prusa-Firmware/MK3 +# bash build.sh 1_75mm_MK25-RAMBo13a-E3Dv6full +# +# The compiled hex files can be found in the folder above like from the example +# gussner@WIN01 MINGW64 /d/Data/Prusa-Firmware +# FW351-Build1778-1_75mm_MK25-RAMBo13a-E3Dv6full.hex +# +# Version: 1.0.1-Build_8 +# Change log: +# 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt' +# 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is uknown +# 17 Jan 2019, 3d-gussner, Build_3, Check for OS Windows or Linux and use the right build enviroment +# 10 Feb 2019, ropaha, Pull Request, Select variant from list while using build.sh +# 10 Feb 2019, ropaha, change FW_DEV_VERSION automatically depending on FW_VERSION RC/BETA/ALPHA +# 10 Feb 2019, 3d-gussner, 1st tests with english only +# 10 Feb 2019, ropaha, added compiling of all variants and english only +# 10 Feb 2019, 3d-gussner, Set OUTPUT_FOLDER for hex files +# 11 Feb 2019, 3d-gussner/ropaha, Minor changes and fixes +# 11 Feb 2019, 3d-gussner, Ready for RC +# 12 Feb 2019, 3d-gussner, Check if wget and zip are installed. Thanks to Bernd to point it out +# 12 Feb 2019, 3d-gussner, Changed OS check to OSTYPE as it is not supported on Ubuntu +# Also added different BUILD_ENV folders depending on OS used so Windows +# Users can use git-bash AND Windows Linux Subsystems at the same time +# Cleanup compiler flags is only depends on OS version. +# 12 Feb 2019, 3d-gussner, Added additional OSTYPE check +# 15 feb 2019, 3d-gussner, Added zip files for miniRAMbo multi language hex files +# 15 Feb 2019, 3d-gussner, Added more checks if +# Compiled Hex-files +# Configuration_prusa.h +# language build files +# multi language firmware files exist and clean them up +# 15 Feb 2019, 3d-gussner, Fixed selction GOLD/UNKNOWN DEV_STATUS for ALL variants builds, so you have to choose only once +# 15 Feb 2019, 3d-gussner, Added some colored output +# 15 Feb 2019, 3d-gussner, troubleshooting and minor fixes + + + +###Check if OSTYPE is supported +if [ $OSTYPE == "msys" ]; then + if [ $(uname -m) == "x86_64" ]; then + echo "$(tput setaf 2)Windows 64-bit found$(tput sgr0)" + fi +elif [ $OSTYPE == "linux-gnu" ]; then + if [ $(uname -m) == "x86_64" ]; then + echo "$(tput setaf 2)Linux 64-bit found$(tput sgr0)" + fi +else + echo "$(tput setaf 1)This script doesn't support your Operating system!" + echo "Please use Linux 64-bit or Windows 10 64-bit with Linux subsystem / git-bash" + echo "Read the notes of build.sh$(tput sgr0)" + exit +fi +sleep 2 +###Prepare bash enviroment and check if wget and zip are availible +if ! type wget > /dev/null; then + echo "$(tput setaf 1)Missing 'wget' which is important to run this script" + echo "Please follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058 to install wget$(tput sgr0)" + exit +fi +if ! type zip > /dev/null; then + if [ $OSTYPE == "msys" ]; then + echo "$(tput setaf 1)Missing 'zip' which is important to run this script" + echo "Download and install 7z-zip from its official website https://www.7-zip.org/" + echo "By default, it is installed under the directory /c/Program Files/7-Zip in Windows 10 as my case." + echo "Run git Bash under Administrator privilege and" + echo "navigate to the directory /c/Program Files/Git/mingw64/bin," + echo "you can run the command $(tput setaf 2)ln -s /c/Program Files/7-Zip/7z.exe zip.exe$(tput sgr0)" + exit + elif [ $OSTYPE == "linux-gnu" ]; then + echo "$(tput setaf 1)Missing 'zip' which is important to run this script" + echo "install it with the command $(tput setaf 2)'sudo apt-get install zip'$(tput sgr0)" + exit + fi +fi +###End prepare bash enviroment + BUILD_ENV="1.0.1" SCRIPT_PATH="$( cd "$(dirname "$0")" ; pwd -P )" -if [ ! -d "build-env" ]; then - mkdir build-env || exit 1 -fi -cd build-env || exit 2 +# List few useful data +echo +echo "Script path:" $SCRIPT_PATH +echo "OS :" $OS +echo "OS type :" $OSTYPE +echo "" -if [ ! -f "PF-build-env-Linux64-$BUILD_ENV.zip" ]; then - wget https://github.com/mkbel/PF-build-env/releases/download/$BUILD_ENV/PF-build-env-Linux64-$BUILD_ENV.zip || exit 3 +#### Start prepare building + +#Check if build exists and creates it if not +if [ ! -d "../build-env" ]; then + mkdir ../build-env || exit 2 fi -if [ ! -d "../../PF-build-env-$BUILD_ENV" ]; then - unzip -q PF-build-env-Linux64-$BUILD_ENV.zip -d ../../PF-build-env-$BUILD_ENV || exit 4 +cd ../build-env || exit 3 + +# Check if PF-build-env- exists and downloads + creates it if not +# The build enviroment is based on the Arduino IDE 1.8.5 portal vesion with some changes +if [ ! -d "../PF-build-env-$BUILD_ENV" ]; then + echo "$(tput setaf 6)PF-build-env-$BUILD_ENV is missing ... creating it now for you$(tput sgr 0)" + mkdir ../PF-build-env-$BUILD_ENV + sleep 5 fi -cd ../../PF-build-env-$BUILD_ENV || exit 5 +if [ $OSTYPE == "msys" ]; then + if [ ! -f "PF-build-env-Win-$BUILD_ENV.zip" ]; then + echo "$(tput setaf 6)Downloding Windows build enviroment...$(tput setaf 2)" + sleep 2 + wget https://github.com/3d-gussner/PF-build-env/releases/download/Win-$BUILD_ENV/PF-build-env-Win-$BUILD_ENV.zip || exit 4 + #cp -f ../../PF-build-env/PF-build-env-Win-$BUILD_ENV.zip PF-build-env-Win-$BUILD_ENV.zip || exit4 + echo "$(tput sgr 0)" + fi + if [ ! -d "../PF-build-env-$BUILD_ENV/$OSTYPE" ]; then + echo "$(tput setaf 6)Unzipping Windows build enviroment...$(tput setaf 2)" + sleep 2 + unzip PF-build-env-Win-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$OSTYPE || exit 4 + echo "$(tput sgr0)" + fi + +fi + +if [ $OSTYPE == "linux-gnu" ]; then + if [ ! -f "PF-build-env-Linux64-$BUILD_ENV.zip" ]; then + echo "$(tput setaf 6)Downloading Linux 64 build enviroment...$(tput setaf 2)" + sleep 2 + wget https://github.com/mkbel/PF-build-env/releases/download/$BUILD_ENV/PF-build-env-Linux64-$BUILD_ENV.zip || exit 3 + echo "$(tput sgr0)" + fi + + if [ ! -d "../PF-build-env-$BUILD_ENV/$OSTYPE" ]; then + echo "$(tput setaf 6)Unzipping Linux build enviroment...$(tput setaf 2)" + sleep 2 + unzip PF-build-env-Linux64-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$OSTYPE || exit 4 + echo "$(tput sgr0)" + fi +fi +cd $SCRIPT_PATH + +# First argument defines which varaint of the Prusa Firmware will be compiled +if [ -z "$1" ] ; then + # Select which varaint of the Prusa Firmware will be compiled, like + PS3="Select a variant: " + while IFS= read -r -d $'\0' f; do + options[i++]="$f" + done < <(find Firmware/variants/ -maxdepth 1 -type f -name "*.h" -print0 ) + select opt in "${options[@]}" "All" "Quit"; do + case $opt in + *.h) + VARIANT=$(basename "$opt" ".h") + VARIANTS[i++]="$opt" + break + ;; + "All") + VARIANT="All" + VARIANTS=${options[*]} + break + ;; + "Quit") + echo "You chose to stop" + exit 1 + ;; + *) + echo "$(tput setaf 1)This is not a valid variant$(tput sgr0)" + ;; + esac + done +else + VARIANT=$1 +fi + +#Second argument defines if it is an english only version. Known values EN_ONLY / ALL +#Check default language mode +MULTI_LANGUAGE_CHECK=$(grep --max-count=1 "^#define LANG_MODE *" $SCRIPT_PATH/Firmware/config.h|sed -e's/ */ /g'|cut -d ' ' -f3) + +if [ -z "$2" ] ; then + PS3="Select a language: " + echo + echo "Which lang-build do you want?" + select yn in "Multi languages" "English only"; do + case $yn in + "Multi languages") + LANGUAGES="ALL" + sed -i -- "s/^#define LANG_MODE *0/#define LANG_MODE 1/g" $SCRIPT_PATH/Firmware/config.h + break + ;; + "English only") + LANGUAGES="EN_ONLY" + sed -i -- "s/^#define LANG_MODE *1/#define LANG_MODE 0/g" $SCRIPT_PATH/Firmware/config.h + break + ;; + *) + echo "$(tput setaf 1)This is not a valid language$(tput sgr0)" + ;; + esac + done +else + LANGUAGES=$2 +fi + +#Set BUILD_ENV_PATH +cd ../PF-build-env-$BUILD_ENV/$OSTYPE || exit 5 BUILD_ENV_PATH="$( pwd -P )" -cd .. +cd ../.. +#Checkif BUILD_PATH exisits and if not creates it if [ ! -d "Prusa-Firmware-build" ]; then mkdir Prusa-Firmware-build || exit 6 fi +#Set the BUILD_PATH for Arduino IDE cd Prusa-Firmware-build || exit 7 BUILD_PATH="$( pwd -P )" -if [ ! -f "$SCRIPT_PATH/Firmware/Configuration_prusa.h" ]; then - cp $SCRIPT_PATH/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 8 -fi +for v in ${VARIANTS[*]} +do + VARIANT=$(basename "$v" ".h") + # Find firmware version in Configuration.h file and use it to generate the hex filename + FW=$(grep --max-count=1 "\bFW_VERSION\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/ */ /g'|cut -d '"' -f2|sed 's/\.//g') + # Find build version in Configuration.h file and use it to generate the hex filename + BUILD=$(grep --max-count=1 "\bFW_COMMIT_NR\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/ */ /g'|cut -d ' ' -f3) + # Check if the motherboard is an EINSY and if so the only one hex file will generated + MOTHERBOARD=$(grep --max-count=1 "\bMOTHERBOARD\b" $SCRIPT_PATH/Firmware/variants/$VARIANT.h | sed -e's/ */ /g' |cut -d ' ' -f3) + # Check development status + DEV_CHECK=$(grep --max-count=1 "\bFW_VERSION\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/ */ /g'|cut -d '"' -f2|sed 's/\.//g'|cut -d '-' -f2) + if [ -z "$DEV_STATUS_SELECTED" ] ; then + if [[ "$DEV_CHECK" == "RC1" || "$DEV_CHECK" == "RC2" ]] ; then + DEV_STATUS="RC" + elif [[ "$DEV_CHECK" == "ALPHA" ]]; then + DEV_STATUS="ALPHA" + elif [[ "$DEV_CHECK" == "BETA" ]]; then + DEV_STATUS="BETA" + elif [[ "$DEV_CHECK" == "DEVEL" ]]; then + DEV_STATUS="DEVEL" + elif [[ "$DEV_CHECK" == "DEBUG" ]]; then + DEV_STATUS="DEBUG" + else + DEV_STATUS="UNKNOWN" + echo + echo "$(tput setaf 5)DEV_STATUS is UNKNOWN. Do you wish to set DEV_STATUS to GOLD?$(tput sgr0)" + PS3="Select YES only if source code is tested and trusted: " + select yn in "Yes" "No"; do + case $yn in + Yes) + DEV_STATUS="GOLD" + DEV_STATUS_SELECTED="GOLD" + break + ;; + No) + DEV_STATUS="UNKNOWN" + DEV_STATUS_SELECTED="UNKNOWN" + break + ;; + *) + echo "$(tput setaf 1)This is not a valid DEV_STATUS$(tput sgr0)" + ;; + esac + done + fi + else + DEV_STATUS=$DEV_STATUS_SELECTED + fi + #Prepare hex files folders + if [ ! -d "$SCRIPT_PATH/../Hex-files/FW$FW-Build$BUILD/$MOTHERBOARD" ]; then + mkdir -p $SCRIPT_PATH/../Hex-files/FW$FW-Build$BUILD/$MOTHERBOARD || exit 10 + fi + OUTPUT_FOLDER="Hex-files/FW$FW-Build$BUILD/$MOTHERBOARD" + + #Check if exacly the same hexfile already exsits + if [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.hex" && "$LANGUAGES" == "ALL" ]]; then + echo "" + ls $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.hex + echo "$(tput setaf 6)This hex file to be comiled already exsits! To cancle this process press CRTL+C and rename existing hex file.$(tput sgr 0)" + read -t 10 -p "Press any key to continue..." + elif [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex" && "$LANGUAGES" == "EN_ONLY" ]]; then + echo "" + ls $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex + echo "$(tput setaf 6)This hex file to be comiled already exsits! To cancle this process press CRTL+C and rename existing hex file.$(tput sgr 0)" + read -t 10 -p "Press any key to continue..." + fi + if [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip" && "$LANGUAGES" == "ALL" ]]; then + echo "" + ls $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip + echo "$(tput setaf 6)This zip file to be comiled already exsits! To cancle this process press CRTL+C and rename existing hex file.$(tput sgr 0)" + read -t 10 -p "Press any key to continue..." + fi + + #List some useful data + echo "$(tput setaf 2)$(tput setab 7) " + echo "Variant :" $VARIANT + echo "Firmware :" $FW + echo "Build # :" $BUILD + echo "Dev Check :" $DEV_CHECK + echo "DEV Status :" $DEV_STATUS + echo "Motherboard:" $MOTHERBOARD + echo "Languages :" $LANGUAGES + echo "Hex-file Folder:" $OUTPUT_FOLDER + echo "$(tput sgr0)" -$BUILD_ENV_PATH/arduino $SCRIPT_PATH/Firmware/Firmware.ino --verify --board rambo:avr:rambo --pref build.path=$BUILD_PATH || exit 9 + #Prepare Firmware to be compiled by copying variant as Configuration_prusa.h + if [ ! -f "$SCRIPT_PATH/Firmware/Configuration_prusa.h" ]; then + cp -f $SCRIPT_PATH/Firmware/variants/$VARIANT.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 11 + else + echo "$(tput setaf 6)Configuration_prusa.h already exist it will be overwritten in 10 seconds by the chosen variant.$(tput sgr 0)" + read -t 10 -p "Press any key to continue..." + cp -f $SCRIPT_PATH/Firmware/variants/$VARIANT.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 11 + fi -export ARDUINO=$BUILD_ENV_PATH + #Prepare Configuration.h to use the correct FW_DEV_VERSION to prevent LCD messages when connecting with OctoPrint + sed -i -- "s/#define FW_DEV_VERSION FW_VERSION_UNKNOWN/#define FW_DEV_VERSION FW_VERSION_$DEV_STATUS/g" $SCRIPT_PATH/Firmware/Configuration.h -cd $SCRIPT_PATH/lang -./lang-build.sh || exit 10 -./fw-build.sh || exit 11 + # set FW_REPOSITORY + sed -i -- 's/#define FW_REPOSITORY "Unknown"/#define FW_REPOSITORY "Prusa3d"/g' $SCRIPT_PATH/Firmware/Configuration.h + + #Prepare english only or multilanguage version to be build + if [ $LANGUAGES == "ALL" ]; then + echo " " + echo "Multi-language firmware will be build" + echo " " + else + echo " " + echo "English only language firmware will be build" + echo " " + fi + + #Check if compiler flags are set to Prusa specific needs for the rambo board. + if [ $OSTYPE == "msys" ]; then + RAMBO_PLATFORM_FILE="rambo/hardware/avr/1.0.1/platform.txt" + COMP_FLAGS="compiler.c.elf.flags={compiler.warning_flags} -Os -g -flto -fuse-linker-plugin -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" + CHECK_FLAGS=$(grep --max-count=1 "$COMP_FLAGS" $BUILD_ENV_PATH/portable/packages/$RAMBO_PLATFORM_FILE) + if [ -z "$CHECK_FLAGS" ]; then + echo "Compiler flags not found, adding flags" + if [ ! -f $BUILD_ENV_PATH/portable/packages/$RAMBO_PLATFORM_FILE.bck ]; then + echo "making a backup" + ls $BUILD_ENV_PATH/portable/packages/rambo/hardware/avr/1.0.1/ + cp -f $BUILD_ENV_PATH/portable/packages/$RAMBO_PLATFORM_FILE $BUILD_ENV_PATH/portable/packages/$RAMBO_PLATFORM_FILE.bck + fi + echo $COMP_FLAGS >> $BUILD_ENV_PATH/portable/packages/$RAMBO_PLATFORM_FILE + else + echo "Compiler flags are set in rambo platform.txt" $CHECK_FLAGS + fi + fi + + #### End of Prepare building + + #### Start building + + export ARDUINO=$BUILD_ENV_PATH + #echo $BUILD_ENV_PATH + export BUILDER=$ARDUINO/arduino-builder + + echo + #read -t 5 -p "Press any key..." + echo + + if [ $OSTYPE == "msys" ]; then + echo "Start to build Prusa Firmware under Windows..." + echo "Using variant $VARIANT$(tput setaf 3)" + sleep 2 + #$BUILDER -dump-prefs -logger=machine -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=rambo:avr:rambo -ide-version=10805 -build-path=$BUILD_PATH -warnings=none -quiet $SCRIPT_PATH/Firmware/Firmware.ino || exit 12 + #$BUILDER -compile -logger=machine -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=rambo:avr:rambo -ide-version=10805 -build-path=$BUILD_PATH -warnings=none -quiet $SCRIPT_PATH/Firmware/Firmware.ino || exit 13 + $BUILDER -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=rambo:avr:rambo -ide-version=10805 -build-path=$BUILD_PATH -warnings=default $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 + echo "$(tput sgr 0)" + fi + if [ $OSTYPE == "linux-gnu" ] ; then + echo "Start to build Prusa Firmware under Linux 64..." + echo "Using variant $VARIANT$(tput setaf 3)" + sleep 2 + $BUILD_ENV_PATH/arduino $SCRIPT_PATH/Firmware/Firmware.ino --verify --board rambo:avr:rambo --pref build.path=$BUILD_PATH || exit 14 + echo "$(tput sgr 0)" + fi + + if [ $LANGUAGES == "ALL" ]; then + echo "$(tput setaf 2)" + echo "Building mutli language firmware" $MULTI_LANGUAGE_CHECK + echo "$(tput sgr 0)" + sleep 2 + cd $SCRIPT_PATH/lang + echo "$(tput setaf 3)" + ./config.sh || exit 15 + echo "$(tput sgr 0)" + # Check if privious languages and firmware build exist and if so clean them up + if [ -f "lang_en.tmp" ]; then + echo "" + echo "$(tput setaf 6)Previous lang build files already exist these will be cleaned up in 10 seconds.$(tput sgr 0)" + read -t 10 -p "Press any key to continue..." + echo "$(tput setaf 3)" + ./lang-clean.sh + echo "$(tput sgr 0)" + fi + if [ -f "progmem.out" ]; then + echo "" + echo "$(tput setaf 6)Previous firmware build files already exist these will be cleaned up in 10 seconds.$(tput sgr 0)" + read -t 10 -p "Press any key to continue..." + echo "$(tput setaf 3)" + ./fw-clean.sh + echo "$(tput sgr 0)" + fi + # build languages + echo "$(tput setaf 3)" + ./lang-build.sh || exit 16 + # Combine compiled firmware with languages + ./fw-build.sh || exit 17 + echo "$(tput sgr 0)" + # Check if the motherboard is an EINSY and if so the only one hex file will generated + MOTHERBOARD=$(grep --max-count=1 "\bMOTHERBOARD\b" $SCRIPT_PATH/Firmware/variants/$VARIANT.h | sed -e's/ */ /g' |cut -d ' ' -f3) + # If the motherboard is an EINSY just copy one hexfile + if [ "$MOTHERBOARD" = "BOARD_EINSY_1_0a" ]; then + echo "$(tput setaf 2)Copying multi language firmware for MK3/Einsy board to Hex-files folder$(tput sgr 0)" + cp -f firmware.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.hex + else + echo "$(tput setaf 2)Zip multi language firmware for MK2.5/miniRAMbo board to Hex-files folder$(tput sgr 0)" + cp -f firmware_cz.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-cz.hex + cp -f firmware_de.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-de.hex + cp -f firmware_es.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-es.hex + cp -f firmware_fr.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-fr.hex + cp -f firmware_it.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-it.hex + cp -f firmware_pl.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-pl.hex + if [ $OSTYPE == "msys" ]; then + zip a $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-??.hex + rm $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-??.hex + elif [ $OSTYPE == "linux-gnu" ]; then + zip -m -j ../../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip ../../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-??.hex + fi + fi + # Cleanup after build + echo "$(tput setaf 3)" + ./fw-clean.sh || exit 18 + ./lang-clean.sh || exit 19 + echo "$(tput sgr 0)" + else + echo "$(tput setaf 2)Copying English only firmware to Hex-files folder$(tput sgr 0)" + cp -f $BUILD_PATH/Firmware.ino.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex || exit 20 + fi + + # Cleanup Firmware + rm $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 17 + sed -i -- "s/^#define FW_DEV_VERSION FW_VERSION_$DEV_STATUS/#define FW_DEV_VERSION FW_VERSION_UNKNOWN/g" $SCRIPT_PATH/Firmware/Configuration.h + sed -i -- 's/^#define FW_REPOSITORY "Prusa3d"/#define FW_REPOSITORY "Unknown"/g' $SCRIPT_PATH/Firmware/Configuration.h + echo $MULTI_LANGUAGE_CHECK + #sed -i -- "s/^#define LANG_MODE * /#define LANG_MODE $MULTI_LANGUAGE_CHECK/g" $SCRIPT_PATH/Firmware/config.h + sed -i -- "s/^#define LANG_MODE *1/#define LANG_MODE ${MULTI_LANGUAGE_CHECK}/g" $SCRIPT_PATH/Firmware/config.h + sed -i -- "s/^#define LANG_MODE *0/#define LANG_MODE ${MULTI_LANGUAGE_CHECK}/g" $SCRIPT_PATH/Firmware/config.h + sleep 5 +done + +# Cleanup compiler flags are set to Prusa specific needs for the rambo board. +#if [ $OSTYPE == "msys" ]; then +# echo " " +# echo "Restore Windows platform.txt" +# echo " " +# cp -f $BUILD_ENV_PATH/portable/packages/$RAMBO_PLATFORM_FILE.bck $BUILD_ENV_PATH/portable/packages/$RAMBO_PLATFORM_FILE +#fi + +# Switch to hex path and list build files +cd $SCRIPT_PATH +cd .. +echo "$(tput setaf 2) " +echo " " +echo "Build done, please use Slic3rPE > 1.41.0 to upload the firmware" +echo "more information how to flash firmware https://www.prusa3d.com/drivers/ $(tput sgr 0)" +#### End building diff --git a/prepare_winbuild.ps1 b/prepare_winbuild.ps1 new file mode 100644 index 00000000..b3dc09c4 --- /dev/null +++ b/prepare_winbuild.ps1 @@ -0,0 +1,6 @@ +#This powershell script prepares your Windows 10 64-bit computer to be able to compile your +#Prusa Firmware by installing a Linux Subsystem +#Please run it as administrator + +Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux +Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu -OutFile Ubuntu.appx -UseBasicParsing \ No newline at end of file