]> rtime.felk.cvut.cz Git - omk.git/blobdiff - snippets/keil16x
Added links to snippets to devel-test directory
[omk.git] / snippets / keil16x
index 4a424fa1eb9dadc380b49ff1cf376516642f2a05..ea1943c7b621ef67daf62c763e2f7a3e9800188f 100644 (file)
@@ -1,10 +1,26 @@
-#                   This version uses Keil XC16x/C16x tools
+#                   This version uses Keil XC16x/C16x tools under Cygwin
 #
 #
+# 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.
 
+clean-local: clean-keil
+
+clean-keil:
+       $(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
@@ -12,7 +28,7 @@ CXX = ec166
 OBJ_EXT = .obj
 LIB_EXT = .lib
 LIB_PREF =
-ASM_EXT = .asm
+ASM_EXT = .a66
 AR = lib166
 AS = a166
 HC = oh166
@@ -22,49 +38,44 @@ ifndef DEFAULT_INCLUDES
 override DEFAULT_INCLUDES = $$(INCLUDES) -I $$(INCLUDE_DIR) -I $$(SOURCES_DIR) \
   $$(shell echo $$$${C166INC} | sed -e 's/;/ -I /g' -e 's/^\(.\)/-I \1/')
 endif
-$$(warning DEFAULT_INCLUDES = $$(DEFAULT_INCLUDES))
+#$$(warning DEFAULT_INCLUDES = $$(DEFAULT_INCLUDES))
 
 
-c_o_COMPILE = $$(CC) $$(DEFS) $$(AM_CPPFLAGS)
+c_o_COMPILE = $$(CC) #$$(DEFS) $$(AM_CPPFLAGS)
 
-cc_o_COMPILE = $$(CXX) $$(DEFS) $$(AM_CPPFLAGS) 
-
-# lib_obj_SOURCES handling
-$$(LIB_DIR)/%.$$(OBJ_EXT): %.$$(OBJ_EXT)
-       @cp $$$$(CP_FLAGS) $$$$< $$$$@
+cc_o_COMPILE = $$(CXX) #$$(DEFS) $$(AM_CPPFLAGS) 
 
 endef # COMPILER_DEFS_template
 
 # 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 and parse the output of the compiler so the IDE can locate errors.
+# 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) `cygpath -w $$<` 2>&1|sed -e 's/\*\*\* \(.*C[0-9]\+\) IN LINE \([0-9]\+\) OF \([^:]*\): \(.*\)/\3(\2): \1: \4/'; \
-       if [ $$$$? -le 1 ] ; then touch "$$@.d" ; \
-       else echo ERRORLEVEL $$$$? ; exit 1; \
+       $$(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
+# To generate assembler add this to the directives above: 'SRC($$(@:%$$(OBJ_EXT)=%.asm))' 
 endef
 
 
 # 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) \
-       cp $$< .; \
-       if [ -f $(SOURCES_DIR)/reg1210.inc ] ; then \
-         cp $(SOURCES_DIR)/reg1210.inc .; \
-       fi;\
-       $$(AS) $(2:%$(OBJ_EXT)=%.asm)
+$(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
 
 
@@ -72,7 +83,7 @@ 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))
 
@@ -92,13 +103,19 @@ $(2)/$(1): $(USER_LIB_DIR)/timestamp
 
 #        $$(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) \
-         export C51LIB="$${C51LIB};$(USER_LIB_DIR)"; \
-         export LI_FILES="$$($(1)_OBJS) $$(lib_LOADLIBES:%=%$$(LIB_EXT))"; \
-         export LI_FILES="`echo "$$$${LI_FILES}" | sed -e 's/\(.\) \(.\)/\1,\2/g'`";\
-         $$(LI) $$$${LI_FILES}
+         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
 
 
@@ -107,7 +124,7 @@ 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))
 
@@ -116,11 +133,13 @@ SOURCES += $$($(1)_SOURCES)
 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 $$@; \
-       $(AR) CREATE $$@; \
-       for i in $$^ ; do $(AR) ADD $$$$i TO $$@ ; done
+       S='$$^'; \
+       L='$$(shell cygpath -w "$$@")'; \
+       $(AR) CREATE $$$$L $(FILTER_KEIL_LIB_OUTPUT); \
+       $(AR) ADD $$$${S// /,} TO $$$$L $(FILTER_KEIL_LIB_OUTPUT)
        @touch $(USER_LIB_DIR)/timestamp
 endef