Add makefile support for absolute paths

Add makefile support for cygwin gmake versus mingw gmake
Add makefile support for "master" directories eg GFXLIB, CHIBIOS etc
This commit is contained in:
inmarket 2014-10-02 19:52:28 +10:00
parent 68a784d67e
commit 5d3ab261c0
4 changed files with 50 additions and 24 deletions

View File

@ -1,5 +1,29 @@
# See readme.txt for the make API
ifeq ($(basename $(OPT_OS)),win32)
# Nasty - must convert all paths into a format make can handle
PATHEXPAND := ARCH XCC XCXX XAS XLD XOC XOD PROJECT BUILDDIR SRC DEFS LIBS INCPATH LIBPATH $(PATHLIST)
# First convert \'s to /'s
$(foreach var,$(PATHEXPAND),$(eval $(var):=$$(subst \,/,$($(var)))))
# For cygwin gmake - need to convert all absolute paths (mingw gmake doesn't need this)
ifneq ($(findstring cygdrive,$(PATH)),)
DRIVELETTERS := a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
$(foreach drv,$(DRIVELETTERS),$(foreach var,$(PATHEXPAND),$(eval $(var):=$$(patsubst $(drv):%,/cygdrive/$(drv)%,$($(var))))))
endif
endif
# Path resolution - Functions to convert a source path to a object path and visa-versa
src_obj_fn := $$(1)
obj_src_fn := $$(1)
$(foreach var,$(PATHLIST),$(eval obj_src_fn := $$$$(patsubst $(var)/%,$$$$($(var))/%,$$(obj_src_fn))))
$(foreach var,$(PATHLIST),$(eval src_obj_fn := $$$$(patsubst $$$$($(var))/%,$(var)/%,$$(src_obj_fn))))
src_obj_fn := $$(subst :,_drv_drv_,$$(subst ../,_dot_dot/,$(src_obj_fn)))
obj_src_fn := $$(subst _drv_drv_,:,$$(subst _dot_dot/,../,$(obj_src_fn)))
$(eval src_obj=$(src_obj_fn))
$(eval obj_src=$(obj_src_fn))
# Add ARCH to each of the compiler programs
ifeq ($(XCC),)
XCC = $(ARCH)gcc
@ -28,7 +52,7 @@ ifeq ($(PROJECT),)
PROJECT := $(notdir $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))))
endif
# Output directory and files
# Output directories
ifeq ($(BUILDDIR),)
ifeq ($(MAKECMDGOALS),Debug)
BUILDDIR = bin/Debug
@ -46,13 +70,10 @@ ifeq ($(BUILDDIR),)
BUILDDIR = .build
endif
endif
OBJDIR = $(BUILDDIR)/obj
DEPDIR = $(BUILDDIR)/dep
SRCFILE = $<
OBJFILE = $@
LSTFILE = $(@:.o=.lst)
# Output files
MAPFILE = $(BUILDDIR)/$(PROJECT).map
EXEFILE =
ifeq ($(basename $(OPT_OS)),win32)
@ -73,10 +94,12 @@ ifeq ($(EXEFILE),)
TARGETS = $(EXEFILE) $(BUILDDIR)/$(PROJECT).hex $(BUILDDIR)/$(PROJECT).bin $(BUILDDIR)/$(PROJECT).dmp
endif
# Combine all our compiler arguments
SRCFLAGS += -I. $(patsubst %,-I%,$(INCPATH)) $(patsubst %,-D%,$(patsubst -D%,%,$(DEFS)))
LDFLAGS += $(patsubst %,-L%,$(LIBPATH)) $(patsubst %,-l%,$(patsubst -l%,%,$(LIBS)))
OBJS = $(addprefix $(OBJDIR)/,$(subst ../,_dot_dot/,$(addsuffix .o,$(basename $(SRC)))))
OBJS = $(addprefix $(OBJDIR)/,$(call src_obj,$(addsuffix .o,$(basename $(SRC)))))
# Handle make API options that affect compiler arguments
ifneq ($(OPT_NONSTANDARD_FLAGS),yes)
SRCFLAGS += -fomit-frame-pointer -Wall -Wextra -Wstrict-prototypes -fverbose-asm
endif
@ -91,9 +114,9 @@ ifeq ($(OPT_GENERATE_MAP),yes)
endif
endif
ifeq ($(OPT_GENERATE_LISTINGS),yes)
CFLAGS += -Wa,-alms=$(LSTFILE)
CXXFLAGS += -Wa,-alms=$(LSTFILE)
ASFLAGS += -Wa,-amhls=$(LSTFILE)
CFLAGS += -Wa,-alms=$(@:.o=.lst)
CXXFLAGS += -Wa,-alms=$(@:.o=.lst)
ASFLAGS += -Wa,-amhls=$(@:.o=.lst)
endif
ifneq ($(LDSCRIPT),)
LDFLAGS += -T$(LDSCRIPT)
@ -102,10 +125,7 @@ endif
# Generate dependency information
SRCFLAGS += -MMD -MP -MF $(DEPDIR)/$(@F).d
#
# makefile rules
#
# Targets
.PHONY: builddirs fakefile.o all clean Debug Release cleanDebug cleanRelease
Debug Release: all
@ -124,8 +144,10 @@ ifneq ($(OPT_VERBOSE_COMPILE),yes)
@echo
endif
# Implicit Rules
.SECONDEXPANSION:
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.c)
$(OBJDIR)/%.o : $$(call obj_src,%.c)
@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
@echo
@ -135,7 +157,7 @@ else
@$(XCC) -c $(CPPFLAGS) $(CFLAGS) $(SRCFLAGS) $< -o $@
endif
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.cpp)
$(OBJDIR)/%.o : $$(call obj_src,%.cpp)
@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
@echo
@ -145,7 +167,7 @@ else
@$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
endif
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.c++)
$(OBJDIR)/%.o : $$(call obj_src,%.c++)
@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
@echo
@ -155,7 +177,7 @@ else
@$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
endif
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.s)
$(OBJDIR)/%.o : $$(call obj_src,%.s)
@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
@echo
@ -165,7 +187,7 @@ else
@$(XAS) -c $(CPPFLAGS) $(ASFLAGS) $(SRCFLAGS) $< -o $@
endif
$(EXEFILE): $(OBJS)
$(EXEFILE): $(OBJS) $(LDSCRIPT)
@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
@echo
@ -178,7 +200,7 @@ ifeq ($(OPT_COPY_EXE),yes)
@cp $@ .
endif
%.hex: %.elf $(LDSCRIPT)
%.hex: %.elf
ifeq ($(OPT_VERBOSE_COMPILE),yes)
$(XOC) -O ihex $< $@
else
@ -189,7 +211,7 @@ ifeq ($(OPT_COPY_EXE),yes)
@cp $@ .
endif
%.bin: %.elf $(LDSCRIPT)
%.bin: %.elf
ifeq ($(USE_VERBOSE_COMPILE),yes)
$(XOC) -O binary $< $@
else
@ -200,7 +222,7 @@ ifeq ($(OPT_COPY_EXE),yes)
@cp $@ .
endif
%.dmp: %.elf $(LDSCRIPT)
%.dmp: %.elf
ifeq ($(USE_VERBOSE_COMPILE),yes)
$(XOD) -x --syms $< > $@
else
@ -212,16 +234,16 @@ ifeq ($(OPT_COPY_EXE),yes)
@cp $@ .
endif
# Goodness knows why we would want this.
gcov:
-mkdir gcov
$(COV) -u $(subst /,\,$(SRC))
-mv *.gcov ./gcov
#
# Include the dependency files, should be the last of the makefile except for clean
#
-include $(shell mkdir -p $(DEPDIR) 2>/dev/null) $(wildcard $(DEPDIR)/*)
# Clean
clean:
-rm -fR $(BUILDDIR)

View File

@ -12,6 +12,7 @@
# GFXDEMO: Compile a uGFX standard demo? If blank you need to include your own project files. eg GFXDEMO=modules/gwin/widgets
#
PATHLIST += GFXLIB
include $(GFXLIB)/gfx.mk
SRC += $(GFXSRC)

View File

@ -13,6 +13,8 @@
# CHIBIOS_LDSCRIPT The name of the loader script eg CHIBIOS_LDSCRIPT=$(PORTLD)/AT91SAM7X256.ld
#
PATHLIST += CHIBIOS
include $(CHIBIOS)/boards/$(CHIBIOS_BOARD)/board.mk
include $(CHIBIOS)/os/hal/platforms/$(CHIBIOS_PLATFORM)/platform.mk
include $(CHIBIOS)/os/hal/hal.mk

View File

@ -18,6 +18,7 @@ OPT_OS=win32|win32.chibios|linux|osx|chibios|freertos|ecos|raw32|rawrtos - Manda
BUILDDIR - Build Directory - default is ".build" or "bin/Debug" or "bin/Release" depending on the target
PROJECT - Project Name - default is the name of the project directory
PATHLIST - A list of variable names of "master" paths that contain source and other objects of interest - default is ""
ARCH - Architecture - default is ""
XCC - C compiler - default is "$(ARCH)gcc"