# # MSP430 libc # VERSION = 20090126 # installation prefix (set this if you don't install by hand) ifndef PREFIX PREFIX = /usr/local/msp430 endif # name of target architecture (used for conform naming) target = msp430 prefix_target = $(PREFIX)/${target} bindir = $(PREFIX)/bin includedir = ${prefix_target}/include libdir = ${prefix_target}/lib SRC_ROOT := . BUILD_ROOT = ./Build override CC = ${bindir}/msp430-gcc override AS = ${bindir}/msp430-gcc -x assembler-with-cpp override AR = ${bindir}/msp430-ar RM = rm MD = mkdir -p $@ INSTALL = install -c -m644 $^/ COMMON := $(LIB_OPTIONS) # make sure we can find our header files (not the installed ones) COMMON += -I$(SRC_ROOT)/../include COMMON += -I$(SRC_ROOT) override ASFLAGS = $(COMMON) ASFLAGS += -Wa,-gdwarf-2 #ASFLAGS += -Wa,-ahlmsd=$(<:.S=.lst) #ASFLAGS += -v override CFLAGS = $(COMMON) CFLAGS += -Wall -Os -gdwarf-2 # further declaration... SRCDIRS = . ifdef gnu SRCDIRS += gnu else SRCDIRS = bsd endif SRCDIRS += stdlib SRCDIRS += string SRCDIRS += libm VPATH := $(addprefix $(SRC_ROOT)/, $(SRCDIRS)) all: build print: @$(CC) --print-multi-lib build: build-crt build-multilib install: install-crt install-headers install-multilib clean: ${RM} -rf $(BUILD_ROOT) .PHONY: clean clean-crt clean-multilib #--------- crt --------------------------------------- BUILDDIR := $(BUILD_ROOT) MCU_MSP_LIST := $(strip $(shell $(CC) --target-help | sed -n '/Known MCU names/,/no/p' | sed -n '/msp430/p' 2>/dev/null)) MCU_CC430_LIST := $(strip $(shell $(CC) --target-help | sed -n '/Known MCU names/,/no/p' | sed -n '/cc430/p' 2>/dev/null)) CRT_MSP_OBJS := $(addprefix $(BUILDDIR)/, $(addsuffix .o,$(subst msp,crt,$(MCU_MSP_LIST)))) CRT_CC430_OBJS := $(addprefix $(BUILDDIR)/, $(addsuffix .o,$(subst cc430,crtcc430,$(MCU_CC430_LIST)))) # match by name $(CRT_MSP_OBJS): $(BUILDDIR)/crt%.o: gcrt0.S stdlib/__low_level_init.S ${AS} $(ASFLAGS) $(subst crt, -mmcu=msp, $(subst .o,,$(notdir $@))) -c $< -o $@ $(CRT_CC430_OBJS): $(BUILDDIR)/crt%.o: gcrt0.S stdlib/__low_level_init.S ${AS} $(ASFLAGS) $(subst crtcc, -mmcu=cc, $(subst .o,,$(notdir $@))) -c $< -o $@ CRT_OBJS := $(CRT_MSP_OBJS) $(CRT_CC430_OBJS) crt: build-crt install-crt build-crt: makedir-crt $(CRT_OBJS) clean-crt: ${RM} -f $(CRT_OBJS) install-crt: $(CRT_OBJS) ${libdir} ${INSTALL} makedir-crt: mkdir -p $(BUILDDIR) #------- multilib -------- multilib: build-multilib install-multilib build-multilib: for i in `$(CC) --print-multi-lib 2>/dev/null`; do \ dir=`echo $$i | sed -e 's/;.*$$//'` ; \ options=`echo $$i | sed -e 's/[^@]*//' -e 's/@/ -/g'`; \ $(MAKE) "MULTILIB_DIR=$$dir" "LIB_OPTIONS=$$options" build-libc build-libm ; \ done; install-multilib: for i in `$(CC) --print-multi-lib 2>/dev/null`; do \ dir=`echo $$i | sed -e 's/;.*$$//'` ; \ mkdir -p $(libdir)/$$dir; \ $(MAKE) MULTILIB_DIR="$$dir" install-libc install-libm ; \ done; .PHONY: clean-multilib clean-libc clean-libm clean-multilib: for i in `$(CC) --print-multi-lib 2>/dev/null`; do \ dir=`echo $$i | sed -e 's/;.*$$//'` ; \ $(MAKE) "MULTILIB_DIR=$$dir" clean-libc clean-libm; \ done; #--------------- headers --------------- install-headers: ins-hr ins-hs ins-msp430 ins-hr: $(wildcard $(SRC_ROOT)/../include/*.h) ${includedir} ${INSTALL} ins-hs: $(wildcard $(SRC_ROOT)/../include/sys/*.h) ${includedir}/sys ${INSTALL} ins-msp430: $(wildcard $(SRC_ROOT)/../include/msp430/*.h) ${includedir}/msp430 ${INSTALL} fix-limits: $(wildcard $(SRC_ROOT)/../include/limits.h) ${includedir}/../../lib/gcc-lib/msp430/3.0/include ${INSTALL} #--------------- directories --------------- $(includedir) $(includedir)/sys $(includedir)/msp430: $(MD) #------------------------------------------------------------------------ #------------------------------------------------------------------------ #------------------------------------------------------------------------ #--------------- libc ------------------------ BUILDDIR=$(BUILD_ROOT)/$(subst .,msp1,$(MULTILIB_DIR)) LIBC = $(BUILDDIR)/libc.a libc_c_sources = abs.c atol.c bsearch.c errno.c labs.c \ _init_section__.c malloc.c atoi.c strtol.c strtoul.c \ sprintf.c snprintf.c vsprintf.c vsnprintf.c \ printf.c vprintf.c vuprintf.c uprintf.c puts.c \ rand.c itoa.c ltoa.c utoa.c ultoa.c libc_asm_sources = abort.S div.S exit.S ldiv.S setjmp.S \ __do_clear_bss.S __do_copy_data.S __do_global_ctors.S \ __do_global_dtors.S __init_stack.S __jump_to_main.S \ __stop_progexec__.S _reset_vector__.S \ _unexpected_.S libc_str_sources = \ isascii.c memccpy.c strchr.c strncat.c swab.c \ isblank.c memchr.c strcmp.c strncmp.c toascii.c \ bcmp.c iscntrl.c memcmp.c strcpy.c strncpy.c tolower.c \ bcopy.c isdigit.c memcpy.c strcspn.c strpbrk.c toupper.c \ bzero.c islower.c memmove.c strdup.c strrchr.c \ ffs.c isprint.c memset.c strlcat.c strsep.c \ index.c isspace.c rindex.c strlcpy.c strspn.c \ isalnum.c isupper.c strcasecmp.c strlen.c strstr.c \ isalpha.c isxdigit.c strcat.c strncasecmp.c strtok.c \ ispunct.c LIBC_OBJS = $(addprefix $(BUILDDIR)/,$(libc_str_sources:.c=.o) $(libc_c_sources:.c=.o) $(libc_asm_sources:.S=.o) ) build-libc: create_libdir $(LIBC) create_libdir: mkdir -p $(BUILDDIR) $(BUILDDIR)/%.o: %.c ${CC} -c $(CFLAGS) $< -o $@ $(BUILDDIR)/%.o: %.S ${AS} -c $(ASFLAGS) $< -o $@ $(LIBC): $(LIBC_OBJS) ${AR} rc $@ $? .PHONY: clean-libc clean-libc: ${RM} -f $(LIBC) $(LIBC_OBJS) install-libc: $(LIBC) $(libdir)/$(MULTILIB_DIR) ${INSTALL} #------------------------------------------------------------------------ #-------------- Math & FP libs --------------- math: build-libm basic_fp = divsf.c fixsfsi.c floatdisf.c gtsf.c mulsf.c \ addsf.c eqsf.c fixunssfdi.c floatsisf.c lesf.c negsf.c \ cmpsf.c fixsfdi.c fixunssfsi.c gesf.c ltsf.c subsf.c nesf.c fppfunc = ef_acos.c ef_hypot.c ef_remainder.c kf_sin.c sf_erf.c sf_isinf.c sf_rint.c \ ef_acosh.c ef_j0.c ef_scalb.c kf_tan.c sf_expm1.c sf_isnan.c sf_scalbn.c \ ef_asin.c ef_j1.c ef_sinh.c sf_asinh.c sf_fabs.c sf_ldexp.c sf_signif.c \ ef_atan2.c ef_jn.c ef_sqrt.c sf_atan.c sf_finite.c sf_log1p.c sf_sin.c \ ef_atanh.c ef_log.c erf_gamma.c sf_cbrt.c sf_floor.c sf_logb.c sf_tan.c \ ef_cosh.c ef_log10.c erf_lgamma.c sf_ceil.c sf_frexp.c sf_modf.c sf_tanh.c \ ef_exp.c ef_pow.c kf_cos.c sf_copysign.c sf_ilogb.c sf_nan.c \ ef_fmod.c ef_rem_pio2.c kf_rem_pio2.c sf_cos.c sf_infinity.c sf_nextafter.c LIBM = $(BUILDDIR)/libm.a LIBFP = $(BUILDDIR)/libfp.a LIBM_OBJS = $(addprefix $(BUILDDIR)/,$(notdir $(fppfunc:%.c=%.o))) LIBFP_OBJS = $(addprefix $(BUILDDIR)/,$(notdir $(basic_fp:%.c=%.o))) build-libm: create_libdir $(LIBM) $(LIBFP) $(LIBM): $(LIBM_OBJS) ${AR} rc $@ $? $(LIBFP): $(LIBFP_OBJS) ${AR} rc $@ $? install-libm: $(LIBM) $(LIBFP) $(libdir)/$(MULTILIB_DIR) ${INSTALL} clean-libm: ${RM} -f $(LIBM) $(LIBFP) $(LIBM_OBJS) $(LIBFP_OBJS)