Я створив невеликий проект із спеціальною системою збірки (використовуючи Ruby), що робить це досить просто, не встановлюючи Arduino IDE. В основному він використовує шаблон Makefile і сценарій рубіну, щоб зробити компіляцію бібліотек Arduino надзвичайно просто. Ви можете побачити це на https://github.com/Earlz/make-wiring
Однак я залишаю тут стару відповідь, щоб отримати інформацію про те, як прокрутити свій власний. Це досить громіздко і дратує:
Напрямки:
- Завантажте копію вихідного коду Ardeino IDE
- Скопіюйте вміст у
hardware/arduino/cores/arduino
новий каталог, який я буду називати arduino_build
- Скопіюйте
pins_arduino.h
файл із будь-якого варіанта Arduino hardware/arduino/variants
(перевірте Board.txt, якщо ви не впевнені) на arduino_build
- Додайте цей makefile до 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)
А потім скористатися зібраними бібліотеками та такими, ви можете скористатися простим makefile таким чином:
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 цей makefile повинен бути досить надійним, вимагаючи лише декількох модифікацій OBJS та HDRS. Крім того, цей makefile повинен працювати як з 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
і для кожного файлу проекту:
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