From 3d430cbe44dd240c6e586b18eee71808659e76e7 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 17:35:01 +0200 Subject: [PATCH 1/8] Add first working version of Arduino Due Makefile --- Makefile.Arduino | 199 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 Makefile.Arduino diff --git a/Makefile.Arduino b/Makefile.Arduino new file mode 100644 index 0000000..e1ca330 --- /dev/null +++ b/Makefile.Arduino @@ -0,0 +1,199 @@ +#!/usr/bin/make +# makefile for the arduino due (works with arduino IDE 1.6.11) +# +# USAGE: put this file in the same dir as your .ino file is. +# configure the PORT variable and ADIR at the top of the file +# to match your local configuration. +# Type make upload to compile and upload. +# Type make monitor to watch the serial port with gnu screen. +# +# TODO: +# * support libraries +# * handle possibly missing files in the currently hard coded ar step +# when assembling core.a together. +# * see what to do about the $(SAM)/cores/arduino/wiring_pulse_asm.S" add -x assembler-with-cpp +# and this one: $(SAM)/cores/arduino/avr/dtostrf.c +# +# LICENSE: GPLv2 or later (at your option) +# +# This file can be found at https://github.com/pauldreik/arduino-due-makefile +# +# By Paul Dreik http://www.pauldreik.se/ +# 20130503 initial version +# 20160924 updated to work with arduino 1.6.11 + +#user specific settings: +#where to find the IDE +ADIR:=$(HOME)/.arduino15 +#which serial port to use (add a file with SUBSYSTEMS=="usb", +#ATTRS{product}=="Arduino Due Prog. Port", ATTRS{idProduct}=="003d", +#ATTRS{idVendor}=="2341", SYMLINK+="arduino_due" in /etc/udev/rules.d/ +#to get this working). Do not prefix the port with /dev/, just take +#the basename. +PORT:=ttyACM0 +#if you want to verify the bossac upload, define this to -v +VERIFY:= + + +#end of user configuration. + + +#then some general settings. They should not be necessary to modify. +#CXX:=$(ADIR)/tools/g++_arm_none_eabi/bin/arm-none-eabi-g++ +CXX:=$(ADIR)/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-g++ +#CC:=$(ADIR)/tools/g++_arm_none_eabi/bin/arm-none-eabi-gcc +CC:=$(ADIR)/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-gcc +OBJCOPY:=$(ADIR)/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-objcopy + +C:=$(CC) +#SAM:=arduino/sam/ +SAM:=$(ADIR)/packages/arduino/hardware/sam/1.6.9 +#CMSIS:=arduino/sam/system/CMSIS/ +#LIBSAM:=arduino/sam/system/libsam +TMPDIR:=$(PWD)/build +AR:=$(ADIR)/tools/g++_arm_none_eabi/bin/arm-none-eabi-ar +AR:=$(ADIR)/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-ar + + +#all these values are hard coded and should maybe be configured somehow else, +#like olikraus does in his makefile. +DEFINES:=-Dprintf=iprintf -DF_CPU=84000000 -DARDUINO=10611 -D__SAM3X8E__ -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON \ + -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM '-DUSB_MANUFACTURER="Arduino LLC"' '-DUSB_PRODUCT="Arduino Due"' + +INCLUDES:=-I$(SAM)/system/libsam -I$(SAM)/system/CMSIS/CMSIS/Include/ \ + -I$(SAM)/system/CMSIS/Device/ATMEL/ -I$(SAM)/cores/arduino \ + -I$(SAM)/variants/arduino_due_x + +#also include the current dir for convenience +INCLUDES += -I. + +#compilation flags common to both c and c++ +COMMON_FLAGS:=-g -Os -w -ffunction-sections -fdata-sections -nostdlib \ + --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb \ + -fno-threadsafe-statics +#for compiling c (do not warn, this is not our code) +CFLAGS:=$(COMMON_FLAGS) -std=gnu11 +#for compiling c++ +CXXFLAGS:=$(COMMON_FLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -Wall -Wextra + +#let the results be named after the project +PROJNAME:=$(shell basename *.ino .ino) + +#we will make a new mainfile from the ino file. +NEWMAINFILE:=$(TMPDIR)/$(PROJNAME).ino.cpp + +#our own sourcefiles is the (converted) ino file and any local cpp files +MYSRCFILES:=$(NEWMAINFILE) $(shell ls *.cpp 2>/dev/null) +MYOBJFILES:=$(addsuffix .o,$(addprefix $(TMPDIR)/,$(notdir $(MYSRCFILES)))) + +#These source files are the ones forming core.a +CORESRCXX:=$(shell ls ${SAM}/cores/arduino/*.cpp ${SAM}/cores/arduino/USB/*.cpp ${SAM}/variants/arduino_due_x/variant.cpp) +CORESRC:=$(shell ls ${SAM}/cores/arduino/*.c) + +#hey this one is needed too: $(SAM)/cores/arduino/wiring_pulse_asm.S" add -x assembler-with-cpp +#and this one: /1.6.9/cores/arduino/avr/dtostrf.c but it seems to work +#anyway, probably because I do not use that functionality. + +#convert the core source files to object files. assume no clashes. +COREOBJSXX:=$(addprefix $(TMPDIR)/core/,$(notdir $(CORESRCXX)) ) +COREOBJSXX:=$(addsuffix .o,$(COREOBJSXX)) +COREOBJS:=$(addprefix $(TMPDIR)/core/,$(notdir $(CORESRC)) ) +COREOBJS:=$(addsuffix .o,$(COREOBJS)) + +default: + @echo default rule, does nothing. Try make compile or make upload. + +#This rule is good to just make sure stuff compiles, without having to wait +#for bossac. +compile: $(TMPDIR)/$(PROJNAME).elf + +#This is a make rule template to create object files from the source files. +# arg 1=src file +# arg 2=object file +# arg 3= XX if c++, empty if c +define OBJ_template +$(2): $(1) + $(C$(3)) -MD -c $(C$(3)FLAGS) $(DEFINES) $(INCLUDES) $(1) -o $(2) +endef +#now invoke the template both for c++ sources +$(foreach src,$(CORESRCXX), $(eval $(call OBJ_template,$(src),$(addsuffix .o,$(addprefix $(TMPDIR)/core/,$(notdir $(src)))),XX) ) ) +#...and for c sources: +$(foreach src,$(CORESRC), $(eval $(call OBJ_template,$(src),$(addsuffix .o,$(addprefix $(TMPDIR)/core/,$(notdir $(src)))),) ) ) + +#and our own c++ sources +$(foreach src,$(MYSRCFILES), $(eval $(call OBJ_template,$(src),$(addsuffix .o,$(addprefix $(TMPDIR)/,$(notdir $(src)))),XX) ) ) + + +clean: + test ! -d $(TMPDIR) || rm -rf $(TMPDIR) + $(RM) GitVersion.h + +.PHONY: upload default + +$(TMPDIR): + mkdir -p $(TMPDIR) + +$(TMPDIR)/core: + mkdir -p $(TMPDIR)/core + +#creates the cpp file from the .ino file +$(NEWMAINFILE): $(PROJNAME).ino + cat $(SAM)/cores/arduino/main.cpp > $(NEWMAINFILE) + cat $(PROJNAME).ino >> $(NEWMAINFILE) + echo 'extern "C" void __cxa_pure_virtual() {while (true);}' >> $(NEWMAINFILE) + +#include the dependencies for our own files +-include $(MYOBJFILES:.o=.d) + +#create the core library from the core objects. Do this EXACTLY as the +#arduino IDE does it, seems *really* picky about this. +#Sorry for the hard coding. +$(TMPDIR)/core.a: $(TMPDIR)/core $(COREOBJS) $(COREOBJSXX) + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/wiring_shift.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/wiring_analog.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/itoa.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/cortex_handlers.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/hooks.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/wiring.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/WInterrupts.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/syscalls_sam3.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/iar_calls_sam3.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/wiring_digital.c.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/Print.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/USARTClass.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/WString.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/PluggableUSB.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/USBCore.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/CDC.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/wiring_pulse.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/UARTClass.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/main.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/new.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/watchdog.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/Stream.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/RingBuffer.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/IPAddress.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/Reset.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/WMath.cpp.o + $(AR) rcs $(TMPDIR)/core.a $(TMPDIR)/core/variant.cpp.o + +#link our own object files with core to form the elf file +$(TMPDIR)/$(PROJNAME).elf: $(TMPDIR)/core.a $(TMPDIR)/core/syscalls_sam3.c.o $(MYOBJFILES) + $(CC) -mcpu=cortex-m3 -mthumb -Os -Wl,--gc-sections -T$(SAM)/variants/arduino_due_x/linker_scripts/gcc/flash.ld -Wl,-Map,$(NEWMAINFILE).map -o $@ -L$(TMPDIR) -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group -u _sbrk -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit -u kill -u _getpid $(MYOBJFILES) $(TMPDIR)/core/variant.cpp.o $(SAM)/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a $(SAM)/system/CMSIS/CMSIS/Lib/GCC/libarm_cortexM3l_math.a $(TMPDIR)/core.a -Wl,--end-group -lm -gcc + +#copy from the hex to our bin file (why?) +$(TMPDIR)/$(PROJNAME).bin: $(TMPDIR)/$(PROJNAME).elf + $(OBJCOPY) -O binary $< $@ + +#upload to the arduino by first resetting it (stty) and the running bossac +upload: $(TMPDIR)/$(PROJNAME).bin + stty -F /dev/$(PORT) cs8 1200 hupcl + $(ADIR)/packages/arduino/tools/bossac/1.6.1-arduino/bossac -i -d --port=$(PORT) -U false -e -w $(VERIFY) -b $(TMPDIR)/$(PROJNAME).bin -R + +# Export the current git version if the index file exists, else 000... +GitVersion.h: +ifneq ("$(wildcard .git/index)","") + echo "#define GITVERSION \"$(shell git rev-parse --short HEAD)\"" > $@ +else + echo "#define GITVERSION \"0000000\"" > $@ +endif From 07b7801821fd5af0523a967da297a7f09b6482ea Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 17:39:15 +0200 Subject: [PATCH 2/8] A little less verbose and add verfiy --- Makefile.Arduino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.Arduino b/Makefile.Arduino index e1ca330..4e430a6 100644 --- a/Makefile.Arduino +++ b/Makefile.Arduino @@ -32,7 +32,7 @@ ADIR:=$(HOME)/.arduino15 #the basename. PORT:=ttyACM0 #if you want to verify the bossac upload, define this to -v -VERIFY:= +VERIFY:=-v #end of user configuration. @@ -188,7 +188,7 @@ $(TMPDIR)/$(PROJNAME).bin: $(TMPDIR)/$(PROJNAME).elf #upload to the arduino by first resetting it (stty) and the running bossac upload: $(TMPDIR)/$(PROJNAME).bin stty -F /dev/$(PORT) cs8 1200 hupcl - $(ADIR)/packages/arduino/tools/bossac/1.6.1-arduino/bossac -i -d --port=$(PORT) -U false -e -w $(VERIFY) -b $(TMPDIR)/$(PROJNAME).bin -R + $(ADIR)/packages/arduino/tools/bossac/1.6.1-arduino/bossac -i --port=$(PORT) -U false -e -w $(VERIFY) -b $(TMPDIR)/$(PROJNAME).bin -R # Export the current git version if the index file exists, else 000... GitVersion.h: From 59a9b3018f5374982bf3b4b51d676af5801f9412 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 21:57:32 +0200 Subject: [PATCH 3/8] Add a define to Makefile --- Makefile.Arduino | 4 +++- SerialPort.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile.Arduino b/Makefile.Arduino index 4e430a6..58032d0 100644 --- a/Makefile.Arduino +++ b/Makefile.Arduino @@ -58,7 +58,8 @@ AR:=$(ADIR)/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-e #all these values are hard coded and should maybe be configured somehow else, #like olikraus does in his makefile. DEFINES:=-Dprintf=iprintf -DF_CPU=84000000 -DARDUINO=10611 -D__SAM3X8E__ -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON \ - -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM '-DUSB_MANUFACTURER="Arduino LLC"' '-DUSB_PRODUCT="Arduino Due"' + -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM '-DUSB_MANUFACTURER="Arduino LLC"' '-DUSB_PRODUCT="Arduino Due"' \ + -DMADEBYMAKEFILE INCLUDES:=-I$(SAM)/system/libsam -I$(SAM)/system/CMSIS/CMSIS/Include/ \ -I$(SAM)/system/CMSIS/Device/ATMEL/ -I$(SAM)/cores/arduino \ @@ -105,6 +106,7 @@ default: #This rule is good to just make sure stuff compiles, without having to wait #for bossac. +compile: GitVersion.h compile: $(TMPDIR)/$(PROJNAME).elf #This is a make rule template to create object files from the source files. diff --git a/SerialPort.cpp b/SerialPort.cpp index 4b64bd0..3cb392d 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -22,7 +22,7 @@ #include "Config.h" #include "Globals.h" -#if defined(STM32F4XX) || defined(STM32F4) +#if defined(MADEBYMAKEFILE) #include "GitVersion.h" #endif From f15fcc17ec3d531efc5c085ed82e1d46ada5bea5 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 22:18:25 +0200 Subject: [PATCH 4/8] Update Arduino Makefile to latest SAM version --- Makefile.Arduino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.Arduino b/Makefile.Arduino index 58032d0..5392075 100644 --- a/Makefile.Arduino +++ b/Makefile.Arduino @@ -47,7 +47,7 @@ OBJCOPY:=$(ADIR)/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-n C:=$(CC) #SAM:=arduino/sam/ -SAM:=$(ADIR)/packages/arduino/hardware/sam/1.6.9 +SAM:=$(ADIR)/packages/arduino/hardware/sam/1.6.11 #CMSIS:=arduino/sam/system/CMSIS/ #LIBSAM:=arduino/sam/system/libsam TMPDIR:=$(PWD)/build @@ -92,7 +92,7 @@ CORESRCXX:=$(shell ls ${SAM}/cores/arduino/*.cpp ${SAM}/cores/arduino/USB/*.cpp CORESRC:=$(shell ls ${SAM}/cores/arduino/*.c) #hey this one is needed too: $(SAM)/cores/arduino/wiring_pulse_asm.S" add -x assembler-with-cpp -#and this one: /1.6.9/cores/arduino/avr/dtostrf.c but it seems to work +#and this one: /1.6.11/cores/arduino/avr/dtostrf.c but it seems to work #anyway, probably because I do not use that functionality. #convert the core source files to object files. assume no clashes. From bb42bdc42281f441ab3b2a886553402ce2f4d9f2 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 22:31:59 +0200 Subject: [PATCH 5/8] Add build/ dir for Arduino Makefile to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ca38dc6..64deba0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ obj/ bin/ STM32F4XX_Lib/ GitVersion.h +build/ From 27618658a9ce8820b171ee3d9e3fc38332233308 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 22:43:02 +0200 Subject: [PATCH 6/8] Force rebuild of GitVersion.h --- Makefile.Arduino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile.Arduino b/Makefile.Arduino index 5392075..12e6962 100644 --- a/Makefile.Arduino +++ b/Makefile.Arduino @@ -130,7 +130,7 @@ clean: test ! -d $(TMPDIR) || rm -rf $(TMPDIR) $(RM) GitVersion.h -.PHONY: upload default +.PHONY: .FORCE upload default $(TMPDIR): mkdir -p $(TMPDIR) @@ -193,9 +193,11 @@ upload: $(TMPDIR)/$(PROJNAME).bin $(ADIR)/packages/arduino/tools/bossac/1.6.1-arduino/bossac -i --port=$(PORT) -U false -e -w $(VERIFY) -b $(TMPDIR)/$(PROJNAME).bin -R # Export the current git version if the index file exists, else 000... -GitVersion.h: +GitVersion.h: .FORCE ifneq ("$(wildcard .git/index)","") echo "#define GITVERSION \"$(shell git rev-parse --short HEAD)\"" > $@ else echo "#define GITVERSION \"0000000\"" > $@ endif + +.FORCE: From fa251afdcbb2e501167a54c574cad03e9e1ff843 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 22:58:35 +0200 Subject: [PATCH 7/8] Add define for default Makefile --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 8c93c7a..3b1e789 100644 --- a/Makefile +++ b/Makefile @@ -85,11 +85,11 @@ MCFLAGS=-mcpu=cortex-m4 -mthumb -mlittle-endian \ # COMPILE FLAGS # STM32F4 Discovery board: -DEFS_DIS=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F40_41xxx -DSTM32F4_DISCOVERY -DHSE_VALUE=$(OSC) +DEFS_DIS=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F40_41xxx -DSTM32F4_DISCOVERY -DHSE_VALUE=$(OSC) -DMADEBYMAKEFILE # Pi board: -DEFS_PI=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F446xx -DSTM32F4_PI -DARDUINO_MODE_PINS -DSEND_RSSI_DATA -DSERIAL_REPEATER -DHSE_VALUE=$(OSC) +DEFS_PI=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F446xx -DSTM32F4_PI -DARDUINO_MODE_PINS -DSEND_RSSI_DATA -DSERIAL_REPEATER -DHSE_VALUE=$(OSC) -DMADEBYMAKEFILE # STM32F4 Nucleo 446 board: -DEFS_NUCLEO=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F446xx -DSTM32F4_NUCLEO -DHSE_VALUE=$(OSC) +DEFS_NUCLEO=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F446xx -DSTM32F4_NUCLEO -DHSE_VALUE=$(OSC) -DMADEBYMAKEFILE CFLAGS=-c $(MCFLAGS) $(INCLUDES) CXXFLAGS=-c $(MCFLAGS) $(INCLUDES) From 871c328914c05f39d5893e12adff6091a8bef631 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 12 Apr 2017 23:00:39 +0200 Subject: [PATCH 8/8] Cleanup Makefile.Arduino --- Makefile.Arduino | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/Makefile.Arduino b/Makefile.Arduino index 12e6962..36c3dd4 100644 --- a/Makefile.Arduino +++ b/Makefile.Arduino @@ -1,26 +1,13 @@ #!/usr/bin/make # makefile for the arduino due (works with arduino IDE 1.6.11) # +# The original file can be found at https://github.com/pauldreik/arduino-due-makefile +# # USAGE: put this file in the same dir as your .ino file is. # configure the PORT variable and ADIR at the top of the file # to match your local configuration. # Type make upload to compile and upload. -# Type make monitor to watch the serial port with gnu screen. # -# TODO: -# * support libraries -# * handle possibly missing files in the currently hard coded ar step -# when assembling core.a together. -# * see what to do about the $(SAM)/cores/arduino/wiring_pulse_asm.S" add -x assembler-with-cpp -# and this one: $(SAM)/cores/arduino/avr/dtostrf.c -# -# LICENSE: GPLv2 or later (at your option) -# -# This file can be found at https://github.com/pauldreik/arduino-due-makefile -# -# By Paul Dreik http://www.pauldreik.se/ -# 20130503 initial version -# 20160924 updated to work with arduino 1.6.11 #user specific settings: #where to find the IDE