Criei um pequeno projeto com um sistema de compilação personalizado (usando Ruby) que facilita bastante isso sem a necessidade de instalar o Arduino IDE. Basicamente, ele usa um Makefile de modelo e um script ruby para facilitar a compilação das bibliotecas do Arduino. Você pode vê-lo em https://github.com/Earlz/make-wiring
No entanto, estou deixando aqui a resposta antiga para obter informações sobre como criar sua própria. É bastante complicado e irritante:
Instruções:
- Faça o download de uma cópia do código fonte do Arduino IDE
- Copie o conteúdo de
hardware/arduino/cores/arduino
para um novo diretório que chamarei de arduino_build
- Copie o
pins_arduino.h
arquivo de qualquer variante do Arduino hardware/arduino/variants
(verifique boards.txt se você não tiver certeza) para arduino_build
- Adicione este makefile ao arduino_build:
.
#BSD licensed, see http://lastyearswishes.com/static/Makefile for full license
HDRS = Arduino.h binary.h Client.h HardwareSerial.h IPAddress.h new.h pins_arduino.h Platform.h Printable.h Print.h \
Server.h Stream.h Udp.h USBAPI.h USBCore.h USBDesc.h WCharacter.h wiring_private.h WString.h
OBJS = WInterrupts.o wiring_analog.o wiring.o wiring_digital.o wiring_pulse.o wiring_shift.o CDC.o HardwareSerial.o \
HID.o IPAddress.o main.o new.o Print.o Stream.o Tone.o USBCore.o WMath.o WString.o
#may need to adjust -mmcu if you have an older atmega168
#may also need to adjust F_CPU if your clock isn't set to 16Mhz
CFLAGS = -I./ -std=gnu99 -DF_CPU=16000000UL -Os -mmcu=atmega328p
CPPFLAGS = -I./ -DF_CPU=16000000UL -Os -mmcu=atmega328p
CC=avr-gcc
CPP=avr-g++
AR=avr-ar
default: libarduino.a
libarduino.a: ${OBJS}
${AR} crs libarduino.a $(OBJS)
.c.o: ${HDRS}
${CC} ${CFLAGS} -c $*.c
.cpp.o: ${HDRS}
${CPP} ${CPPFLAGS} -c $*.cpp
clean:
rm -f ${OBJS} core a.out errs
install: libarduino.a
mkdir -p ${PREFIX}/lib
mkdir -p ${PREFIX}/include
cp *.h ${PREFIX}/include
cp *.a ${PREFIX}/lib
E então apenas corra
make
make install PREFIX=/usr/arduino (or whatever)
E então, para fazer uso das bibliotecas compiladas, você pode usar um makefile simples como este:
default:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -mmcu=atmega328p -o main.elf main.c -larduino
avr-objcopy -O ihex -R .eeprom main.elf out.hex
upload:
avrdude -c arduino -p m328p -b 57600 -P /dev/ttyUSB0 -U flash:w:out.hex
all: default upload
Além disso, se você tentar compilar as bibliotecas, libraries/
você receberá um erro de vinculador se não fizer as coisas na ordem certa. Por exemplo, eu tive que fazer isso para usar o SoftwareSerial:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -mmcu=atmega328p -o main.elf main.c -lSoftwareSerial -larduino
O -larduino
deve ser a última biblioteca na linha de comando
Enfim, essa foi uma maneira muito fácil de compilar para mim. À medida que as versões futuras do Ardunio forem lançadas, esse makefile deve ser bastante à prova de futuro, exigindo apenas algumas modificações no OBJS e no HDRS. Além disso, esse makefile deve funcionar tanto com o BSD make quanto com o GNU make
Veja também uma versão ligeiramente modificada desta resposta no meu blog com um binário já compilado da biblioteca (compilado usando o pins_arduino.h "padrão").
** EDIT **
Descobri que a adição dos seguintes sinalizadores de otimização do compilador ao Makefile de construção da biblioteca e a cada projeto individual do Makefile reduz bastante o tamanho do binário final compilado. Isso torna o tamanho binário final comparável ao do IDE.
-Wl,--gc-sections -ffunction-sections -fdata-sections
.
Portanto, para a biblioteca construa makefile:
CFLAGS = -I./ -std=gnu99 -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p
CPPFLAGS = -I./ -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p
e, para cada makefile do projeto:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p -o main.elf main.c -larduino
.
Ref: http://arduino.cc/forum/index.php?topic=153186.0