]> rtime.felk.cvut.cz Git - arc.git/blobdiff - scripts/rules.mk
Bug: mpc560x was forced to defined sleep
[arc.git] / scripts / rules.mk
index 66287053bd655d7696e6638492fb108b78f369c1..e41b18fc3f4b20e6db6f64f82ecc03e409b57e0d 100644 (file)
@@ -1,19 +1,55 @@
 \r
-CFG_ARCH_$(ARCH):=y\r
-\r
-RELDIR := $(subst $(TOPDIR)/,,$(CURDIR))\r
 \r
-# Create the target name... \r
-target := $(subst /,_,$(SUBDIR))\r
+###############################################################################\r
+# BUILD SETTINGS                                                              #\r
+###############################################################################\r
 \r
-#goal=$(subst /cygdrive/c/,c:/,$(abspath $@))\r
-#goal=$(abspath $@)\r
-goal=$@\r
-\r
-#===== MODULE CONFIGURATION =====\r
+# Board settings\r
 include $(ROOTDIR)/boards/$(BOARDDIR)/build_config.mk\r
+\r
+# Project settings\r
 -include ../build_config.mk\r
 \r
+# Perform build system version check\r
+include $(ROOTDIR)/scripts/version_check.mk\r
+\r
+COMPILER?=gcc\r
+ifeq (${COMPILER},gcc)\r
+# Assume that the board have set DEFAULT_CROSS_COMPILE\r
+CROSS_COMPILE?=${DEFAULT_CROSS_COMPILE}\r
+endif\r
+\r
+ifeq (${COMPILER},cw)\r
+CW_COMPILE?=${DEFAULT_CW_COMPILE}\r
+endif\r
+\r
+# Check cross compiler setting against default from board config\r
+ifeq (${COMPILER},cw)\r
+ifneq (${CW_COMPILE},${DEFAULT_CW_COMPILE})\r
+${warning Not using default cross compiler for architecture.}\r
+${warning CW_COMPILE:            ${CW_COMPILE} [${origin CW_COMPILE}]}\r
+${warning DEFAULT_CW_COMPILE:    ${DEFAULT_CW_COMPILE} [${origin DEFAULT_CW_COMPILE}]}\r
+endif\r
+else\r
+ifneq (${DEFAULT_CROSS_COMPILE},)\r
+ifneq (${CROSS_COMPILE},${DEFAULT_CROSS_COMPILE})\r
+${warning Not using default cross compiler for architecture.}\r
+${warning CROSS_COMPILE:         ${CROSS_COMPILE} [${origin CROSS_COMPILE}]}\r
+${warning DEFAULT_CROSS_COMPILE: ${DEFAULT_CROSS_COMPILE} [${origin DEFAULT_CROSS_COMPILE}]}\r
+endif\r
+endif\r
+endif\r
+\r
+###############################################################################\r
+# MODULE CONFIGURATION                                                        #\r
+###############################################################################\r
+\r
+# Some useful vars\r
+CFG_ARCH_$(ARCH):=y\r
+RELDIR := $(subst $(TOPDIR)/,,$(CURDIR))\r
+target := $(subst /,_,$(SUBDIR))\r
+goal=$@\r
+\r
 define MOD_AVAIL_template\r
        MOD_$(1)=y\r
 endef\r
@@ -29,7 +65,7 @@ define CFG_template
 endef\r
 \r
 $(foreach mod,$(MOD_AVAIL),$(eval $(call MOD_AVAIL_template,${mod})))\r
-$(foreach mod,$(MOD_USE),$(eval $(call MOD_USE_template,${mod})))\r
+$(foreach mod,$(sort $(MOD_USE)),$(eval $(call MOD_USE_template,${mod})))\r
 $(foreach mod,$(CFG),$(eval $(call CFG_template,${mod})))\r
 #def-y += $(ARCH) $(ARCH_FAM) $(ARCH_MCU) \r
 \r
