Generalize make exporters for all toolchains

pull/2577/head
Jimmy Brisson 2016-08-22 15:58:30 -05:00
parent 17e096b369
commit 00d2a45b91
22 changed files with 221 additions and 285 deletions

View File

@ -32,8 +32,10 @@ EXPORTERS = {
'uvision4': uvision4.Uvision4, 'uvision4': uvision4.Uvision4,
'uvision5': uvision5.Uvision5, 'uvision5': uvision5.Uvision5,
'lpcxpresso': codered.CodeRed, 'lpcxpresso': codered.CodeRed,
'gcc_arm': makefile.GccArm, 'gcc_arm': makefile.GccArm_Exporter,
'make_gcc_arm': makefile.GccArm, 'make_gcc_arm': makefile.GccArm_Exporter,
'make_armc5': makefile.Armc5_Exporter,
'make_iar': makefile.IAR_Exporter,
'ds5_5': ds5_5.DS5_5, 'ds5_5': ds5_5.DS5_5,
'iar': iar.IAREmbeddedWorkbench, 'iar': iar.IAREmbeddedWorkbench,
'emblocks' : emblocks.IntermediateFile, 'emblocks' : emblocks.IntermediateFile,

View File

@ -0,0 +1,135 @@
# This file was automagically generated by mbed.org. For more information,
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded
###############################################################################
# Boiler-plate
# cross-platform directory manipulation
ifeq ($(shell echo $$OS),$$OS)
MAKEDIR = if not exist "$(1)" mkdir "$(1)"
RM = rmdir /S /Q "$(1)"
else
MAKEDIR = $(SHELL) -c "mkdir -p \"$(1)\""
RM = $(SHELL) -c "rm -rf \"$(1)\""
endif
# Move to the build directory
ifeq (,$(filter .build,$(notdir $(CURDIR))))
.SUFFIXES:
OBJDIR := .build
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
MAKETARGET = $(MAKE) --no-print-directory -C $(OBJDIR) -f $(mkfile_path) \
SRCDIR=$(CURDIR) $(MAKECMDGOALS)
.PHONY: $(OBJDIR) clean
all:
+@$(call MAKEDIR,$(OBJDIR))
+@$(MAKETARGET)
$(OBJDIR): all
Makefile : ;
% :: $(OBJDIR) ; :
clean :
$(call RM,$(OBJDIR))
{% block target_clean -%}
{% endblock %}
else
# trick rules into thinking we are in the root, when we are in the bulid dir
VPATH = {{vpath|join(" ")}}
# Boiler-plate
###############################################################################
# Project settings
PROJECT := {{name}}
{% for sym in symbols %}CC_SYMBOLS += -D{{sym}}
{% endfor %}
# Project settings
###############################################################################
# Objects and Paths
{% for obj in to_be_compiled %}OBJECTS += {{obj}}
{% endfor %}
{% for obj in object_files %} SYS_OBJECTS += {{obj}}
{% endfor %}
{% for path in include_paths %}INCLUDE_PATHS += -I{{path}}
{% 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 %}
# Objects and Paths
###############################################################################
# Tools and Flags
AS = {{asm_cmd}}
CC = {{cc_cmd}}
CPP = {{cppc_cmd}}
LD = {{ld_cmd}}
ELF2BIN = {{elf2bin_cmd}}
{% if hex_files %}
SREC_CAT = srec_cat
{%- endif %}
{%- block additional_executables -%}{%- endblock %}
LD_FLAGS :={%- block ld_flags -%} {{ld_flags|join(" ")}} {% endblock %}
{% block sys_libs -%}{%- endblock %}
# Tools and Flags
###############################################################################
# Rules
.PHONY: all lst size
{% if hex_files -%}
all: $(PROJECT).bin $(PROJECT)-combined.hex size
{% else %}
all: $(PROJECT).bin $(PROJECT).hex size
{% endif %}
.asm.o:
+@$(call MAKEDIR,$(dir $@))
$(AS) -c $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.s.o:
+@$(call MAKEDIR,$(dir $@))
$(AS) -c $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.S.o:
+@$(call MAKEDIR,$(dir $@))
$(AS) -c $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.c.o:
+@$(call MAKEDIR,$(dir $@))
$(CC) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.cpp.o:
+@$(call MAKEDIR,$(dir $@))
$(CPP) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
{% block target_project_elf %}
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) $(LINKER_SCRIPT)
$(LD) $(LD_FLAGS) {{link_script_option}} $(filter %{{link_script_ext}}, $^) $(LIBRARY_PATHS) --output $@ $(filter %.o, $^) $(LIBRARIES) $(LD_SYS_LIBS)
{% endblock %}
$(PROJECT).bin: $(PROJECT).elf
{%- block elf2bin -%}{%- endblock %}
$(PROJECT).hex: $(PROJECT).elf
{%- block elf2hex -%}{%- endblock %}
{% if hex_files %}
$(PROJECT)-combined.hex: $(PROJECT).hex
$(SREC_CAT) {% for f in hex_files %}{{f}} {% endfor %} -intel $(PROJECT).hex -intel -o $(PROJECT)-combined.hex -intel --line-length=44
{% endif %}
# Rules
###############################################################################
# Dependencies
DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)
endif
# Dependencies
###############################################################################

