]> rtime.felk.cvut.cz Git - omk.git/blobdiff - snippets/keil16x
Leaf makefiles in tests replaced with dash-friendly version
[omk.git] / snippets / keil16x
index 31dce4d0dd27599af335f09be64cac02b36b10f0..ea1943c7b621ef67daf62c763e2f7a3e9800188f 100644 (file)
@@ -3,7 +3,9 @@
 #
 # 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.
@@ -14,6 +16,12 @@ 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
 CXX = ec166
@@ -41,11 +49,11 @@ 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
        $(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
@@ -55,16 +63,19 @@ 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)$$(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
 
 
@@ -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,18 @@ $(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) \
-         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
 
@@ -108,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))
 
@@ -117,13 +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 $$@; \
        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