@@ -41,12 +77,16 @@ def-y += SELECT_OS_CONSOLE=$(if $(SELECT_OS_CONSOLE),$(SELECT_OS_CONSOLE),TTY_NO
 def-y += SELECT_CONSOLE=$(if $(SELECT_CONSOLE),$(SELECT_CONSOLE),TTY_NONE)\r
 def-$(USE_DEBUG_PRINTF) += USE_DEBUG_PRINTF \r
 \r
-not_avail = $(filter-out $(MOD_AVAIL),$(MOD_USE))\r
+not_avail = $(filter-out $(MOD_AVAIL),$(sort $(MOD_USE)))\r
 ifneq ($(not_avail),)\r
 $(error Trying to build a module that is not available: $(not_avail))\r
 endif\r
 \r
-#===== COMPILER CONFIG =====\r
+\r
+\r
+###############################################################################\r
+# TOOLS CONFIGURATION                                                         #\r
+###############################################################################\r
 \r
 # set debug optimization level as default\r
 ifeq ($(SELECT_OPT),)\r
@@ -57,12 +97,10 @@ $(eval CFG_$(SELECT_OPT)=y)
 \r
 ARCH_PATH-y = arch/$(ARCH_FAM)/$(ARCH)\r
 \r
-# Include compiler generic and arch specific\r
-COMPILER?=gcc\r
-ifneq ($(ARCH),)\r
-include $(ROOTDIR)/$(ARCH_PATH-y)/scripts/gcc.mk\r
-endif\r
+# Include compiler settings\r
 include $(ROOTDIR)/scripts/cc_$(COMPILER).mk\r
+\r
+# Include pclint or splint settings\r
 ifneq ($(PCLINT),)\r
 include $(ROOTDIR)/scripts/cc_pclint.mk\r
 endif\r
@@ -72,11 +110,26 @@ endif
 \r
 \r
 \r
-# Get object files\r
+###############################################################################\r
+# PROJECT MAKEFILE                                                            #\r
+###############################################################################\r
+\r
+# Include project makefile\r
 include ../makefile\r
 \r
+# All module object files (guarded for backwards compatability)\r
+ifndef _BOARD_COMMON_MK\r
+include $(ROOTDIR)/boards/board_common.mk\r
+endif\r
+\r
+# Misc tools\r
+ifneq ($(CFG_BOOT),)\r
+include $(ROOTDIR)/boards/$(BOARDDIR)/boot_info.mk\r
+include $(ROOTDIR)/scripts/bootloader_image.mk\r
+endif  \r
+\r
+##### For backwards compatability with older project makefiles:\r
 \r
-##### For backwards compatability with older project makefiles\r
 # Remove dependency on libkernel\r
 deprecated-libs += $(ROOTDIR)/libs/libkernel_$(ARCH_MCU).a\r
 deprecated-libs-included = $(filter $(deprecated-libs),$(libitem-y))\r
@@ -97,136 +150,171 @@ endif
 \r
 #####\r
 \r
+inc-y += ../include\r
 inc-y += $(ROOTDIR)/include\r
 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)\r
 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)/$(ARCH)\r
+  \r
+VPATH += $(ROOTDIR)/$(SUBDIR)/src\r
+VPATH += $(ROOTDIR)/$(SUBDIR)\r
+\r
+\r
+\r
+###############################################################################\r
+# LINT                                                                        #\r
+###############################################################################\r
+\r
+LINT_EXCLUDE_PATHS := $(abspath $(LINT_EXCLUDE_PATHS))\r
+$(info $(LINT_EXCLUDE_PATHS))\r
+\r
+LINT_BAD_EXCLUDE_PATHS := $(filter %/,$(LINT_EXCLUDE_PATHS))\r
+ifneq ($(LINT_BAD_EXCLUDE_PATHS),)\r
+$(warning LINT_EXCLUDE_PATHS entries must not end in '/'. Ignoring $(LINT_BAD_EXCLUDE_PATHS))\r
+endif\r
+\r
+LINT_NICE_EXCLUDE_PATHS := $(filter-out %/,$(LINT_EXCLUDE_PATHS))\r
+LINT_NICE_EXCLUDE_PATHS := $(foreach path,$(LINT_NICE_EXCLUDE_PATHS),$(path)/)\r
+\r
+ifneq ($(PCLINT),)\r
+define run_pclint\r
+$(if \r
+$(filter $(dir $(abspath $<)),$(LINT_NICE_EXCLUDE_PATHS)),\r
+$(info $(abspath $<):0:0: Info: Not running lint check on $(abspath $<)),\r
+$(Q)$(PCLINT) $(lint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<))\r
+endef\r
+endif\r
+\r
+ifneq ($(SPLINT),)\r
+define run_splint\r
+$(if \r
+$(filter $(dir $(abspath $<)),$(LINT_NICE_EXCLUDE_PATHS)),\r
+$(info $(abspath $<):0:0: Info: Not running lint check on $(abspath $<)),\r
+$(Q)$(SPLINT) $(splint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<))\r
+endef\r
+endif\r
 \r
 \r
+\r
+###############################################################################\r
+# TOP-LEVEL TARGETS                                                           #\r
+###############################################################################\r
+\r
 .PHONY clean: \r
 clean: FORCE\r