View File

@ -18,12 +18,11 @@ from os.path import splitext, basename, relpath, join, abspath, dirname,\
exists exists
from os import curdir, getcwd from os import curdir, getcwd
from tools.export.exporters import Exporter from tools.export.exporters import Exporter
from tools.utils import NotSupportedException
from jinja2.exceptions import TemplateNotFound from jinja2.exceptions import TemplateNotFound
class GccArm(Exporter): class Makefile(Exporter):
NAME = 'GccArm'
TOOLCHAIN = 'GCC_ARM'
TARGETS = [ TARGETS = [
'LPC1768', 'LPC1768',
@ -164,11 +163,17 @@ class GccArm(Exporter):
'linker_script': self.resources.linker_script, 'linker_script': self.resources.linker_script,
'libraries': libraries, 'libraries': libraries,
'symbols': self.toolchain.get_symbols(), 'symbols': self.toolchain.get_symbols(),
'cpu_flags': self.toolchain.cpu,
'hex_files': self.resources.hex_files, 'hex_files': self.resources.hex_files,
'vpath': (["../../.."] 'vpath': (["../../.."]
if basename(dirname(dirname(self.export_dir))) == "projectfiles" if basename(dirname(dirname(self.export_dir))) == "projectfiles"
else [".."]) else [".."]),
'cc_cmd': " ".join(self.toolchain.cc),
'cppc_cmd': " ".join(self.toolchain.cppc),
'asm_cmd': " ".join(self.toolchain.asm),
'ld_cmd': " ".join(self.toolchain.ld),
'elf2bin_cmd': self.toolchain.elf2bin,
'link_script_ext': self.toolchain.LINKER_EXT,
'link_script_option': self.LINK_SCRIPT_OPTION,
} }
for key in ['include_paths', 'library_paths', 'linker_script', 'hex_files']: for key in ['include_paths', 'library_paths', 'linker_script', 'hex_files']:
@ -178,8 +183,40 @@ class GccArm(Exporter):
ctx[key] = ctx['vpath'][0] + "/" + ctx[key] ctx[key] = ctx['vpath'][0] + "/" + ctx[key]
if "../." not in ctx["include_paths"]: if "../." not in ctx["include_paths"]:
ctx["include_paths"] += ['../.'] ctx["include_paths"] += ['../.']
ctx["include_paths"] = list(set(ctx["include_paths"]))
for key in ['include_paths', 'library_paths', 'hex_files', 'to_be_compiled', 'symbols']:
ctx[key] = sorted(ctx[key])
ctx.update(self.flags) ctx.update(self.flags)
try:
self.gen_file('gcc_arm_%s.tmpl' % self.target.lower(), ctx, 'Makefile') for templatefile in \
except TemplateNotFound: ['makefile/%s_%s.tmpl' % (self.NAME.lower(),
self.gen_file('gcc_arm_common.tmpl', ctx, 'Makefile') self.target.lower())] + \
['makefile/%s_%s.tmpl' % (self.NAME.lower(),
label.lower()) for label
in self.toolchain.target.extra_labels] +\
['makefile/%s.tmpl' % self.NAME.lower()]:
try:
self.gen_file(templatefile, ctx, 'Makefile')
break
except TemplateNotFound:
pass
else:
raise NotSupportedException("This make tool is in development")
class GccArm_Exporter(Makefile):
NAME = 'Make-GCC-ARM'
TOOLCHAIN = "GCC_ARM"
LINK_SCRIPT_OPTION = "-T"
class Armc5_Exporter(Makefile):
NAME = 'Make-ARMc5'
TOOLCHAIN = "ARM"
LINK_SCRIPT_OPTION = "--scatter"
class IAR_Exporter(Makefile):
NAME = 'Make-IAR'
TOOLCHAIN = "IAR"
LINK_SCRIPT_OPTION = "--config"

