Makefile help please :-(

Hi All…

I am trying to create a makefile for a project. I run Arduino 1.0 on Windows. I found a makefile here:

And have been modifying it. At this point, it can successfully build a simple sketch that has one source module and emit a HEX file. So far so good. Then it gets dicy. My project has a bunch of files, and it can’t seem to find the include files. As I understand it, this file emulates the Arduino environment by generating a main.cpp file in an applet subdirectory, then compiles that cpp file. That’s fine for now, although later I’ll want to modify that behavior by providing my own main.cpp. This is because when it concatenates the cpp files, the compiler gives me warnings and errors at line numbers that are wrong.

Anyhow, I have tried modifying the makefile to add -I. and -I… to the lines that specify where to search for includers. No luck. The first few errors are:

applet/main.cpp:6:23: error: constants.h: No such file or directory
applet/main.cpp:14:17: error: I2C.h: No such file or directory
applet/main.cpp:18:19: error: SdFat.h: No such file or directory
applet/main.cpp:19:40: error: SdFatUtil.h: No such file or directory
applet/main.cpp:37:94: error: Bounce.h: No such file or directory

Here is the make file:

TARGET = $(notdir $(CURDIR))
# Change this to match your arduino installation directory
INSTALL_DIR = c:/Users/jim/Desktop/arduino-1.0
UPLOAD_RATE = 115200
MCU = atmega1284p
F_CPU = 16000000

ARDUINO = $(INSTALL_DIR)/hardware/maniacbug-mighty-1284p-8f335f8/cores/standard
VARIANTS = $(INSTALL_DIR)/hardware/maniacbug-mighty-1284p-8f335f8/variants/avr_developers
AVR_TOOLS_PATH = c:/WinAVR-20100110/bin
AVRDUDE_PATH = $(INSTALL_DIR)/hardware/tools

#Note that if your program has dependencies other than those
#already listed below, you will need to add them accordingly.
$(ARDUINO)/wiring_pulse.c \
$(ARDUINO)/wiring_analog.c \
$(ARDUINO)/wiring.c \
$(ARDUINO)/wiring_digital.c \
$(ARDUINO)/WInterrupts.c \
$(ARDUINO)/wiring_shift.c \

$(ARDUINO)/Tone.cpp \
$(ARDUINO)/WMath.cpp \
$(ARDUINO)/Print.cpp \
$(ARDUINO)/HardwareSerial.cpp \
$(ARDUINO)/CDC.cpp \
$(ARDUINO)/HID.cpp \
$(ARDUINO)/IPAddress.cpp \
$(ARDUINO)/new.cpp \
$(ARDUINO)/Stream.cpp \
$(ARDUINO)/USBCore.cpp \
$(ARDUINO)/WMath.cpp \
$(ARDUINO)/WString.cpp \
$(ARDUINO)/main.cpp \

CXX_MODULES += $(shell find $(ARDUINO_LIB)  -maxdepth 2 -mindepth 2 -type f -name *.cpp -exec /bin/echo -n " {}" \;)

CXX_APP = main.cpp
FORMAT = ihex

# Name of this Makefile (used for "make depend").
MAKEFILE = Makefile

# Debugging format.
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
#DEBUG = stabs

OPT = s

# Place -D or -U options here

# Place -I options here

CINCS += $(shell find $(ARDUINO_LIB) -mindepth 1 -maxdepth 2 -type d ! -name examples -exec /bin/echo -n " -I{} " \;)
CXXINCS += $(shell find $(ABDUINO_LIB) -mindepth 1 -maxdepth 2 -type d ! -name examples -exec /bin/echo -n " -I{} " \;)

# Compiler flag to set the C Standard level.
# c89   - "ANSI" C
# gnu89 - c89 plus GCC extensions
# c99   - ISO C99 standard (not yet fully implemented)
# gnu99 - c99 plus GCC extensions
#CSTANDARD = -std=gnu99
#CWARN = -Wall -Wstrict-prototypes
#CWARN = -Wall   # show all warnings
CWARN = -w #suppress all warnings
####CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CTUNING = -ffunction-sections -fdata-sections
CXXTUNING = -fno-exceptions -ffunction-sections -fdata-sections
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)