-       @-rm -f *.o *.d *.h *.elf *.a *.ldp\r
-\r
-.PHONY config: \r
+       @echo\r
+       @echo "  >> Rules Clean $(CURDIR)"\r
+       $(Q)-rm -v *\r
+       $(Q)-rm -v $(ROOTDIR)/binaries/$(BOARDDIR)/*\r
+       \r
+.PHONY : config \r
 config: FORCE\r
-       @echo "board   modules:" $(MOD_AVAIL)\r
-       @echo "example modules:" $(MOD_USE)\r
+       @echo ">>>> Available modules:" $(sort $(MOD_AVAIL))\r
+       @echo ">>>> Used modules:     " $(sort $(MOD_USE)) \r
        @echo $(MOD) ${def-y}\r
 \r
-FORCE:\r
+.PHONY : module_config\r
+module_config: FORCE\r
+       @echo ">>>> Available modules:" $(sort $(MOD_AVAIL))\r
+       @echo ">>>> Used modules:     " $(sort $(MOD_USE)) \r
 \r
-$(ROOTDIR)/binaries:\r
-       @mkdir -p $@\r
 \r
-# build- targets are "end" target that the included makefile want's to build\r
-.PHONY all:\r
-all: $(build-exe-y) $(build-hex-y) $(build-lib-y) $(build-bin-y) $(ROOTDIR)/binaries\r
-       @cp -v $(build-lib-y) $(build-exe-y) $(build-hex-y) $(build-bin-y) $(ROOTDIR)/binaries\r
+FORCE:\r
 \r
+$(ROOTDIR)/binaries/$(BOARDDIR):\r
+       @mkdir -p $@\r
 \r
-# Determine what kind of filetype to build from  \r
-VPATH += $(ROOTDIR)/$(SUBDIR)/src\r
-VPATH += $(ROOTDIR)/$(SUBDIR)\r
+all-mod += $(build-hex-y) $(build-exe-y) $(build-srec-y) \r
+all-mod += $(build-lib-y) $(build-bin-y)\r
 \r
-inc-y += ../include\r
+.PHONY all:\r
+all: | module_config $(ROOTDIR)/binaries/$(BOARDDIR) $(all-mod) $(all-mod-post)\r
+all: module_config $(all-mod) $(all-mod-post) $(ROOTDIR)/binaries/$(BOARDDIR) \r
+       @cp -v $(all-mod) $(all-mod-post) $(ROOTDIR)/binaries/$(BOARDDIR)\r
 \r
 .SUFFIXES:\r
 \r
+\r
+###############################################################################\r
+# TARGETS                                                                     #\r
+###############################################################################\r
+       \r
 # Simple depencendy stuff\r
 -include $(subst .o,.d,$(obj-y))\r
 # Some dependency for xxx_offset.c/h also\r
 -include $(subst .h,.d,$(dep-y))\r
 \r
-ifneq ($(PCLINT),)\r
-define run_pclint\r
-$(Q)$(PCLINT) $(lint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<)\r
-endef\r
-endif\r
-\r
-ifneq ($(SPLINT),)\r
-define run_splint\r
-$(Q)$(SPLINT) $(splint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<)\r
-endef\r
-endif\r
-\r
-\r
 # Compile\r
 %.o: %.c\r
+       @echo\r
        @echo "  >> CC $(notdir $<)"\r
-       $(Q)$(CC) -c $(CFLAGS) -o $(goal) $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $(abspath $<)\r
+       $(Q)$(CC) -c $(CFLAGS) $(CFLAGS_$@) -o $(goal) $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $(abspath $<)\r
+       $(do-compile-post)\r
+# run lint if enabled\r
        $(run_pclint)\r
        $(run_splint)\r
 \r
 # Assembler\r
-\r
 %.o: %.s\r
-       @echo "  >> AS $(notdir $<)  $(ASFLAGS)"\r
+       @echo\r
+       @echo "  >> AS $(notdir $<)"\r
        $(Q)$(AS) $(ASFLAGS) -o $(goal) $<\r
        \r
 # PP Assembler \r
-#.SECONDARY %.s:\r
+\r
+.SECONDARY %.s: # Don't remove *.s files (needed for debugging)\r
 \r
 %.s: %.sx\r
+       @echo\r
        @echo "  >> CPP $(notdir $<)"\r
-       $(Q)$(CPP) -x assembler-with-cpp -E -o $@ $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
-\r
+       $(Q)$(CPP) $(CPP_ASM_FLAGS) $(CPPOUT) $@ $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
 \r
 # Board linker files are in the board directory \r
 inc-y += $(ROOTDIR)/boards/$(BOARDDIR)\r
 \r
+\r
+# *.ldf (file on disc) -> *.lcf (preprocessed *.ldf file)\r
 # Preprocess linker files..\r
-%.ldp: %.ldf\r
-       @echo "  >> CPP $<"\r
-       $(Q)$(CPP) -E -P -x assembler-with-cpp -o $@ $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
+%.lcf %.ldp: %.ldf\r
+       @echo\r
+       @echo "  >> CPP $(notdir $<)"\r
+       $(Q)$(CPP) -P $(CPP_ASM_FLAGS) $(CPPOUT) $@ $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
 \r
-#      @cat $@ \r
-       \r
 .PHONY $(ROOTDIR)/libs:\r
 $(ROOTDIR)/libs:\r
        $(Q)mkdir -p $@\r
 \r
 dep-y += $(ROOTDIR)/libs\r
        \r
-# lib  \r
+# lib output\r
 $(build-lib-y): $(dep-y) $(obj-y)\r
+       @echo\r
        @echo "  >> AR $@"   \r
        $(Q)$(AR) -r -o $@ $(obj-y) 2> /dev/null\r
 \r
+# hex output\r
 $(build-hex-y): $(build-exe-y)\r
+       @echo\r
        @echo "  >> OBJCOPY $@"   \r
        $(Q)$(CROSS_COMPILE)objcopy -O ihex $< $@\r
        \r
-$(build-bin-y): $(build-exe-y)\r
-       @echo "  >> OBJCOPY $@"   \r
-       $(Q)$(CROSS_COMPILE)objcopy -O binary $< $@     \r
+# bin output\r
+#$(build-bin-y): $(build-exe-y)\r
+#      @echo\r
+#      @echo "  >> OBJCOPY $@"   \r
+#      $(Q)$(CROSS_COMPILE)objcopy -O binary $< $@     \r
 \r
 # Linker\r
-# Could use readelf -S instead of parsing the *.map file.\r
 $(build-exe-y): $(dep-y) $(obj-y) $(sim-y) $(libitem-y) $(ldcmdfile-y)\r
+       @echo\r
        @echo "  >> LD $@"\r
-ifeq ($(CROSS_COMPILE),)\r
+ifeq ($(CROSS_COMPILE)$(COMPILER),gcc)\r
        $(Q)$(CC) $(LDFLAGS) -o $@ $(libpath-y) $(obj-y) $(lib-y) $(libitem-y)  \r
-else   \r
-       $(Q)$(LD) $(LDFLAGS) -T $(ldcmdfile-y) -o $@ $(libpath-y) --start-group $(obj-y) $(lib-y) $(libitem-y) --end-group $(LDMAPFILE)\r
-ifdef CFG_HC1X\r
-       @$(CROSS_COMPILE)objdump -h $@ | gawk -f $(ROOTDIR)/scripts/hc1x_memory.awk\r
 else\r
-       @echo "Image size: (decimal)"\r
-       @gawk --non-decimal-data        '/^\.text/ { print "  text:"  $$3+0 " bytes"; rom+=$$3 };\\r
-                                                               /^\.data/ { print "  data:"  $$3+0 " bytes"; rom+=$$3; ram+=$$3}; \\r
-                                                               /^\.bss/ { print "  bss :"  $$3+0 " bytes"; ram+=$$3}; \\r
-                                                               END { print "  ROM: ~" rom " bytes"; print "  RAM: ~" ram " bytes"}' $(subst .elf,.map,$@)\r
-ifeq ($(BUILD_LOAD_MODULE),y)\r
-       @$(CROSS_COMPILE)objcopy -O srec $@ $@.raw.s19\r
-       srec_cat $@.raw.s19 --crop 0x8008000 0x803fffc --fill 0x00 0x8008000 0x803fffc --l-e-crc32 0x803fffc -o $@.lm.s19\r
-endif\r
-endif\r
-endif\r
+       $(Q)$(LD) $(LDFLAGS) $(LD_FILE) $(ldcmdfile-y) -o $@ $(libpath-y) $(LD_START_GRP) $(obj-y) $(lib-y) $(libitem-y) $(LD_END_GRP) $(LDMAPFILE)\r
+       $(do-memory-footprint)\r
+       $(do-memory-footprint2-y)\r
+endif #($(CROSS_COMPILE),)\r
        @echo\r
        @echo "  >>>>>>>  DONE  <<<<<<<<<"\r
        @echo\r
        \r
-       \r
-$(size-exe-y): $(build-exe-y)\r
-       $(Q)$(OBJDUMP) -h $<\r
-       @echo TODO: Parse the file....\r
-\r