View File

@ -1,141 +0,0 @@
# This file was automagically generated by mbed.org. For more information,
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded
# cross-platform directory manipulation
ifeq ($(shell echo $$OS),$$OS)
MAKEDIR = if not exist "$(1)" mkdir "$(1)"
RM = rmdir /S /Q "$(1)"
else
MAKEDIR = $(SHELL) -c "mkdir -p \"$(1)\""
RM = $(SHELL) -c "rm -rf \"$(1)\""
endif
ifeq (,$(filter .build,$(notdir $(CURDIR))))
.SUFFIXES:
OBJDIR := .build
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
MAKETARGET = $(MAKE) --no-print-directory -C $(OBJDIR) -f $(mkfile_path) \
SRCDIR=$(CURDIR) $(MAKECMDGOALS)
.PHONY: $(OBJDIR) clean
all:
+@$(call MAKEDIR,$(OBJDIR))
+@$(MAKETARGET)
$(OBJDIR): all
Makefile : ;
% :: $(OBJDIR) ; :
clean :
$(call RM,$(OBJDIR))
{% block target_clean -%}
{% endblock %}
else
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 %}
LIBRARIES = {% for lib in libraries %}-l{{lib}} {% endfor %}
LINKER_SCRIPT = {{linker_script}}
{%- block additional_variables -%}{% endblock %}
###############################################################################
AS = $(GCC_BIN)arm-none-eabi-as
CC = $(GCC_BIN)arm-none-eabi-gcc
CPP = $(GCC_BIN)arm-none-eabi-g++
LD = $(GCC_BIN)arm-none-eabi-gcc
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
SIZE = $(GCC_BIN)arm-none-eabi-size
{% if hex_files %}
SREC_CAT = srec_cat
{% endif %}
{%- block additional_executables -%}{% endblock %}
{%- block flags -%}
{% block hardfp %}
{% if "-mfloat-abi=softfp" in cpu_flags %}
ifeq ($(HARDFP),1)
FLOAT_ABI = hard
else
FLOAT_ABI = softfp
endif
{% endif %}
{%- endblock %}
CPU = {% block cpu %}{% for cf in cpu_flags %}{{cf|replace("-mfloat-abi=softfp","-mfloat-abi=$(FLOAT_ABI)")}} {% endfor %}{% endblock %}
CC_FLAGS = {% block cc_flags %}{{common_flags|join(" ")}} {{c_flags|join(" ")}} -MMD -MP{% endblock %}
CPPC_FLAGS = {% block cppc_flags %}{{common_flags|join(" ")}} {{cxx_flags|join(" ")}} -MMD -MP{% endblock %}
ASM_FLAGS = {% block asm_flags %}{{asm_flags|join(" ")}} {{common_flags|join(" ")}}{% endblock %}
CC_SYMBOLS = {% block cc_symbols %}{% for s in symbols %}-D{{s}} {% endfor %}{% endblock %}
LD_FLAGS = {%- block ld_flags -%} {{ld_flags|join(" ")}} {% endblock %}
LD_SYS_LIBS = {% block ld_sys_libs %}-lstdc++ -lsupc++ -lm -lc -lgcc -lnosys{% endblock %}
{% endblock %}
ifeq ($(DEBUG), 1)
CC_FLAGS += -DDEBUG -O0
else
CC_FLAGS += -DNDEBUG -Os
endif
.PHONY: all lst size
{% if hex_files -%}
all: $(PROJECT).bin $(PROJECT)-combined.hex size
{% else %}
all: $(PROJECT).bin $(PROJECT).hex size
{% endif %}
.asm.o:
+@$(call MAKEDIR,$(dir $@))
$(CC) $(CPU) -c $(ASM_FLAGS) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.s.o:
+@$(call MAKEDIR,$(dir $@))
$(CC) $(CPU) -c $(ASM_FLAGS) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.S.o:
+@$(call MAKEDIR,$(dir $@))
$(CC) $(CPU) -c $(ASM_FLAGS) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.c.o:
+@$(call MAKEDIR,$(dir $@))
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.cpp.o:
+@$(call MAKEDIR,$(dir $@))
$(CPP) $(CPPC_FLAGS) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
{% block target_project_elf %}
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) $(LINKER_SCRIPT)
$(LD) $(LD_FLAGS) -T$(filter %.ld, $^) $(LIBRARY_PATHS) -o $@ $(filter %.o, $^) -Wl,--start-group $(LIBRARIES) $(LD_SYS_LIBS) -Wl,--end-group
{% endblock %}
$(PROJECT).bin: $(PROJECT).elf
$(OBJCOPY) -O binary $< $@
$(PROJECT).hex: $(PROJECT).elf
@$(OBJCOPY) -O ihex $< $@
$(PROJECT).lst: $(PROJECT).elf
@$(OBJDUMP) -Sdh $< > $@
lst: $(PROJECT).lst
size: $(PROJECT).elf
$(SIZE) $(PROJECT).elf
DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)
{% if hex_files %}
$(PROJECT)-combined.hex: $(PROJECT).hex
$(SREC_CAT) {% for f in hex_files %}{{f}} {% endfor %} -intel $(PROJECT).hex -intel -o $(PROJECT)-combined.hex -intel --line-length=44
{% endif %}
endif

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "gcc_arm_common.tmpl" %}
{% block target_project_elf %}
{{ super() }}
@echo ""
@echo "*****"
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
@echo "*****"
@echo ""
{% endblock %}

