Command line Arduino compiling and uploading?

后端 未结 11 843
长发绾君心
长发绾君心 2020-12-13 17:37

How do I compile and upload Arduino sketches from the command line on Mac and Linux? I\'ve installed the Arduino programming environment. Are there some sample makefiles an

11条回答
  •  佛祖请我去吃肉
    2020-12-13 18:17

    This is my boilerplate gnu make include for AVR projects, you may need to adapt some of it to fit your environment. It creates dependencies, has a host of standard gcc options I find useful or that optimize for size, as well as a library dir I use. I used this successfully to compile arduino software, I also previously hacked the PdePreprocessor in the arduino editor to be run from the command line to generate all the voodoo:

    https://github.com/wesen/mididuino/blob/master/app/src/processing/app/preproc/PdePreprocessor.java

    #
    # generic AVR makefile
    #
    # (c)  July 2011 - Manuel Odendahl - wesen@ruinwesen.com
    #
    
    # include this into your main Makefile, after having defined TARGET and TARGET_OBJS
    
    all: $(TARGET).hex
    
    CURDIR := $(dir $(lastword $(MAKEFILE_LIST)))
    include $(CURDIR)MidiCtrl.mk
    
    CC             = avr-gcc
    CXX            = avr-g++
    OBJCOPY        = avr-objcopy
    AVR_ARCH       ?= atmega64
    LDAVR_ARCH     ?= avrmega64
    FLASH_PROTOCOL = jtag2
    
    CFLAGS   += -Os -ffunction-sections -DAVR -I. -mmcu=$(AVR_ARCH) -mcall-prologues -fshort-enums -fpack-struct -Wall -Werror
    CFLAGS   += -Wall -DLITTLE_ENDIAN -g -flto
    
    CFLAGS += no-tree-loop-optimize -ffreestanding -morder1 -funsigned-char -funsigned-bitfields -fshort-enums -fpack-struct
    CFLAGS += -fdata-sections -fno-split-wide-types -fno-inline-small-functions -mcall-prologues
    
    CLDFLAGS += -Wl,--relax,--gc-sections -ffunction-sections
    CLDFLAGS += -mmcu=$(AVR_ARCH)
    LDFLAGS  = -m $(LDAVR_ARCH) -M
    
    # generate list
    # CFLAGS += -Wa,-adhlns=$@.lst
    
    %.o: %.cpp
            $(CXX) $(CXXFLAGS) -c $< -o $@
    
    %.o: %.c
            $(CC) $(CFLAGS) -c $< -o $@
    
    %.o: %.s
            $(CC) $(CFLAGS) -c $< -o $@
    
    %.s: %.c
            $(CC) -S $(CFLAGS) -fverbose-asm $< -o $@
    
    %.o: %.S
            $(CC) $(CFLAGS) -c $< -o $@
    
    %.syx: %.hex
            ihex2sysex $< $@
    
    %.srec: %.elf
            $(OBJCOPY) -j .text -j .data -O srec $< $@
    
    %.hex: %.elf
            $(OBJCOPY) -j .text -j .data -O ihex $< $@
    
    %.ee_srec: %.elf
            $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@
    
    AVR_BASE_DIR  ?= $(abspath $(CURDIR)..)
    AVR_LIB_DIR   ?= $(AVR_BASE_DIR)/hardware/libraries
    
    AVR_LIBS       += CommonTools Midi
    AVR_LIB_DIRS   += $(foreach lib,$(AVR_LIBS),$(AVR_LIB_DIR)/$(lib))
    AVR_INC_FLAGS  += $(foreach dir,$(AVR_LIB_DIRS),-I$(dir))
    AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(wildcard $(dir)/*.cpp),$(subst .cpp,.o,$(file))))
    AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(filter-out $(AVR_HOST_EXCLUDE),$(wildcard $(dir)/*.c)),$(subst .c,.o,$(file))))
    AVR_DEPS       += $(subst .o,.d,$(AVR_OBJS))
    
    # AVR_HOST_EXCLUDE can be used to exclude specific files later on
    
    CXXFLAGS += $(AVR_INC_FLAGS)
    CFLAGS += $(AVR_INC_FLAGS)
    
    CXXFlags += -Werror -Wall
    CFLAGS += -Werror -Wall
    
    default: all
    
    %.d:%.c
            set -e; $(CC) -MM $(CFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    %.d:%.cpp
            set -e; $(CXX) -MM $(CXXFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    %.host.d:%.c
            set -e; $(CC) -MM $(CFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    %.host.d:%.cpp
            set -e; $(CXX) -MM $(CXXFLAGS) $< \
            | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
            [ -s $@ ] || rm -f $@
    
    printlibs:
            echo $(AVR_LIBS)
    
    $(TARGET).elf: $(TARGET).o $(TARGET_OBJS) $(AVR_OBJS)
            $(CXX) $(CLDFLAGS) -g -o $@ $^
    
    _clean:
            - rm *.elf *.hex *.o .midictrl.flags
    
    libclean:
            rm -rf $(TARGET_OBJS) $(OBJS)
    
    # concrete settings for development environment
    
    UNAME=$(shell uname)
    ISWIN=$(findstring CYGWIN,$(UNAME))
    ISMAC=$(findstring Darwin,$(UNAME))
    
    CC = avr-gcc
    CXX = avr-g++
    OBJCOPY = avr-objcopy
    AVR_ARCH = atmega64
    F_CPU = 16000000L
    CORE = minicommand2
    

提交回复
热议问题