# Hey Emacs, this is a -*- makefile -*- # # $Id$ # Copyright (C) 2003-2005 Pascal Brisset, Antoine Drouin # # This file is part of paparazzi. # # paparazzi is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # paparazzi is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with paparazzi; see the file COPYING. If not, write to # the Free Software Foundation, 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # # This is the common Makefile for the arm7-target. # SRC_ARCH = arm7 # Define programs and commands. HAVE_ARM_NONE_EABI_GCC := $(wildcard /usr/bin/arm-none-eabi-gcc) ifeq ($(strip $(HAVE_ARM_NONE_EABI_GCC)),) CC = arm-elf-gcc LD = $(CC) SHELL = sh OBJCOPY = arm-elf-objcopy OBJDUMP = arm-elf-objdump SIZE = arm-elf-size NM = arm-elf-nm else CC = arm-none-eabi-gcc LD = $(CC) SHELL = sh OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump SIZE = arm-none-eabi-size NM = arm-none-eabi-nm endif REMOVE = rm -f COPY = cp # Launch with "make Q=''" to get full command display Q=@ # MCU name and submodel MCU = arm7tdmi THUMB = -mthumb THUMB_IW = -mthumb-interwork # Output format. (can be srec, ihex, binary) FORMAT = ihex #FLASH_MODE=ISP SRCARM = $($(TARGET).srcs) ASRCARM = crt0.S # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s #OPT=3 CSTANDARD = -std=gnu99 CINCS = $(INCLUDES) -I $(SRC_ARCH)/include # Compiler flags. CFLAGS = $(CINCS) CFLAGS += -O$(OPT) # CFLAGS += -malignment-traps CFLAGS += -Wall -Wcast-qual -Wimplicit -Wcast-align -Winline CFLAGS += -Wpointer-arith -Wswitch CFLAGS += -Wredundant-decls -Wreturn-type -Wshadow -Wunused CFLAGS += -Wa,-adhlns=$(OBJDIR)/$(notdir $(subst $(suffix $<),.lst,$<)) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += -ffunction-sections -fdata-sections # flags only for C CFLAGS + = -Wstrict-prototypes -Wmissing-declarations CFLAGS += -Wmissing-prototypes -Wnested-externs CFLAGS += $(CSTANDARD) CFLAGS += $($(TARGET).CFLAGS) $(LOCAL_CFLAGS) # Assembler flags. ASFLAGS = -Wa,-adhlns=$(OBJDIR)/$(notdir $(<:.S=.lst)) #Additional libraries. MATH_LIB = -lm # Linker flags. LDFLAGS = -n -nostartfiles -Wl,-Map=$(OBJDIR)/$(TARGET).map,--cref LDFLAGS += -lc LDFLAGS += $(NEWLIBLPC) $(MATH_LIB) LDFLAGS += -lc -lgcc LDFLAGS += $(CPLUSPLUS_LIB) LDFLAGS += -Wl,--gc-sections # -lusbstack -Larm7/lpcusb ifndef LDSCRIPT ifeq ($(FLASH_MODE),ISP) LDSCRIPT = $(SRC_ARCH)/LPC2148-ROM.ld else ifeq ($(FLASH_MODE),ISP) LDSCRIPT = $(SRC_ARCH)/LPC2148-ROM.ld else LDSCRIPT = $(SRC_ARCH)/LPC2148-ROM-bl.ld endif endif LDFLAGS +=-T$(LDSCRIPT) #endif # --------------------------------------------------------------------------- # Flash-Programming support using lpc21isp by Martin Maurer # Settings and variables: LPC21ISP = lpc21isp ifndef LPC21ISP_PORT LPC21ISP_PORT = /dev/ttyS0 endif LPC21ISP_FLASHFILE = $(OBJDIR)/$(TARGET).hex # verbose output: #LPC21ISP_DEBUG = -debug # enter bootloader via RS232 DTR/RTS (only if hardware supports this # feature - see Philips AppNote): ifndef LPC21ISP_CONTROL LPC21ISP_CONTROL = # -control endif # --------------------------------------------------------------------------- # Flash-Programming support using lpc21iap by Martin Muller (usb bootloader) LPC21IAP = $(PAPARAZZI_SRC)/sw/ground_segment/lpc21iap/lpc21iap # --------------------------------------------------------------------------- # Flash-Programming support using openocd OOCD = openocd OOCD_INTERFACE = arm-usb-ocd OOCD_TARGET = csc # Define all object files. COBJ = $(SRC:%.c=$(OBJDIR)/%.o) AOBJ = $(ASRC:%.S=$(OBJDIR)/%.o) COBJARM = $(SRCARM:%.c=$(OBJDIR)/%.o) AOBJARM = $(ASRCARM:%.S=$(OBJDIR)/%.o) # Define all listing files. LST = $(ASRC:.S=.lst) $(ASRCARM:.S=.lst) $(SRC:.c=.lst) $(SRCARM:.c=.lst) # Compiler flags to generate dependency files. GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. $(CFLAGS) ALL_ASFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. all: sizebefore build sizeafter build: elf hex lss sym elf: $(OBJDIR)/$(TARGET).elf hex: $(OBJDIR)/$(TARGET).hex lss: $(OBJDIR)/$(TARGET).lss sym: $(OBJDIR)/$(TARGET).sym # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(OBJDIR)/$(TARGET).hex ELFSIZE = $(SIZE) -A $(OBJDIR)/$(TARGET).elf sizebefore: @if [ -f $(OBJDIR)/$(TARGET).elf ]; then echo; $(ELFSIZE); echo; fi sizeafter: @if [ -f $(OBJDIR)/$(TARGET).elf ]; then echo; $(ELFSIZE); echo; fi # Program the device. load upload program: $(OBJDIR)/$(TARGET).hex ifeq ($(FLASH_MODE),IAP) $(SUDO) $(LPC21IAP) $(OBJDIR)/$(TARGET).elf else ifeq ($(FLASH_MODE),JTAG) @echo -e " OOCD\t$<" $(Q)$(OOCD) -f interface/$(OOCD_INTERFACE).cfg \ -f board/$(OOCD_TARGET).cfg \ -c init \ -c "reset halt" \ -c "flash write_image erase $(OBJDIR)/$(TARGET).bin 0x08000000" \ -c reset \ -c shutdown else @echo $(LPC21ISP) $(LPC21ISP_CONTROL) $(LPC21ISP_DEBUG) $(LPC21ISP_FLASHFILE) $(LPC21ISP_PORT) $(LPC21ISP_BAUD) $(LPC21ISP_XTAL) endif # Create final output files (.hex, .eep) from ELF output file. # TODO: handling the .eeprom-section should be redundant %.hex: %.elf @echo OBJC $@ $(Q)$(OBJCOPY) -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. # testing: option -C %.lss: %.elf @echo OBJD $@ $(Q)$(OBJDUMP) -h -S -C $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo NM $@ $(Q)$(NM) -n $< > $@ # Link: create ELF output file from object files. .SECONDARY : $(OBJDIR)/$(TARGET).elf .PRECIOUS : $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) %.elf: $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) @echo LD $@ $(Q)$(CC) $(THUMB) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) --output $@ $(LDFLAGS) $($(TARGET).LDFLAGS) # Compile: create object files from C source files. ARM-only $(OBJDIR)/%.o : %.c $(OBJDIR)/../Makefile.ac @echo CC $@ $(Q)test -d $(dir $@) || mkdir -p $(dir $@) $(Q)$(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ $(OBJDIR)/%.o : $(SRC_ARCH)/lpcusb/%.c $(OBJDIR)/../Makefile.ac @echo CC $@ $(Q)$(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ # grab files in var/$(AIRCRAFT)/$(TARGET) aka $(OBJDIR) #$(OBJDIR)/%.o : $(OBJDIR)/%.c # @echo CC $@ # $(Q)$(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ # Assemble: create object files from assembler source files. ARM/Thumb $(AOBJ) : $(OBJDIR)/%.o : %.S @echo AS $@ $(Q)$(CC) -c $(THUMB) $(ALL_ASFLAGS) $< -o $@ # Assemble: create object files from assembler source files. ARM-only $(AOBJARM) : $(OBJDIR)/%.o : $(SRC_ARCH)/%.S @echo AS $@ $(Q)$(CC) -c $(ALL_ASFLAGS) $< -o $@ # Target: clean project. clean: clean_list clean_list : @echo $(REMOVE) $(OBJDIR)/$(TARGET).hex $(REMOVE) $(OBJDIR)/$(TARGET).obj $(REMOVE) $(OBJDIR)/$(TARGET).elf $(REMOVE) $(OBJDIR)/$(TARGET).map $(REMOVE) $(OBJDIR)/$(TARGET).obj $(REMOVE) $(OBJDIR)/$(TARGET).a90 $(REMOVE) $(OBJDIR)/$(TARGET).sym $(REMOVE) $(OBJDIR)/$(TARGET).lnk $(REMOVE) $(OBJDIR)/$(TARGET).lss $(REMOVE) $(COBJ) $(REMOVE) $(AOBJ) $(REMOVE) $(COBJARM) $(REMOVE) $(AOBJARM) $(REMOVE) $(LST) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(SRCARM:.c=.s) $(REMOVE) $(SRCARM:.c=.d) $(REMOVE) .dep/* $(REMOVE) *~ # Listing of phony targets. .PHONY : all sizebefore sizeafter \ build elf hex lss sym clean clean_list program # # Dependencies # $(OBJDIR)/.depend: @echo DEPEND $@ @test -d $(OBJDIR) || mkdir -p $(OBJDIR) $(Q)$(CC) -MM -MG $(CFLAGS) $($(TARGET).srcs) | sed 's|\([^\.]*\.o\)|$(OBJDIR)/\1|' > $@ ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),erase) -include $(OBJDIR)/.depend endif endif