]> rtime.felk.cvut.cz Git - omk.git/blob - snippets/keil16x.omk
Replace AM_ variables with OMK_ ones
[omk.git] / snippets / keil16x.omk
1 #                   This version uses Keil XC16x/C16x tools under Cygwin
2 #
3 #
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)
9
10 # Rules for compilation of C, C++ and assembler sources using Keil's
11 # (X)C16x tools. For documentation see gcc snippet.
12
13 clean-local::
14         $(Q)rm -f $(USER_OBJS_DIR)/*.obj $(USER_OBJS_DIR)/*.lst
15
16
17 FILTER_KEIL_OUTPUT = | $(SED4OMK) -e '/COPYRIGHT KEIL/d' -e '/^[ \r\t]*$$$$/d'
18 FILTER_KEIL_CC_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/C166 COMPIL/d'
19 FILTER_KEIL_LINKER_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/L166 LINKER/d' -e '/^".*",\?\r$$$$/,/\(L166 RUN COMPLETE\|ERROR\)/d'
20 FILTER_KEIL_LIB_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/LIB166 LIBRARY/d'
21 FILTER_KEIL_ASM_OUTPUT = $(FILTER_KEIL_OUTPUT) -e '/A166 MACRO AS/d' -e '/ASSEMBLY COMPLETE/d'
22
23 define COMPILER_DEFS_template
24 CC = c166
25 CXX = ec166
26 OBJ_EXT = .obj
27 LIB_EXT = .lib
28 LIB_PREF =
29 ASM_EXT = .a66
30 AR = lib166
31 AS = a166
32 HC = oh166
33 LI = l166
34
35 ifndef DEFAULT_INCLUDES
36 override DEFAULT_INCLUDES = $$(INCLUDES) -I $$(INCLUDE_DIR) -I $$(SOURCES_DIR) \
37   $$(shell echo $$$${C166INC} | $(SED4OMK) -e 's/;/ -I /g' -e 's/^\(.\)/-I \1/')
38 endif
39 #$$(warning DEFAULT_INCLUDES = $$(DEFAULT_INCLUDES))
40
41
42 c_o_COMPILE = $$(CC) #$$(DEFS) $$(OMK_CPPFLAGS)
43
44 cc_o_COMPILE = $$(CXX) #$$(DEFS) $$(OMK_CPPFLAGS) 
45
46 endef # COMPILER_DEFS_template
47
48 # Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
49 define COMPILE_c_o_template
50 $(2): $(1) $$(GEN_HEADERS)
51         @$(QUIET_CMD_ECHO) "  CC      $$@"
52 # Export include paths in an environment variable
53         $(Q)export C166INC=`echo '$$(shell cygpath -w $$(subst -I,,$$(DEFAULT_INCLUDES)))'|$(SED4OMK) -e "s/ \+/;/g"`; \
54         $$(c_o_COMPILE) $(3) '$$(shell cygpath -w $$<)' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(CCDIRECTIVES)' $(FILTER_KEIL_CC_OUTPUT); \
55         EL=$$$$?; if [ $$$$EL -le 1 ] ; then touch "$$@.d" ; \
56         else echo ERRORLEVEL $$$$EL ; exit 1; \
57         fi
58 # To generate assembler add this to the directives above: 'SRC($$(@:%$$(OBJ_EXT)=%.asm))' 
59 endef
60
61
62 # Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
63 define COMPILE_cc_o_template
64 $(2): $(1) $$(GEN_HEADERS)
65         @$(QUIET_CMD_ECHO) "  CXX     $$@"
66         $(Q) echo "C++ compilation not suported for this compiler"
67 endef
68
69 # Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
70 define COMPILE_S_o_template
71 $(2): $(1) $$(GEN_HEADERS)
72         @$(QUIET_CMD_ECHO) "  ASM     $$@"
73         $(Q)$$(AS) '$$(shell cygpath -w $(1))' 'OBJECT($$@)' 'PRINT($$(@:%$$(OBJ_EXT)=%.lst))' '$$(ASDIRECTIVES)' $(FILTER_KEIL_ASM_OUTPUT); \
74         EL=$$$$?; if [ $$$$EL -le 1 ] ; then touch "$$@.d" ; \
75         else echo ERRORLEVEL $$$$EL ; exit 1; \
76         fi
77 endef
78
79
80 # Syntax: $(call PROGRAM_template,<executable-name>,<dir>,<link-variant>)
81 define PROGRAM_template
82 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
83 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
84 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%$(ASM_EXT)=%$(OBJ_EXT)))
85 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
86 $(1)_OBJS := $$(sort $$($(1)_OBJS))
87
88 USER_OBJS  += $$($(1)_OBJS)
89 SOURCES += $$($(1)_SOURCES)
90 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
91
92 $(2)/$(1): $(USER_LIB_DIR)/timestamp
93
94
95 #       $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
96 #         then echo $$(CC)  $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) ; \
97 #         else echo $$(CXX) $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CXXFLAGS) $$(CXXFLAGS) ; fi) \
98 #         $$(OMK_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
99 #         -o $(2)/$(1)
100 #       $(HC) $(2)/$(1) >$(2)/$(1).hex
101
102 #         $$(LI) $$($(1)_OBJS) $$(LOADLIBES)
103
104 $(2)/$(1): $$($(1)_OBJS) $$(LIN_FILE:%=$$(USER_LIB_DIR)/%)
105         @$(QUIET_CMD_ECHO) "  LINK    $$(@:$(MAKERULES_DIR)/%=%)"
106         $(Q) \
107           cygpath -w $$($(1)_OBJS) \
108                      $$(lib_LOADLIBES:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)) \
109                      $$($(1)_LIBS:%=$$(USER_LIB_DIR)/%$$(LIB_EXT)) \
110                      $$(STARTUP_CODE:%=$$(USER_LIB_DIR)/%)\
111             | $(SED4OMK) -e 's/\(.*\)/"\1"/' -e '$$$$! s/$$$$/,/' > $(1).lnp; \
112           echo TO '$$(shell cygpath -w $$@)' >> $(1).lnp; \
113           echo '$$(LIDIRECTIVES)' >> $(1).lnp; \
114           if [[ "$$(LIN_FILE)" ]]; then cat $$(USER_LIB_DIR)/$$(LIN_FILE) >> $(1).lnp; fi; \
115           $$(LI) @$(1).lnp $(FILTER_KEIL_LINKER_OUTPUT); \
116           EL=$$$$?; if [ $$$$EL -gt 1 ]; then echo ERRORLEVEL $$$$EL ; exit 1; fi
117 endef
118
119
120
121 # Syntax: $(call LIBRARY_template,<library-name>)
122 define LIBRARY_template
123 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
124 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
125 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%$(ASM_EXT)=%$(OBJ_EXT)))
126 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
127 $(1)_OBJS := $$(sort $$($(1)_OBJS))
128
129 USER_OBJS  += $$($(1)_OBJS)
130 SOURCES += $$($(1)_SOURCES)
131 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
132
133 $(USER_LIB_DIR)/$(LIB_PREF)$(1)$(LIB_EXT): $$($(1)_OBJS)
134         @$(QUIET_CMD_ECHO) "  AR      $$(@:$(MAKERULES_DIR)/%=%)"
135         $(Q) \
136         rm -f $$@; \
137         S='$$^'; \
138         L='$$(shell cygpath -w "$$@")'; \
139         $(AR) CREATE $$$$L $(FILTER_KEIL_LIB_OUTPUT); \
140         $(AR) ADD $$$${S// /,} TO $$$$L $(FILTER_KEIL_LIB_OUTPUT)
141         @touch $(USER_LIB_DIR)/timestamp
142 endef
143
144 # Hack: Unfortunately, USER_LIB_DIR is set later and the rule below would not work.
145 USER_LIB_DIR := $(MAKERULES_DIR)/_compiled/lib
146
147 $(USER_LIB_DIR)/timestamp:
148         $(Q)touch $@