Update for power management (sleep and power down) support.
[lpc82x] / Makefile
1 # Makefile for LPC82x 
3 TARGET_DIR = apps/$(MODULE)/$(NAME)
5 LPC = lpc82x
6 CPU = cortex-m0
7 ARCH = armv6-m
9 CROSS_COMPILE ?= arm-none-eabi-
10 CC = $(CROSS_COMPILE)gcc
11 #DEBUG = -g
12 LD_DEBUG = $(DEBUG)
13 FOPTS = -fno-builtin -ffunction-sections -fdata-sections -ffreestanding
14 CFLAGS = -Wall -O2 $(DEBUG) -mthumb -mcpu=$(CPU) $(FOPTS)
15 LDFLAGS = -static $(LD_DEBUG) -nostartfiles -nostdlib -Tlpc_link_$(LPC).ld \
16                    -Wl,--gc-sections -Wl,--build-id=none \
17                    -Wl,-Map=$(TARGET_DIR)/lpc_map_$(LPC).map
20 APPS = $(subst apps/,,$(wildcard apps/*/*))
22 .PHONY: all $(APPS)
23 all: $(APPS)
25 INCLUDES = include/
26 TARGET_INCLUDES = $(TARGET_DIR)/
27 OBJDIR = objs
29 SRC = $(wildcard */*.c)
30 SRC += $(wildcard lib/*/*.c)
31 SRC += $(wildcard lib/protocols/*/*.c)
32 OBJS = ${SRC:%.c=${OBJDIR}/%.o}
33 DEPS = ${OBJS:%.o=$(OBJDIR)/%.d}
35 NAME_SRC = $(wildcard $(TARGET_DIR)/*.c)
36 NAME_OBJS = ${NAME_SRC:%.c=${OBJDIR}/%.o}
37 NAME_DEPS = ${NAME_OBJS:%.o=$(OBJDIR)/%.d}
39 -include $(DEPS) $(NAME_DEPS)
41 .SECONDARY: $(OBJS) $(NAME_OBJS)
42 .PRECIOUS: %.elf
43 %.elf: $(OBJS) $(NAME_OBJS)
44         @echo "Linking $(MODULE)/$(NAME) ..."
45         @$(CC) $(LDFLAGS) $(OBJS) $(NAME_OBJS) -o $@
47 %.bin: %.elf
48         @echo "Creating image : \e[32m$@\e[39m"
49         @$(CROSS_COMPILE)objcopy -R .stack -R .bss -O binary $^ $@
50         @ls -l $@
51         @$(CROSS_COMPILE)size $^
52         @echo Done.
54 ${OBJDIR}/%.o: %.c
55         @mkdir -p $(dir $@)
56         @echo "-- compiling" $<
57         @$(CC) -MMD -MP -MF ${OBJDIR}/$*.d $(CFLAGS) $< -c -o $@ -I$(INCLUDES) -I$(TARGET_INCLUDES)
60 $(APPS):
61         @make --no-print-directory MODULE=$(shell dirname $@) NAME=$(shell basename $@) apps/$(shell dirname $@)/$(shell basename $@)/$(shell basename $@).bin
63 all_apps: $(APPS)
65 clean:
66         rm -rf $(OBJDIR)
68 mrproper: clean
69         rm -f apps/*/*/*.bin apps/*/*/*.elf apps/*/*/*.map
72 # Some notes :
73 # The command "make -f /path/to/here/Makefile module/app_name" does not work, as well
74 # as the command "make -f /path/to/here/apps/module/app_name/Makefile".
75 # This could be solved in the app Makefiles by replacing
76 #   "NAME = $(shell basename $(CURDIR))"
77 # with
78 #   "NAME = $(shell basename $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))"
79 # and possibly some similar trick for the base Makefile but this is just
80 # unreadable and moslty unusefull, so it won't be supported.
81 # Use "make -C /path/to/here/ module/app_name" or "make -C /path/to/here/apps/module/app_name"
82 # instead.