Browse Source

Build firmware under Windows 10 64-bit ...
using Linux subsystem Ubuntu or git-bash

3d-gussner 5 years ago
parent
commit
d0e3e9d2e2
3 changed files with 532 additions and 17 deletions
  1. 49 0
      README.md
  2. 477 17
      build.sh
  3. 6 0
      prepare_winbuild.ps1

+ 49 - 0
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-\<version\> 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_\<lang\>.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\<your-username>\Downloads\Prusa-Firmware-MK3`
+  - use under Ubuntu the following command `cd /mnt/c/Users/<your-username>/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  

+ 477 - 17
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 
+# <username>@<machinename> MINGW64 /<drive>/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
+# List few useful data
+echo
+echo "Script path:" $SCRIPT_PATH
+echo "OS         :" $OS
+echo "OS type    :" $OSTYPE
+echo ""
+
+#### Start prepare building
+
+#Check if build exists and creates it if not
+if [ ! -d "../build-env" ]; then
+    mkdir ../build-env || exit 2
+fi
+
+cd ../build-env || exit 3
+
+# Check if PF-build-env-<version> 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
+
+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
-cd build-env || exit 2
 
-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
+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
 
-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
+#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
 
-cd ../../PF-build-env-$BUILD_ENV || exit 5
+#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)"
+
+	#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
 
-$BUILD_ENV_PATH/arduino $SCRIPT_PATH/Firmware/Firmware.ino --verify --board rambo:avr:rambo --pref build.path=$BUILD_PATH || exit 9
+	#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
 
-export ARDUINO=$BUILD_ENV_PATH
+	# set FW_REPOSITORY
+	sed -i -- 's/#define FW_REPOSITORY "Unknown"/#define FW_REPOSITORY "Prusa3d"/g' $SCRIPT_PATH/Firmware/Configuration.h
 
-cd $SCRIPT_PATH/lang
-./lang-build.sh || exit 10
-./fw-build.sh || exit 11
+	#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

+ 6 - 0
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