1 # This version uses Keil XC16x/C16x tools under Cygwin
4 # CCDIRECTIVES .. directives to pass to C166 compiler
5 # LIDIRECTIVES .. directives to pass to L166 linker
6 # LIN_FILE .. file containig directives to use when linking
7 # ASDIRECTIVES .. directives to pass to A166 assembler
8 # STARTUP_CODE .. the name of an object file to be linked to all binaries (in config.omk)
10 # Rules for compilation of C, C++ and assembler sources using Keil's
11 # (X)C16x tools. For documentation see gcc snippet.
13 clean-local: clean-keil
16 $(Q)rm -f $(USER_OBJS_DIR)/*.obj $(USER_OBJS_DIR)/*.lst
19 FILTER_KEIL_OUTPUT = | sed -e '/COPYRIGHT KEIL/d' -e '/^[ \r\t]*$$$$/d'
20 FILTER_KEIL_CC_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/C166 COMPIL/d'
21 FILTER_KEIL_LINKER_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/L166 LINKER/d' -e '/^".*",\?\r$$$$/,/\(L166 RUN COMPLETE\|ERROR\)/d'
22 FILTER_KEIL_LIB_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/LIB166 LIBRARY/d'
23 FILTER_KEIL_ASM_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/A166 MACRO AS/d' -e '/ASSEMBLY COMPLETE/d'
25 define COMPILER_DEFS_template
37 ifndef DEFAULT_INCLUDES
38 override DEFAULT_INCLUDES = $$(INCLUDES) -I $$(INCLUDE_DIR) -I $$(SOURCES_DIR) \
39 $$(shell echo $$$${C166INC} | sed -e 's/;/ -I /g' -e 's/^\(.\)/-I \1/')
41 #$$(warning DEFAULT_INCLUDES = $$(DEFAULT_INCLUDES))
44 c_o_COMPILE = $$(CC) #$$(DEFS) $$(AM_CPPFLAGS)
46 cc_o_COMPILE = $$(CXX) #$$(DEFS) $$(AM_CPPFLAGS)
48 endef # COMPILER_DEFS_template
50 # Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
51 define COMPILE_c_o_template
52 $(2): $(1) $$(GEN_HEADERS)
53 @$(QUIET_CMD_ECHO) " CC $$@"
54 # Export include paths in an environment variable
55 $(Q)export C166INC=`echo '$$(shell cygpath -w $$(subst -I,,$$(DEFAULT_INCLUDES)))'|sed -e "s/ \+/;/g"`; \
56 $$(c_o_COMPILE) $(3) '$$(shell cygpath -w $$<)' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(CCDIRECTIVES)' $(FILTER_KEIL_CC_OUTPUT); \
57 EL=$$$$?; if [ $$$$EL -le 1 ] ; then touch "$$@.d" ; \
58 else echo ERRORLEVEL $$$$EL ; exit 1; \
60 # To generate assembler add this to the directives above: 'SRC($$(@:%$$(OBJ_EXT)=%.asm))'
64 # Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
65 define COMPILE_cc_o_template
66 $(2): $(1) $$(GEN_HEADERS)
67 @$(QUIET_CMD_ECHO) " CXX $$@"
68 $(Q) echo "C++ compilation not suported for this compiler"
71 # Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
72 define COMPILE_S_o_template
73 $(2): $(1) $$(GEN_HEADERS)
74 @$(QUIET_CMD_ECHO) " ASM $$@"
75 $(Q)$$(AS) '$$(shell cygpath -w $(1))' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(ASDIRECTIVES)' $(FILTER_KEIL_ASM_OUTPUT); \
76 EL=$$$$?; if [ $$$$EL -le 1 ] ; then touch "$$@.d" ; \
77 else echo ERRORLEVEL $$$$EL ; exit 1; \
82 # Syntax: $(call PROGRAM_template,<executable-name>,<dir>,<link-variant>)
83 define PROGRAM_template
84 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
85 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
86 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%$(ASM_EXT)=%$(OBJ_EXT)))
87 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
88 $(1)_OBJS := $$(sort $$($(1)_OBJS))
90 USER_OBJS += $$($(1)_OBJS)
91 SOURCES += $$($(1)_SOURCES)
92 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
94 $(2)/$(1): $(USER_LIB_DIR)/timestamp
97 # $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
98 # then echo $$(CC) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CFLAGS) $$(CFLAGS) ; \
99 # else echo $$(CXX) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CXXFLAGS) $$(CXXFLAGS) ; fi) \
100 # $$(AM_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
102 # $(HC) $(2)/$(1) >$(2)/$(1).hex
104 # $$(LI) $$($(1)_OBJS) $$(LOADLIBES)
106 $(2)/$(1): $$($(1)_OBJS) $$(LIN_FILE:%=$$(USER_LIB_DIR)/%)
107 @$(QUIET_CMD_ECHO) " LINK $$(@:$(MAKERULES_DIR)/%=%)"
109 cygpath -w $$($(1)_OBJS) \
110 $$(lib_LOADLIBES:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)) \
111 $$($(1)_LIBS:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)) \
112 $$(STARTUP_CODE:%=$$(USER_LIB_DIR)/%)\
113 | sed -e 's/\(.*\)/"\1"/' -e '$$$$! s/$$$$/,/' > $(1).lnp; \
114 echo TO '$$(shell cygpath -w $$@)' >> $(1).lnp; \
115 echo '$$(LIDIRECTIVES)' >> $(1).lnp; \
116 if [[ "$$(LIN_FILE)" ]]; then cat $$(USER_LIB_DIR)/$$(LIN_FILE) >> $(1).lnp; fi; \
117 $$(LI) @$(1).lnp $(FILTER_KEIL_LINKER_OUTPUT); \
118 EL=$$$$?; if [ $$$$EL -gt 1 ]; then echo ERRORLEVEL $$$$EL ; exit 1; fi
123 # Syntax: $(call LIBRARY_template,<library-name>)
124 define LIBRARY_template
125 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
126 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
127 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%$(ASM_EXT)=%$(OBJ_EXT)))
128 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
129 $(1)_OBJS := $$(sort $$($(1)_OBJS))
131 USER_OBJS += $$($(1)_OBJS)
132 SOURCES += $$($(1)_SOURCES)
133 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
135 $(USER_LIB_DIR)/$(LIB_PREF)$(1)$(LIB_EXT): $$($(1)_OBJS)
136 @$(QUIET_CMD_ECHO) " AR $$(@:$(MAKERULES_DIR)/%=%)"
140 L='$$(shell cygpath -w "$$@")'; \
141 $(AR) CREATE $$$$L $(FILTER_KEIL_LIB_OUTPUT); \
142 $(AR) ADD $$$${S// /,} TO $$$$L $(FILTER_KEIL_LIB_OUTPUT)
143 @touch $(USER_LIB_DIR)/timestamp