#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
LDFLAGS = -O$(OPT) -lm -Wl,--gc-sections

# Programming support using avrdude. Settings and variables.
AVRDUDE_WRITE_FLASH = -U flash:w:applet/main.hex

AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avrdude.conf \

# Program settings
CC = $(AVR_TOOLS_PATH)/avr-gcc
CXX = $(AVR_TOOLS_PATH)/avr-g++
LD = $(AVR_TOOLS_PATH)/avr-gcc
OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
AR  = $(AVR_TOOLS_PATH)/avr-ar
SIZE = $(AVR_TOOLS_PATH)/avr-size
NM = $(AVR_TOOLS_PATH)/avr-nm
REMOVE = rm -f
MV = mv -f

# Define all object files.
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)

# Define all listing files.
LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_ASFLAGS = -x assembler-with-cpp $(ASFLAGS) -mmcu=$(MCU)

# Default target.
all: applet_files build sizeafter

build: elf hex

	test -d applet || mkdir applet
	echo '#include "Arduino.h"' > applet/main.cpp
	cat $(TARGET).ino >> applet/main.cpp
	cat $(ARDUINO)/main.cpp >> applet/main.cpp
	$(CXX) -c $(ALL_CXXFLAGS) applet/main.cpp -o applet/main.o

elf: applet/main.elf
hex: applet/main.hex
eep: applet/main.eep
lss: applet/main.lss
sym: applet/main.sym

# Program the device.
upload: applet/main.hex

	# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) applet/main.hex
ELFSIZE = $(SIZE)  applet/main.elf
	@if [ -f applet/main.elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi

	@if [ -f applet/main.elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi

# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000

coff: applet/main.elf
	$(COFFCONVERT) -O coff-avr applet/main.elf main.cof

extcoff: main.elf
	$(COFFCONVERT) -O coff-ext-avr applet/main.elf main.cof

.SUFFIXES: .elf .hex .eep .lss .sym

	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

	$(OBJCOPY) -O $(FORMAT) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
	--no-change-warnings \
	--change-section-lma .eeprom=0 $< $@

# Create extended listing file from ELF output file.
	$(OBJDUMP) -h -S $< > $@

# Create a symbol table from ELF output file.
	$(NM) -n $< > $@

# Link: create ELF output file from library.
#applet/$(TARGET).elf: $(TARGET).pde applet/core.a
applet/main.elf: applet/main.o applet/core.a
	$(LD) $(ALL_LDFLAGS) -o $@ applet/main.o applet/core.a

applet/core.a: $(OBJ_MODULES)
	@for i in $(OBJ_MODULES); do echo $(AR) rcs applet/core.a $i; $(AR) rcs applet/core.a $i; done

# Compile: create object files from C++ source files.
	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@

# Compile: create object files from C source files.
	$(CC) -c $(ALL_CFLAGS) $< -o $@

# Compile: create assembler files from C source files.
	$(CC) -S $(ALL_CFLAGS) $< -o $@

# Assemble: create object files from assembler source files.
	$(CC) -c $(ALL_ASFLAGS) $< -o $@

# Automatic dependencies
%.d: %.c
	$(CC) -M $(ALL_CFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@

%.d: %.cpp
	$(CXX) -M $(ALL_CXXFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@

# Target: clean project.
	$(REMOVE) applet/main.hex applet/main.eep applet/main.cof applet/main.elf \
	applet/ applet/main.sym applet/main.o applet/main.lss applet/core.a \
	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) \

.PHONY:	all build elf hex eep lss sym program coff extcoff clean applet_files sizebefore sizeafter

#include $(SRC:.c=.d)
#include $(CXXSRC:.cpp=.d)