He creado un pequeño proyecto con un sistema de compilación personalizado (usando Ruby) que lo hace bastante fácil sin tener que instalar el IDE de Arduino. Básicamente, utiliza una plantilla Makefile y un script ruby para hacer que compilar las bibliotecas Arduino sea extremadamente fácil. Puedes verlo en https://github.com/Earlz/make-wiring
Sin embargo, estoy dejando la respuesta anterior aquí para obtener información sobre cómo hacer la suya. Sin embargo, es bastante engorroso y molesto:
Direcciones:
- Descargue una copia del código fuente de Arduino IDE
- Copie el contenido de
hardware/arduino/cores/arduino
a un nuevo directorio al que me referiré como arduino_build
- Copie el
pins_arduino.h
archivo de la variante Arduino que sea suya hardware/arduino/variants
(consulte boards.s.xt si no está seguro) a arduino_build
- Agregue este archivo MAKE a 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
Y luego solo corre
make
make install PREFIX=/usr/arduino (or whatever)
Y luego, para hacer uso de las bibliotecas compiladas, puede usar un archivo MAKE simple 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
Además, si intenta compilar las bibliotecas libraries/
, obtendrá un error de vinculador si no hace las cosas en el orden correcto. Por ejemplo, tuve que hacer esto para usar 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
El -larduino
debe ser la última biblioteca en la línea de comandos
De todos modos, esta fue una manera bastante fácil de compilarlo para mí. A medida que salgan las futuras versiones del Ardunio, este archivo MAKE debe ser bastante seguro para el futuro, y requiere solo algunas modificaciones a OBJS y HDRS. Además, este archivo MAKE debería funcionar tanto con BSD make como con GNU make
Vea también una versión ligeramente modificada de esta respuesta en mi blog con un binario ya compilado de la biblioteca (compilado usando el "estándar" pins_arduino.h).
** EDITAR **
Descubrí que agregar los siguientes indicadores de optimización del compilador tanto al Makefile del edificio de la biblioteca como a cada Makefile del proyecto individual reduce en gran medida el tamaño del binario compilado final. Esto hace que el tamaño binario final sea comparable al del IDE.
-Wl,--gc-sections -ffunction-sections -fdata-sections
.
Entonces, para el makefile de compilación de la biblioteca:
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
y, para cada proyecto makefile:
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