Merge pull request #2106 from theotherjimmy/fix-makefile

[Exporter-gcc_arm] do builds from project directory when --source is specified
pull/2047/head
Sam Grove 2016-07-06 15:33:28 -05:00 committed by GitHub
commit 36ff1f73ce
3 changed files with 31 additions and 15 deletions

View File

@ -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 %}

View File

@ -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)

View File

@ -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('\\', '/')