OS autodetection

Note that not all copies of the Makefile include this at the moment (see section "Use" below).


The name of the serial port depends on the operating system:
  • Windows: COM4:
  • All others (?): /dev/ttyUSB0

The port to use is selected automatically to avoid having to modify the Makefile every time a different machine is used.


The Makefile contains a line starting with AVRDUDE_PORT =. Replace that line with:

AVRDUDE_PORT = $(shell if uname -s |grep -i w32 >/dev/null; then echo 'COM4:'; else echo '/dev/ttyUSB0'; fi)


  • uname
  • sh

Both are standard on unix machines and included in the mingw32 distribution.

Principle of operation


The OS is determined by looking at the output of the uname -s (kernel name) command. If the output contains, case insensitively, the string "w32", a Windows system is assumed and COM4: is used. If not, /dev/ttyUSB0 is used.


The switch is not implemented by means of make but relies on a shellout. The output from grep is redirected to /dev/null to avoid printing the port name to stdout.

Alternative methods

  • Instead of looking at the output of uname, the existence of /dev/ttyUSB0 could be checked. However, it would try to access COM4: on Linux when the robot is not plugged in (which is not a real problem, but might lead to confusion).
  • The system wide AVRdude configuration file (/etc/avrdude.conf) could be used to set the default port for a given machine (where is this file located on Windows systems?). However, this would have to be set up for every machine used for programming.


A more complex selection scheme can be implemented in case the name of the port may be different on a given machine (for example COM1: or /dev/ttyS0).


  • Multi-user main function (problems with the current solution: preprocessor black magic, main function not called main, main file not recompiled when different makefile chosen)
  • Single Makefile (included)
  • Change target name "main"
  • Output files not clean up?