#
# CCDIRECTIVES .. directives to pass to C166 compiler
# LIDIRECTIVES .. directives to pass to L166 linker
+# LIN_FILE .. file containig directives to use when linking
# ASDIRECTIVES .. directives to pass to A166 assembler
+# STARTUP_CODE .. the name of an object file to be linked to all binaries (in config.omk)
# Rules for compilation of C, C++ and assembler sources using Keil's
# (X)C16x tools. For documentation see gcc snippet.
$(Q)rm -f $(USER_OBJS_DIR)/*.obj $(USER_OBJS_DIR)/*.lst
+FILTER_KEIL_OUTPUT = | sed -e '/COPYRIGHT KEIL/d' -e '/^[ \r\t]*$$$$/d'
+FILTER_KEIL_CC_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/C166 COMPIL/d'
+FILTER_KEIL_LINKER_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/L166 LINKER/d' -e '/^".*",\?\r$$$$/,/\(L166 RUN COMPLETE\|ERROR\)/d'
+FILTER_KEIL_LIB_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/LIB166 LIBRARY/d'
+FILTER_KEIL_ASM_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/A166 MACRO AS/d' -e '/ASSEMBLY COMPLETE/d'
+
define COMPILER_DEFS_template
CC = c166
CXX = ec166
# Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
define COMPILE_c_o_template
-$(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
+$(2): $(1) $$(GEN_HEADERS)
@$(QUIET_CMD_ECHO) " CC $$@"
# Export include paths in an environment variable
$(Q)export C166INC=`echo '$$(shell cygpath -w $$(subst -I,,$$(DEFAULT_INCLUDES)))'|sed -e "s/ \+/;/g"`; \
- $$(c_o_COMPILE) $(3) '$$(shell cygpath -w $$<)' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(CCDIRECTIVES)'; \
+ $$(c_o_COMPILE) $(3) '$$(shell cygpath -w $$<)' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(CCDIRECTIVES)' $(FILTER_KEIL_CC_OUTPUT); \
EL=$$$$?; if [ $$$$EL -le 1 ] ; then touch "$$@.d" ; \
else echo ERRORLEVEL $$$$EL ; exit 1; \
fi
# Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
define COMPILE_cc_o_template
-$(2): $(1) $(LOCAL_CONFIG_H)
+$(2): $(1) $$(GEN_HEADERS)
@$(QUIET_CMD_ECHO) " CXX $$@"
$(Q) echo "C++ compilation not suported for this compiler"
endef
# Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
define COMPILE_S_o_template
-$(2): $(1) $(LOCAL_CONFIG_H)
- @$(QUIET_CMD_ECHO) " ASM $$@"
- $(Q)$$(AS) '$$(shell cygpath -w $(1))' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(ASDIRECTIVES)'
+$(2): $(1) $$(GEN_HEADERS)
+ @$(QUIET_CMD_ECHO) " ASM $$@"
+ $(Q)$$(AS) '$$(shell cygpath -w $(1))' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(ASDIRECTIVES)' $(FILTER_KEIL_ASM_OUTPUT); \
+ EL=$$$$?; if [ $$$$EL -le 1 ] ; then touch "$$@.d" ; \
+ else echo ERRORLEVEL $$$$EL ; exit 1; \
+ fi
endef
define PROGRAM_template
$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
-$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%$(ASM_EXT)=%$(OBJ_EXT)))
$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
$(1)_OBJS := $$(sort $$($(1)_OBJS))
# $$(LI) $$($(1)_OBJS) $$(LOADLIBES)
-$(2)/$(1): $$($(1)_OBJS)
- @$(QUIET_CMD_ECHO) " LINK $$@"
+$(2)/$(1): $$($(1)_OBJS) $$(LIN_FILE:%=$$(USER_LIB_DIR)/%)
+ @$(QUIET_CMD_ECHO) " LINK $$(@:$(MAKERULES_DIR)/%=%)"
$(Q) \
- LI_FILES='$$(shell cygpath -w $$($(1)_OBJS) \
- $$(lib_LOADLIBES:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)) \
- $$($(1)_LIBS:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)))'; \
- $$(LI) $$$${LI_FILES// /,} TO '$$(shell cygpath -w $$@)' '$$(LIDIRECTIVES)'; \
+ cygpath -w $$($(1)_OBJS) \
+ $$(lib_LOADLIBES:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)) \
+ $$($(1)_LIBS:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)) \
+ $$(STARTUP_CODE:%=$$(USER_LIB_DIR)/%)\
+ | sed -e 's/\(.*\)/"\1"/' -e '$$$$! s/$$$$/,/' > $(1).lnp; \
+ echo TO '$$(shell cygpath -w $$@)' >> $(1).lnp; \
+ echo '$$(LIDIRECTIVES)' >> $(1).lnp; \
+ if [[ "$$(LIN_FILE)" ]]; then cat $$(USER_LIB_DIR)/$$(LIN_FILE) >> $(1).lnp; fi; \
+ $$(LI) @$(1).lnp $(FILTER_KEIL_LINKER_OUTPUT); \
EL=$$$$?; if [ $$$$EL -gt 1 ]; then echo ERRORLEVEL $$$$EL ; exit 1; fi
endef
define LIBRARY_template
$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
-$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%$(ASM_EXT)=%$(OBJ_EXT)))
$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
$(1)_OBJS := $$(sort $$($(1)_OBJS))
USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
$(USER_LIB_DIR)/$(LIB_PREF)$(1)$(LIB_EXT): $$($(1)_OBJS)
- @$(QUIET_CMD_ECHO) " AR $$@"
+ @$(QUIET_CMD_ECHO) " AR $$(@:$(MAKERULES_DIR)/%=%)"
$(Q) \
rm -f $$@; \
S='$$^'; \
L='$$(shell cygpath -w "$$@")'; \
- $(AR) CREATE $$$$L; \
- $(AR) ADD $$$${S// /,} TO $$$$L
+ $(AR) CREATE $$$$L $(FILTER_KEIL_LIB_OUTPUT); \
+ $(AR) ADD $$$${S// /,} TO $$$$L $(FILTER_KEIL_LIB_OUTPUT)
@touch $(USER_LIB_DIR)/timestamp
endef