View File

@ -0,0 +1,9 @@
{% extends "makefile/Makefile.tmpl" %}
{% block elf2bin %}
$(ELF2BIN) --bin --output $@ $<
{%- endblock %}
{% block elf2hex %}
$(ELF2BIN) --i32 --output $@ $<
{%- endblock %}

View File

@ -0,0 +1,15 @@
{% extends "makefile/Makefile.tmpl" %}
{% block sys_libs %}
{% for lib in ["-lstdc++", "-lsupc++", "-lm", "-lc", "-lgcc", "-lnosys"] -%}
LD_SYS_LIBS += {{lib}}
{% endfor %}
{%- endblock %}
{% block elf2bin %}
$(ELF2BIN) -O binary $< $@
{%- endblock %}
{% block elf2hex %}
$(ELF2BIN) -O ihex $< $@
{%- endblock %}

View File

@ -1,4 +1,4 @@
{% extends "gcc_arm_common.tmpl" %} {% extends "makefile/make-gcc-arm.tmpl" %}
{% block target_project_elf %} {% block target_project_elf %}
{{ super() }} {{ super() }}

View File

@ -0,0 +1,9 @@
{% extends "makefile/Makefile.tmpl" %}
{% block elf2bin %}
$(ELF2BIN) --bin $< $@
{%- endblock %}
{% block elf2hex %}
$(ELF2BIN) --ihex $< $@
{%- endblock %}

View File

@ -104,7 +104,7 @@ class IAR(mbedToolchain):
self.cppc = [main_cc] self.cppc = [main_cc]
self.cc += self.flags["common"] + c_flags_cmd + self.flags["c"] self.cc += self.flags["common"] + c_flags_cmd + self.flags["c"]
self.cppc += self.flags["common"] + c_flags_cmd + cxx_flags_cmd + self.flags["cxx"] self.cppc += self.flags["common"] + c_flags_cmd + cxx_flags_cmd + self.flags["cxx"]
self.ld = join(IAR_BIN, "ilinkarm") self.ld = [join(IAR_BIN, "ilinkarm")]
self.ar = join(IAR_BIN, "iarchive") self.ar = join(IAR_BIN, "iarchive")
self.elf2bin = join(IAR_BIN, "ielftool") self.elf2bin = join(IAR_BIN, "ielftool")
@ -203,7 +203,7 @@ class IAR(mbedToolchain):
def link(self, output, objects, libraries, lib_dirs, mem_map): def link(self, output, objects, libraries, lib_dirs, mem_map):
# Build linker command # Build linker command
map_file = splitext(output)[0] + ".map" map_file = splitext(output)[0] + ".map"
cmd = [self.ld, "-o", output, "--map=%s" % map_file] + objects + libraries + self.flags['ld'] cmd = self.ld + [ "-o", output, "--map=%s" % map_file] + objects + libraries + self.flags['ld']
if mem_map: if mem_map:
cmd.extend(["--config", mem_map]) cmd.extend(["--config", mem_map])