diff --git a/tools/export/gcc_arm_common.tmpl b/tools/export/gcc_arm_common.tmpl index 6b23dd5bca..db5c9cb92a 100644 --- a/tools/export/gcc_arm_common.tmpl +++ b/tools/export/gcc_arm_common.tmpl @@ -2,18 +2,19 @@ # see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded # cross-platform directory manipulation -ifeq ($(OSTYPE),) +ifeq ($(shell echo $$OS),$$OS) MAKEDIR = if not exist "$(1)" mkdir "$(1)" - RM = rmdir /S /Q + RM = rmdir /S /Q "$(1)" else - MAKEDIR = mkdir -p $(1) - RM = rm -rf + MAKEDIR = $(SHELL) -c "mkdir -p \"$(1)\"" + RM = $(SHELL) -c "rm -rf \"$(1)\"" endif ifeq (,$(filter .build,$(notdir $(CURDIR)))) .SUFFIXES: OBJDIR := .build -MAKETARGET = $(MAKE) --no-print-directory -C $(OBJDIR) -f $(CURDIR)/Makefile \ +mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) +MAKETARGET = $(MAKE) --no-print-directory -C $(OBJDIR) -f $(mkfile_path) \ SRCDIR=$(CURDIR) $(MAKECMDGOALS) .PHONY: $(OBJDIR) clean all: @@ -23,19 +24,19 @@ $(OBJDIR): all Makefile : ; % :: $(OBJDIR) ; : clean : - $(RM) $(OBJDIR) + $(call RM,$(OBJDIR)) {% block target_clean -%} {% endblock %} else -VPATH = $(SRCDIR) +VPATH = {% for path in vpath %}{{path}} {% endfor %} GCC_BIN = PROJECT = {{name}} OBJECTS = {% for f in to_be_compiled %}{{f}} {% endfor %} SYS_OBJECTS = {% for f in object_files %}{{f}} {% endfor %} -INCLUDE_PATHS = {% for p in include_paths %}-I../{{p}} {% endfor %} -LIBRARY_PATHS = {% for p in library_paths %}-L../{{p}} {% endfor %} +INCLUDE_PATHS = {% for p in include_paths %}-I{{p}} {% endfor %} +LIBRARY_PATHS = {% for p in library_paths %}-L{{p}} {% endfor %} LIBRARIES = {% for lib in libraries %}-l{{lib}} {% endfor %} LINKER_SCRIPT = {{linker_script}} {%- block additional_variables -%}{% endblock %} diff --git a/tools/export/gccarm.py b/tools/export/gccarm.py index 28d9c90a87..88efe21b59 100644 --- a/tools/export/gccarm.py +++ b/tools/export/gccarm.py @@ -15,8 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. """ from exporters import Exporter -from os.path import splitext, basename -from os import curdir +from os.path import splitext, basename, relpath, join, abspath +from os import curdir, getcwd class GccArm(Exporter): @@ -132,8 +132,9 @@ class GccArm(Exporter): def generate(self): # "make" wants Unix paths + if self.sources_relative: + self.resources.relative_to(self.prj_paths[0]) self.resources.win_to_unix() - self.resources.relative_to(curdir) to_be_compiled = [] for r_type in ['s_sources', 'c_sources', 'cpp_sources']: @@ -148,6 +149,7 @@ class GccArm(Exporter): l, _ = splitext(basename(lib)) libraries.append(l[3:]) + build_dir = abspath(join(self.inputDir, ".build")) ctx = { 'name': self.program_name, 'to_be_compiled': to_be_compiled, @@ -157,7 +159,20 @@ class GccArm(Exporter): 'linker_script': self.resources.linker_script, 'libraries': libraries, 'symbols': self.get_symbols(), - 'cpu_flags': self.toolchain.cpu + 'cpu_flags': self.toolchain.cpu, + 'vpath': [relpath(s, build_dir) for s in self.prj_paths] if self.sources_relative else [".."] } + + for key in ['include_paths', 'library_paths', 'linker_script']: + if isinstance(ctx[key], list): + ctx[key] = [ctx['vpath'][0] + "/" + t for t in ctx[key]] + else: + ctx[key] = ctx['vpath'][0] + "/" + ctx[key] + if "../." not in ctx["include_paths"]: + ctx["include_paths"] += ['../.'] ctx.update(self.progen_flags) self.gen_file('gcc_arm_%s.tmpl' % self.target.lower(), ctx, 'Makefile') + + def scan_and_copy_resources(self, prj_paths, trg_path, relative=False): + self.prj_paths = prj_paths + Exporter.scan_and_copy_resources(self, prj_paths, trg_path, relative) diff --git a/tools/toolchains/__init__.py b/tools/toolchains/__init__.py index 20f1460cb3..5595294506 100644 --- a/tools/toolchains/__init__.py +++ b/tools/toolchains/__init__.py @@ -147,7 +147,7 @@ class Resources: v = [rel_path(f, base, dot) for f in getattr(self, field)] setattr(self, field, v) - self.features = {k: f.relative_to(base, dot) for k, f in self.features.iteritems()} + self.features = {k: f.relative_to(base, dot) for k, f in self.features.iteritems() if f} if self.linker_script is not None: self.linker_script = rel_path(self.linker_script, base, dot) @@ -160,7 +160,7 @@ class Resources: v = [f.replace('\\', '/') for f in getattr(self, field)] setattr(self, field, v) - self.features = {k: f.win_to_unix() for k, f in self.features.iteritems()} + self.features = {k: f.win_to_unix() for k, f in self.features.iteritems() if f} if self.linker_script is not None: self.linker_script = self.linker_script.replace('\\', '/')