-# 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
# 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:
+ rm -f $(USER_OBJS_DIR)/*.obj $(USER_OBJS_DIR)/*.lst
+
define COMPILER_DEFS_template
CC = c166
OBJ_EXT = .obj
LIB_EXT = .lib
LIB_PREF =
-ASM_EXT = .asm
+ASM_EXT = .a66
AR = lib166
AS = a166
HC = oh166
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)
+cc_o_COMPILE = $$(CXX) #$$(DEFS) $$(AM_CPPFLAGS)
# lib_obj_SOURCES handling
$$(LIB_DIR)/%.$$(OBJ_EXT): %.$$(OBJ_EXT)
define COMPILE_c_o_template
$(2): $(1) $(LOCAL_CONFIG_H) $$(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)'; \
+ 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
$(2)/$(1): $$($(1)_OBJS)
@$(QUIET_CMD_ECHO) " LINK $$@"
$(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}
+ 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)'; \
+ EL=$$$$?; if [ $$$$EL -gt 1 ]; then echo ERRORLEVEL $$$$EL ; exit 1; fi
endef
@$(QUIET_CMD_ECHO) " AR $$@"
$(Q) \
rm -f $$@; \
- $(AR) CREATE $$@; \
- for i in $$^ ; do $(AR) ADD $$$$i TO $$@ ; done
+ S='$$^'; \
+ L='$$(shell cygpath -w "$$@")'; \
+ $(AR) CREATE $$$$L; \
+ $(AR) ADD $$$${S// /,} TO $$$$L
@touch $(USER_LIB_DIR)/timestamp
endef
GEN_HEADERS+=$(cmetric_include_HEADERS:%=$(USER_INCLUDE_DIR)/%)
# Generate rules for compilation of programs and libraries
+ifneq ($(link_VARIANTS),)
$(foreach prog,$(bin_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
+else
+$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR))))
+endif
+
$(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
#$(foreach src,$(lib_obj_SOURCES),$(eval $(call LIBOBJ_template,$(addsuffix .o,$(basename $(src)))))) # FIXME: This can't work LIBOBJ_template is not defined
$(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
$(lib_LIBRARIES:%=$(LIB_DIR)/$(LIB_PREF)%$(LIB_EXT)) $(shared_LIBRARIES:%=$(LIB_DIR)/$(LIB_PREF)%.so) \
$(addprefix $(LIB_DIR)/,$(lib_OBJS))
+ifneq ($(link_VARIANTS),)
binary-pass-local: $(foreach link,$(link_VARIANTS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link)) \
$(foreach of,$(OUTPUT_FORMATS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link).$(of))))
-
+else
+binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%) \
+ $(foreach of,$(OUTPUT_FORMATS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%.$(of)))
+endif
endif # TARGET_RULE_TEMPLATES
.PHONY: clean-custom
clean-local: clean-custom
- @echo Cleaning in $(USER_OBJS_DIR)
- @rm -f $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \
+ rm -f $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \
$(USER_OBJS_DIR)/*.d \
$(USER_OBJS_DIR)/*.map \
$(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%)