Я создал небольшой проект с пользовательской системой сборки (с использованием Ruby), которая делает это довольно легко, без необходимости установки Arduino IDE. В основном, он использует шаблон Makefile и скрипт ruby, чтобы сделать компиляцию библиотек Arduino чрезвычайно простой. Вы можете увидеть это на https://github.com/Earlz/make-wiring
Тем не менее, я оставляю здесь старый ответ для получения информации о том, как прокрутить свой собственный. Это довольно громоздко и раздражает, хотя:
Направления:
- Загрузите копию исходного кода Arduino IDE
- Скопируйте содержимое
hardware/arduino/cores/arduino
в новый каталог, который я буду называть arduino_build
- Скопируйте
pins_arduino.h
файл с любого варианта Arduino, с которого вы hardware/arduino/variants
(смотри Board.txt, если вы не уверены), в arduino_build
- Добавьте этот make-файл в 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
А потом просто беги
make
make install PREFIX=/usr/arduino (or whatever)
И затем, чтобы использовать скомпилированные библиотеки и тому подобное, вы можете использовать простой make-файл, подобный следующему:
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
Кроме того, если вы попытаетесь скомпилировать библиотеки, libraries/
вы получите ошибку компоновщика, если вы не сделаете все в правильном порядке. Например, я должен был сделать это, чтобы использовать 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
-larduino
Должна быть последней библиотекой в командной строке
В любом случае, для меня это был довольно простой способ. По мере появления будущих версий Ardunio этот make-файл должен быть достаточно перспективным, требуя всего лишь нескольких модификаций OBJS и HDRS. Кроме того, этот make-файл должен работать как с BSD make, так и с GNU make
См. Также слегка измененную версию этого ответа в моем блоге с уже скомпилированным двоичным файлом библиотеки (скомпилированным с использованием «стандартного» pins_arduino.h).
** РЕДАКТИРОВАТЬ **
Я обнаружил, что добавление следующих флагов оптимизации компилятора в Makefile создания библиотеки и в каждый отдельный Makefile проекта значительно уменьшает размер конечного скомпилированного двоичного файла. Это делает окончательный размер двоичного файла сопоставимым с размером среды IDE.
-Wl,--gc-sections -ffunction-sections -fdata-sections
,
Итак, для сборки библиотеки 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
и для каждого проекта 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
,
Ссылка: http://arduino.cc/forum/index.php?topic=153186.0