aboutsummaryrefslogtreecommitdiffstats
path: root/tools/gmake_scripts
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2014-10-02 19:52:28 +1000
committerinmarket <andrewh@inmarket.com.au>2014-10-02 19:52:47 +1000
commite6882aa5f4382e25535e0e78ac5f5d18e581eb1b (patch)
tree4e0fda5b3c3ec5a766bcaf8a30cd3e8f1a060ccf /tools/gmake_scripts
parentf90ea57bff091832c7b52b3825057ac20ded1f01 (diff)
downloaduGFX-e6882aa5f4382e25535e0e78ac5f5d18e581eb1b.tar.gz
uGFX-e6882aa5f4382e25535e0e78ac5f5d18e581eb1b.tar.bz2
uGFX-e6882aa5f4382e25535e0e78ac5f5d18e581eb1b.zip
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
Diffstat (limited to 'tools/gmake_scripts')
-rw-r--r--tools/gmake_scripts/compiler_gcc.mk70
-rw-r--r--tools/gmake_scripts/library_ugfx.mk1
-rw-r--r--tools/gmake_scripts/os_chibios.mk2
-rw-r--r--tools/gmake_scripts/readme.txt1
4 files changed, 50 insertions, 24 deletions
diff --git a/tools/gmake_scripts/compiler_gcc.mk b/tools/gmake_scripts/compiler_gcc.mk
index cb3a3e2b..196e5d5a 100644
--- a/tools/gmake_scripts/compiler_gcc.mk
+++ b/tools/gmake_scripts/compiler_gcc.mk
@@ -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
@@ -23,12 +47,12 @@ endif
# Default project name is the project directory name
ifeq ($(PROJECT),)
ifneq ($(firstword $(abspath $(firstword $(MAKEFILE_LIST)))),$(lastword $(abspath $(firstword $(MAKEFILE_LIST)))))
- $(error Your directory contains spaces. Gmake barfs at that. Please define PROJECT)
+ $(error Your directory contains spaces. Gmake barfs at that. Please define PROJECT)
endif
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)
diff --git a/tools/gmake_scripts/library_ugfx.mk b/tools/gmake_scripts/library_ugfx.mk
index 7dbf9d99..24c501fe 100644
--- a/tools/gmake_scripts/library_ugfx.mk
+++ b/tools/gmake_scripts/library_ugfx.mk
@@ -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)
diff --git a/tools/gmake_scripts/os_chibios.mk b/tools/gmake_scripts/os_chibios.mk
index 8165c269..a81c9803 100644
--- a/tools/gmake_scripts/os_chibios.mk
+++ b/tools/gmake_scripts/os_chibios.mk
@@ -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
diff --git a/tools/gmake_scripts/readme.txt b/tools/gmake_scripts/readme.txt
index 004c1495..979ca364 100644
--- a/tools/gmake_scripts/readme.txt
+++ b/tools/gmake_scripts/readme.txt
@@ -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"