# # This makefile take each "at*" file, extracts it's part name # And compile it into an ELF binary. # It also disassemble it for debugging purposes. # # The code is compiled "optimized" to the max. # # The weird "-Wl,--undefined=_mmcu,--section-start=.mmcu=0x910000" # is used to tell the linker not to discard the .mmcu section, # otherwise the --gc-sections will delete it. # # Copyright 2008, 2009 Michel Pollet # # This file is part of simavr. # # simavr 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 3 of the License, or # (at your option) any later version. # # simavr 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 simavr. If not, see . # simavr directory SIMAVR := ${shell for p in . .. ../.. ../../..;do test -d $$p/simavr/sim && echo $$p/simavr; done} # You can override the build settings with local changes in this file # for example: # export CC=clang # export CFLAGS=-march=corei7-avx # etc -include ${wildcard ${SIMAVR}/../.make.options*} # get the first character of what the compiler says it is, unless it's 'x86_64' doh ARCH = ${shell $(CC) -dumpmachine | sed -e 's/^x/i/' -e 's/\(.\).*/\1/'} CFLAGS += -O2 -Wall CFLAGS += -g CORE_CFLAGS = -nostdinc ifeq (${shell uname}, Darwin) # gcc 4.2 from MacOS is really not up to scratch anymore CC = clang AVR_ROOT := "/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/" AVR_INC := ${AVR_ROOT}/avr-4/ AVR := ${AVR_ROOT}/bin/avr- # Thats for MacPorts libelf ifeq (${shell test -d /opt/local && echo Exists}, Exists) IPATH += /opt/local/include LFLAGS = -L/opt/local/lib/ endif else AVR_ROOT := /usr/lib/avr AVR_INC := ${AVR_ROOT} AVR := avr- # FIXME uname -o doesn't work on bsd derivatives #WIN := ${shell uname -o} ifeq (${WIN}, Msys) AVR_ROOT := ${shell echo "${AVR32_HOME}" | tr '\\' '/'} AVR_INC := ${AVR_ROOT}/avr AVR := ${AVR_ROOT}/bin/avr- IPATH += ${PREFIX}/include CFLAGS += -I${PREFIX}/include LDFLAGS += -L/lib -L/local/lib CFLAGS += -DNO_COLOR else CFLAGS += -fPIC endif endif CPPFLAGS += --std=gnu99 -Wall CPPFLAGS += ${patsubst %,-I%,${subst :, ,${IPATH}}} AVR_CPPFLAGS= ${CPPFLAGS} -idirafter ${AVR_INC}/include CC ?= clang AR ?= ar RANLIB ?= ranlib MKDIR ?= mkdir -p INSTALL ?= install SHELL := ${shell which bash} OBJ = obj-${shell $(CC) -dumpmachine} LIBDIR = ${shell pwd}/${SIMAVR}/${OBJ} LDFLAGS += -L${LIBDIR} -lsimavr LDFLAGS += -lelf ifeq (${WIN}, Msys) LDFLAGS += -lws2_32 endif ifeq (${shell uname}, Linux) ifeq ($(RELEASE),1) # allow the shared library to be found in the build directory # only for linking, the install time location is used at runtime LFLAGS += -Wl,-rpath-link,${LIBDIR} else # allow the shared library to be found in the build directory LFLAGS += -Wl,-rpath,${LIBDIR} endif endif # The code is compiled "optimized" to the max. # # The weird "-Wl,--undefined=_mmcu,--section-start=.mmcu=0x910000" # is used to tell the linker not to discard the .mmcu section, # otherwise the --gc-sections will delete it. %.hex: %.axf @${AVR}objcopy -j .text -j .data -j .eeprom -O ihex ${<} ${@} %.s: %.axf @${AVR}objdump -j .text -j .data -j .bss -d ${<} > ${@} # --mcall-prologues can be used here, but messes up debugging a little %.axf: %.c @echo AVR-CC ${<} @part=${<} ; part=$${part/_*}; \ ${AVR}gcc -Wall -gdwarf-2 -Os -std=gnu99 \ -mmcu=$$part \ -DF_CPU=8000000 \ -fno-inline-small-functions \ -ffunction-sections -fdata-sections \ -Wl,--relax,--gc-sections \ -Wl,--undefined=_mmcu,--section-start=.mmcu=0x910000 \ -I../simavr/sim/avr -I../../simavr/sim/avr \ ${^} -o ${@} @${AVR}size ${@}|sed '1d' # this rule has precedence ${OBJ}/sim_%.o : cores/sim_%.c ifeq ($(V),1) $(CC) $(CPPFLAGS) $(CFLAGS) $(CORE_CFLAGS) -MMD \ ${AVR_CPPFLAGS} \ $< -c -o $@ else @$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS) $(CORE_CFLAGS) -MMD \ ${AVR_CPPFLAGS} \ $< -c -o $@ @echo CORE $< endif ${OBJ}/%.o: %.c ifeq ($(V),1) $(CC) $(CPPFLAGS) $(CFLAGS) -MMD \ $< -c -o $@ else @$(CC) $(CPPFLAGS) $(CFLAGS) -MMD \ $< -c -o $@ @echo CC $< endif ${OBJ}/%.elf: ifeq ($(V),1) $(CC) -MMD ${CFLAGS} ${LFLAGS} -o $@ $^ $(LDFLAGS) else @echo LD $@ @$(CC) -MMD ${CFLAGS} ${LFLAGS} -o $@ $^ $(LDFLAGS) endif obj: ${OBJ} ${OBJ}: @mkdir -p ${OBJ} clean-${OBJ}: rm -rf ${OBJ} # include the dependency files generated by gcc, if any -include ${wildcard ${OBJ}/*.d}