mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #2106 from theotherjimmy/fix-makefile
[Exporter-gcc_arm] do builds from project directory when --source is specifiedpull/2047/head
						commit
						36ff1f73ce
					
				| 
						 | 
				
			
			@ -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 %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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('\\', '/')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue