Saya telah membuat proyek kecil dengan sistem build khusus (menggunakan Ruby) yang membuat ini sangat mudah tanpa harus menginstal IDE Arduino. Pada dasarnya, ia menggunakan templat Makefile, dan skrip ruby untuk membuat kompilasi pustaka Arduino menjadi sangat mudah. Anda dapat melihatnya di https://github.com/Earlz/make-wiring
Namun, saya meninggalkan jawaban lama di sini untuk informasi tentang menggulirkan jawaban Anda sendiri. Ini cukup rumit dan menjengkelkan:
Petunjuk arah:
- Unduh salinan kode sumber IDE Arduino
- Salin konten
hardware/arduino/cores/arduino
ke direktori baru yang saya sebut arduino_build
- Salin
pins_arduino.h
file dari varian Arduino mana pun milik Anda hardware/arduino/variants
(centang boards.txt jika Anda tidak yakin) ke arduino_build
- Tambahkan makefile ini ke 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
Dan kemudian jalankan
make
make install PREFIX=/usr/arduino (or whatever)
Dan kemudian untuk menggunakan perpustakaan yang dikompilasi dan semacamnya, Anda dapat menggunakan makefile sederhana seperti ini:
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
Juga, jika Anda mencoba mengkompilasi perpustakaan di libraries/
Anda akan mendapatkan kesalahan linker jika Anda tidak melakukan hal-hal dalam urutan yang benar. Sebagai contoh, saya harus melakukan ini untuk menggunakan 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
Itu -larduino
harus menjadi perpustakaan terakhir di baris perintah
Bagaimanapun, ini adalah cara yang cukup mudah untuk mengkompilasinya untuk saya. Ketika versi masa depan dari Ardunio keluar, makefile ini harus cukup tahan di masa depan, hanya membutuhkan beberapa modifikasi untuk OBJS dan HDRS. Juga, makefile ini harus bekerja dengan BSD make dan GNU make
Lihat juga versi yang sedikit dimodifikasi dari jawaban ini di blog saya dengan biner perpustakaan yang sudah dikompilasi (dikompilasi menggunakan pin_arduino.h "standar").
** EDIT **
Saya menemukan bahwa menambahkan flag pengoptimalan kompiler berikut ke Makefile gedung perpustakaan dan setiap proyek individu Makefile sangat mengurangi ukuran biner akhir yang dikompilasi. Ini membuat ukuran biner akhir sebanding dengan IDE.
-Wl,--gc-sections -ffunction-sections -fdata-sections
.
Jadi, untuk perpustakaan build 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
dan, untuk setiap makefile proyek:
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