Base code for dtplug : Core, drivers, lib and some external drivers.
[dtplug] / Makefile
1 # Makefile for GPIO Demo Module
3 TARGET_DIR = apps/$(NAME)
5 LPC = lpc1764
6 CPU = cortex-m3
7 ARCH = armv6-m
9 #CROSS_COMPILE ?= arm-none-eabi-
10 CROSS_COMPILE ?= arm-linux-gnueabi-
11 CC = $(CROSS_COMPILE)gcc
12 FOPTS = -fno-builtin -ffunction-sections -fdata-sections -ffreestanding
13 CFLAGS = -Wall -O2 -mthumb -mcpu=$(CPU) $(FOPTS)
14 LINKOPTS = -static -nostartfiles -nostdlib \
15                    -Wl,--gc-sections -Wl,--build-id=none \
16                    -Wl,-Map=$(TARGET_DIR)/lpc_map_$(LPC).map -Tlpc_link_$(LPC).ld
19 APPS = $(subst apps/,,$(wildcard apps/*))
21 .PHONY: all $(APPS)
22 all: $(APPS)
24 INCLUDES = include/
25 TARGET_INCLUDES = $(TARGET_DIR)/
26 OBJDIR = objs
28 SRC = $(wildcard */*.c)
29 OBJS = ${SRC:%.c=${OBJDIR}/%.o}
30 DEPS = ${OBJS:%.o=$(OBJDIR)/%.d}
32 NAME_SRC = $(wildcard $(TARGET_DIR)/*.c)
33 NAME_OBJS = ${NAME_SRC:%.c=${OBJDIR}/%.o}
34 NAME_DEPS = ${NAME_OBJS:%.o=$(OBJDIR)/%.d}
36 -include $(DEPS) $(NAME_DEPS)
38 .SECONDARY: $(OBJS) $(NAME_OBJS)
39 .PRECIOUS: %.elf
40 %.elf: $(OBJS) $(NAME_OBJS)
41         @echo "Linking $(NAME) ..."
42         @$(CC) $(LINKOPTS) $(OBJS) $(NAME_OBJS) -o $@
44 %.bin: %.elf
45         @echo "Creating image : \e[32m$@\e[39m"
46         @$(CROSS_COMPILE)objcopy -R .stack -R .bss -O binary $^ $@
47         @ls -l $@
48         @echo Done.
50 ${OBJDIR}/%.o: %.c
51         @mkdir -p $(dir $@)
52         @echo "-- compiling" $<
53         @$(CC) -MMD -MP -MF ${OBJDIR}/$*.d $(CFLAGS) $< -c -o $@ -I$(INCLUDES) -I$(TARGET_INCLUDES)
56 $(APPS):
57         @make --no-print-directory NAME=$@ apps/$@/$@.bin
59 all_apps: $(APPS)
61 clean:
62         rm -rf $(OBJDIR)
64 mrproper: clean
65         rm -f apps/*/*.bin apps/*/*.elf apps/*/*.map
68 # Some notes :
69 # The command "make -f /path/to/here/Makefile app_name" does not work, as well
70 # as the command "make -f /path/to/here/apps/app_name/Makefile".
71 # This could be solved in the app Makefiles by replacing
72 #   "NAME = $(shell basename $(CURDIR))"
73 # with
74 #   "NAME = $(shell basename $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))"
75 # and possibly some similar trick for the base Makefile but this is just
76 # unreadable and moslty unusefull, so it won't be supported.
77 # Use "make -C /path/to/here/ app_name" or "make -C /path/to/here/apps/app_name"
78 # instead.