Makefile 3.84 KB
Newer Older
1 2 3
# Configuration section
#
# Use environment variables if found, otherwise fallback to sane defaults
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

# If not explicitely selected (with 'make FPU=1'), compile for FPU emulation
ifeq ($(FPU),)
FPU=0
endif

# To be able to properly handle any combination of (FPU, LEON, release) 
# options, create a SUFFIX (see below) to differentiate output folders
ifeq ($(FPU),1)
FPU_SUFFIX=FPU
else
FPU_SUFFIX=NONFPU
endif

# Build up our settings from our inputs and our environment
19
LEON ?= leon3
20
RTEMS ?= /opt/rtems-4.11-2016.04.01.${FPU_SUFFIX}
21
RTEMS_MAKEFILE_PATH = ${RTEMS}/sparc-rtems4.11/${LEON}
22
RTEMS_LIB=${RTEMS_MAKEFILE_PATH}/lib
23
CROSS_PREFIX=sparc-rtems4.11
24

25 26 27 28
# If not selected, compile debug version of binary (no optimizations)
#ifeq ($(CFG),)
#CFG=debug
#endif
29 30

# The directories containing the source files, separated by ':'
31
#
32
# DEAR USER, YOU MUST EDIT THIS AND ADD YOUR SOURCE FOLDERS
33 34 35 36
VPATH=src

# Your source files: regardless of where they reside in the source tree,
# VPATH will locate them...
37 38 39
#
# DEAR USER, YOU MUST EDIT THIS
SRC= \
40
	init.c \
41
	task1.c \
42
	task2.c
43

44
SUFFIX=$(CFG).$(FPU_SUFFIX).$(LEON)
45 46 47

# Build a Dependency list and an Object list, by replacing the .c
# extension to .d for dependency files, and .o for object files.
48 49
DEP = $(patsubst %.c, deps.$(SUFFIX)/%.d, ${SRC})
OBJ = $(patsubst %.c, objs.$(SUFFIX)/%.o, ${SRC})
50 51

# Your final binary
52 53
#
# DEAR USER, YOU MUST EDIT THIS
54 55 56 57
TARGET=fputest

# What compiler to use for generating dependencies: 
# it will be invoked with -MM -MP
58
CC = ${RTEMS}/bin/${CROSS_PREFIX}-gcc
59 60 61 62 63 64 65
CDEP = ${CC}

# What include flags to pass to the compiler
INCLUDEFLAGS= -I src

# Compilation flags (common)
COMMON += -B${RTEMS_LIB} -specs bsp_specs -qrtems \
66
	  -mcpu=cypress -DBSP_${LEON} \
67 68 69 70 71 72
	  -ffunction-sections -fdata-sections -Wall \
	  -Wmissing-prototypes -Wimplicit-function-declaration \
	  -Wstrict-prototypes -Wnested-externs

# Separate compile options per configuration
ifeq ($(CFG),debug)
73
CFLAGS += ${COMMON} -g -Wall -D_DEBUG ${INCLUDEFLAGS}
74
else
75
CFLAGS += ${COMMON} -g -O2 -Wall ${INCLUDEFLAGS}
76 77
endif

78 79
# Should we generate native FPU instructions for the SRC or not?
ifeq ($(FPU),0)
80
CFLAGS += -msoft-float
81 82 83 84 85 86
LDFLAGS += -msoft-float
endif

# A common link flag for all configurations
LDFLAGS += ${COMMON} -Wl,--gc-sections

87
all:	inform bin.$(SUFFIX)/${TARGET}
88 89 90 91

inform:
ifneq ($(CFG),release)
ifneq ($(CFG),debug)
92 93 94
	@echo " "
	@echo "Invalid or missing configuration (CFG) "$(CFG)" specified."
	@echo " "
95
	@echo "You must specify a configuration when running make, e.g."
96 97 98 99 100 101 102 103
	@echo " "
	@echo "    make CFG=debug LEON=leon3 FPU=1 V=1"
	@echo " "
	@echo "- Possible choices for CFG are 'release' and 'debug'"
	@echo "- Possible choices for LEON are 'leon2' and 'leon3' (default)"
	@echo "- Possible choices for FPU are '1' (native) and '0' (emulated) (default)"
	@echo "- Possible choices for V are '1' (show commands) and '0' (silent) (default)"
	@echo " "
104 105 106 107 108
	@exit 1
endif
endif


109
bin.$(SUFFIX)/${TARGET}: ${OBJ} | inform
110 111 112 113 114 115 116 117 118 119 120
	@mkdir -p $(dir $@)
ifeq ($(V),1)
	$(CC) -g -o $@ $^ ${LDFLAGS}
else
	@echo [LD] $@
	@$(CC) -g -o $@ $^ ${LDFLAGS}
endif
ifeq ($(CFG),release)
	@${CROSS_PREFIX}-objcopy --only-keep-debug $@ ${@}.debug
	@${CROSS_PREFIX}-strip $@
endif
121
	@echo Built with RTEMS at ${RTEMS_LIB} for ${LEON}.
122

123
objs.$(SUFFIX)/%.o: %.c
124 125 126 127 128 129 130 131
	@mkdir -p $(dir $@)
ifeq ($(V),1)
	$(CC) -c $(CFLAGS) -o $@ $<
else
	@echo [CC] $@
	@$(CC) -c $(CFLAGS) -o $@ $<
endif

132
deps.$(SUFFIX)/%.d: %.c
133 134 135
	@mkdir -p $(dir $@)
	@echo Generating dependencies for $<
	@set -e ; $(CDEP) -MM -MP $(INCLUDEFLAGS) $< > $@.$$$$; \
136
	sed 's,\($*\)\.o[ :]*,objs.$(SUFFIX)\/\1.o $@ : ,g' < $@.$$$$ > $@; \
137 138 139
	rm -f $@.$$$$

clean:
140
	@rm -rf deps.* objs.* bin.*
141 142 143 144 145

# Unless "make clean" is called, include the dependency files
# which are auto-generated. Don't fail if they are missing
# (-include), since they will be missing in the first invocation!
ifneq ($(MAKECMDGOALS),clean)
146
ifneq ($(CFG),)
147
-include ${DEP}
148
endif
149
endif