Next, your module should always import the DMBS `CORE` module, via the
following:
- # Conditionally import the CORE module of DMBS if it is not already imported
+ # Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
- ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
- endif
+ include $(DMBS_MODULE_PATH)/core.mk
This ensures that the `make help` target is always available. In addition, the
`CORE` module exposes some [commonly used macros and variables](core.md) to
DMBS_BUILD_PROVIDED_VARS +=
DMBS_BUILD_PROVIDED_MACROS +=
-# Conditionally import the CORE module of DMBS if it is not already imported
+# Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
-endif
+include $(DMBS_MODULE_PATH)/core.mk
# Default values of optionally user-supplied variables
ATPROGRAM_PROGRAMMER ?= atmelice
<table>
<tbody>
<tr>
+ <td>avrdude-lfuse</td>
+ <td>Program the device low fuse. Requires AVRDUDE_LFUSE variable set.</td>
+ </tr>
+ <tr>
+ <td>avrdude-hfuse</td>
+ <td>Program the device high fuse. Requires AVRDUDE_HFUSE variable set.</td>
+ </tr>
+ <tr>
+ <td>avrdude-efuse</td>
+ <td>Program the device extended fuse. Requires AVRDUDE_EFUSE variable set.</td>
+ </tr>
+ <tr>
+ <td>avrdude-lock</td>
+ <td>Program the device lock bits. Requires AVRDUDE_LOCK variable set.</td>
+ </tr>
+ <tr>
+ <td>avrdude-fuses</td>
+ <td>Program the device fuses (lfuse, hfuse, efuse, lock bits).</td>
+ </tr>
+ <tr>
<td>avrdude</td>
<td>Program the device FLASH memory with the application's executable data.</td>
</tr>
<td>avrdude-ee</td>
<td>Program the device EEPROM memory with the application's EEPROM data.</td>
</tr>
+ <tr>
+ <td>avrdude-all</td>
+ <td>Same as avrdude + avrdude-fuses.</td>
+ </tr>
+ <tr>
+ <td>avrdude-all-ee</td>
+ <td>Same as avrdude + avrdude-ee + avrdude-fuses.</td>
+ </tr>
</tbody>
</table>
<td>AVRDUDE_MEMORY</td>
<td>Memory space to program when executing the `avrdude` target (e.g. 'application` for an XMEGA device). Default is `flash`.</td>
</tr>
+ <td>AVRDUDE_BAUD</td>
+ <td>Baud rate to use when executing the `avrdude` target (e.g. '115200` for an Optiboot device). Default is empty.</td>
+ </tr>
+ </tr>
+ <td>AVRDUDE_HFUSE</td>
+ <td>Fuse setting to use when executing the `avrdude-hfuse` target (format: 0x??). Default is empty.</td>
+ </tr>
+ </tr>
+ <td>AVRDUDE_EFUSE</td>
+ <td>Fuse setting to use when executing the `avrdude-efuse` target (format: 0x??). Default is empty.</td>
+ </tr>
+ </tr>
+ <td>AVRDUDE_LFUSE</td>
+ <td>Fuse setting to use when executing the `avrdude-lfuse` target (format: 0x??). Default is empty.</td>
+ </tr>
+ </tr>
+ <td>AVRDUDE_LOCK</td>
+ <td>Bit bits setting to use when executing the `avrdude-lock` target (format: 0x??). Default is empty.</td>
+ </tr>
</tbody>
</table>
#
DMBS_BUILD_MODULES += AVRDUDE
-DMBS_BUILD_TARGETS += avrdude avrdude-ee
+DMBS_BUILD_TARGETS += avrdude-lfuse avrdude-hfuse avrdude-efuse avrdude-lock avrdude-fuses
+DMBS_BUILD_TARGETS += avrdude avrdude-ee avrdude-all avrdude-all-ee
DMBS_BUILD_MANDATORY_VARS += MCU TARGET
-DMBS_BUILD_OPTIONAL_VARS += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS AVRDUDE_MEMORY
+DMBS_BUILD_OPTIONAL_VARS += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS AVRDUDE_MEMORY AVRDUDE_BAUD
+DMBS_BUILD_OPTIONAL_VARS += AVRDUDE_LFUSE AVRDUDE_HFUSE AVRDUDE_EUSE AVRDUDE_LOCK
DMBS_BUILD_PROVIDED_VARS +=
DMBS_BUILD_PROVIDED_MACROS +=
-# Conditionally import the CORE module of DMBS if it is not already imported
+# Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
-endif
+include $(DMBS_MODULE_PATH)/core.mk
# Default values of optionally user-supplied variables
AVRDUDE_PROGRAMMER ?= jtagicemkii
AVRDUDE_PORT ?= usb
AVRDUDE_FLAGS ?=
AVRDUDE_MEMORY ?= flash
+AVRDUDE_LFUSE ?=
+AVRDUDE_HFUSE ?=
+AVRDUDE_EFUSE ?=
+AVRDUDE_LOCK ?=
+AVRDUDE_BAUD ?=
# Sanity check user supplied values
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
# Construct base avrdude command flags
BASE_AVRDUDE_FLAGS := -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+ifneq ($(AVRDUDE_BAUD),)
+ BASE_AVRDUDE_FLAGS += -b $(AVRDUDE_BAUD)
+endif
# Programs in the target FLASH memory using AVRDUDE
avrdude: $(TARGET).hex $(MAKEFILE_LIST)
@echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" EEPROM using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\"
avrdude $(BASE_AVRDUDE_FLAGS) -U eeprom:w:$< $(AVRDUDE_FLAGS)
+# Programs in the target fuses using AVRDUDE
+avrdude-lfuse: $(MAKEFILE_LIST)
+ @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" low fuse using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\"
+ $(call ERROR_IF_EMPTY, AVRDUDE_LFUSE)
+ avrdude $(BASE_AVRDUDE_FLAGS) -Ulfuse:w:$(AVRDUDE_LFUSE):m $(AVRDUDE_FLAGS)
+
+avrdude-hfuse: $(MAKEFILE_LIST)
+ @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" high fuse using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\"
+ $(call ERROR_IF_EMPTY, AVRDUDE_HFUSE)
+ avrdude $(BASE_AVRDUDE_FLAGS) -Uhfuse:w:$(AVRDUDE_HFUSE):m $(AVRDUDE_FLAGS)
+
+avrdude-efuse: $(MAKEFILE_LIST)
+ @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" extended fuse using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\"
+ $(call ERROR_IF_EMPTY, AVRDUDE_EFUSE)
+ avrdude $(BASE_AVRDUDE_FLAGS) -Uefuse:w:$(AVRDUDE_EFUSE):m $(AVRDUDE_FLAGS)
+
+avrdude-lock: $(MAKEFILE_LIST)
+ @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" lock bits using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\"
+ $(call ERROR_IF_EMPTY, AVRDUDE_LOCK)
+ avrdude $(BASE_AVRDUDE_FLAGS) -Ulock:w:$(AVRDUDE_LOCK):m $(AVRDUDE_FLAGS)
+
+avrdude-fuses: avrdude-lfuse avrdude-hfuse avrdude-efuse avrdude-lock
+
+avrdude-all: avrdude avrdude-fuses
+
+avrdude-all-ee: avrdude avrdude-ee avrdude-fuses
+
# Phony build targets for this module
.PHONY: $(DMBS_BUILD_TARGETS)
+# Include Guard
+ifeq ($(filter CORE, $(DMBS_BUILD_MODULES)),)
+
#
# DMBS Build System
# Released into the public domain.
SHELL = /bin/sh
# Current DMBS release version
-DMBS_VERSION := 20170426
+DMBS_VERSION := 20171231
# Macro to check the DMBS version, aborts if the given DMBS version is below the current version
DMBS_CHECK_VERSION ?= $(if $(filter-out 0, $(shell test $(DMBS_VERSION) -lt $(1); echo $$?)), , $(error DMBS version $(1) or newer required, current version is $(DMBS_VERSION)))
# Phony build targets for this module
.PHONY: $(DMBS_BUILD_TARGETS)
+
+endif
DMBS_BUILD_PROVIDED_VARS +=
DMBS_BUILD_PROVIDED_MACROS +=
-# Conditionally import the CORE module of DMBS if it is not already imported
+# Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
-endif
+include $(DMBS_MODULE_PATH)/core.mk
# Default values of optionally user-supplied variables
CPPCHECK_INCLUDES ?=
DMBS_BUILD_PROVIDED_VARS +=
DMBS_BUILD_PROVIDED_MACROS +=
-# Conditionally import the CORE module of DMBS if it is not already imported
+# Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
-endif
+include $(DMBS_MODULE_PATH)/core.mk
# Sanity-check values of mandatory user-supplied variables
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
DMBS_BUILD_PROVIDED_VARS +=
DMBS_BUILD_PROVIDED_MACROS +=
-# Conditionally import the CORE module of DMBS if it is not already imported
+# Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
-endif
+include $(DMBS_MODULE_PATH)/core.mk
# Default values of optionally user-supplied variables
DOXYGEN_CONF ?= doxyfile
doxygen-create: $(MAKEFILE_LIST)
@echo $(MSG_DOXYGEN_CMD) Creating new configuration file \"$(DOXYGEN_CONF)\" with latest template
doxygen -g $(DOXYGEN_CONF) > /dev/null
-
-
<td>Boolean, if `Y` jump tables will be enabled to slightly reduce the resulting binary's size - note that this can cause incorrect jumps if the binary is relocated after compilation, such as for a bootloader. Default is `N`.</td>
</tr>
<tr>
+ <td>LTO</td>
+ <td>Boolean, if `Y` link time optimization will be enabled to reduce the resulting binary's size. For larger projects you might also want to add `-mcall-prologues` to the `CC_FLAGS`. Default is `N`.</td>
+ </tr>
+ <tr>
<td>OBJDIR</td>
<td>Directory to store the intermediate object files, as they are generated from the source files. Default is `obj`.</td>
</tr>
DMBS_BUILD_MODULES += GCC
DMBS_BUILD_TARGETS += size symbol-sizes all lib elf bin hex lss clean mostlyclean
DMBS_BUILD_MANDATORY_VARS += TARGET ARCH MCU SRC
-DMBS_BUILD_OPTIONAL_VARS += COMPILER_PATH OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL LINKER_RELAXATIONS JUMP_TABLES
+DMBS_BUILD_OPTIONAL_VARS += COMPILER_PATH OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS
+DMBS_BUILD_OPTIONAL_VARS += CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE
+DMBS_BUILD_OPTIONAL_VARS += DEBUG_LEVEL LINKER_RELAXATIONS JUMP_TABLES LTO
DMBS_BUILD_PROVIDED_VARS +=
DMBS_BUILD_PROVIDED_MACROS +=
-# Conditionally import the CORE module of DMBS if it is not already imported
+# Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
-endif
+include $(DMBS_MODULE_PATH)/core.mk
# Default values of optionally user-supplied variables
COMPILER_PATH ?=
DEBUG_LEVEL ?= 2
LINKER_RELAXATIONS ?= Y
JUMP_TABLES ?= N
+LTO ?= N
# Sanity check user supplied values
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
$(call ERROR_IF_EMPTY, DEBUG_LEVEL)
$(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS)
$(call ERROR_IF_NONBOOL, JUMP_TABLES)
+$(call ERROR_IF_NONBOOL, LTO)
# Determine the utility prefix to use for the selected architecture
ifeq ($(ARCH), AVR8)
# Create a list of common flags to pass to the compiler/linker/assembler
BASE_CC_FLAGS := -pipe -g$(DEBUG_FORMAT) -g$(DEBUG_LEVEL)
ifneq ($(findstring $(ARCH), AVR8 XMEGA),)
- BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct
+ BASE_C_FLAGS += -fpack-struct
+ BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions
else ifneq ($(findstring $(ARCH), UC3),)
BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos
endif
# in a pseudo-random jump target.
BASE_CC_FLAGS += -fno-jump-tables
endif
+ifeq ($(LTO), Y)
+ # Enable link time optimization to reduce overall flash size.
+ BASE_CC_FLAGS += -flto -fuse-linker-plugin
+ BASE_LD_FLAGS += -flto -fuse-linker-plugin
+endif
# Additional language specific compiler flags
BASE_C_FLAGS := -x c -O$(OPTIMIZATION) -std=$(C_STANDARD) -Wstrict-prototypes
-BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD)
+BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD) -fno-exceptions -fno-threadsafe-statics
BASE_ASM_FLAGS := -x assembler-with-cpp
# Create a list of flags to pass to the linker
# Compiles an input C source file and generates an assembly listing for it
%.s: %.c $(MAKEFILE_LIST)
@echo $(MSG_COMPILE_CMD) Generating assembly from C file \"$(notdir $<)\"
- $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $< -o $@
+ $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $($(notdir $<)_FLAGS) $< -o $@
# Compiles an input C++ source file and generates an assembly listing for it
%.s: %.cpp $(MAKEFILE_LIST)
@echo $(MSG_COMPILE_CMD) Generating assembly from C++ file \"$(notdir $<)\"
- $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $< -o $@
+ $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $($(notdir $<)_FLAGS) $< -o $@
# Compiles an input C source file and generates a linkable object file for it
$(OBJDIR)/%.o: %.c $(MAKEFILE_LIST)
@echo $(MSG_COMPILE_CMD) Compiling C file \"$(notdir $<)\"
- $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@
+ $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $($(notdir $<)_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@
# Compiles an input C++ source file and generates a linkable object file for it
$(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST)
@echo $(MSG_COMPILE_CMD) Compiling C++ file \"$(notdir $<)\"
- $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@
+ $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $($(notdir $<)_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@
# Assembles an input ASM source file and generates a linkable object file for it
$(OBJDIR)/%.o: %.S $(MAKEFILE_LIST)
@echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\"
- $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@
+ $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) $($(notdir $<)_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@
# Generates a library archive file from the user application, which can be linked into other applications
.PRECIOUS : $(OBJECT_FILES)
DMBS_BUILD_PROVIDED_VARS +=
DMBS_BUILD_PROVIDED_MACROS +=
-# Conditionally import the CORE module of DMBS if it is not already imported
+# Import the CORE module of DMBS
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
- include $(DMBS_MODULE_PATH)/core.mk
-endif
+include $(DMBS_MODULE_PATH)/core.mk
# Sanity-check values of mandatory user-supplied variables
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
MSG_OBJCPY_CMD := ' [OBJCPY] :'
MSG_MAKE_CMD := ' [MAKE] :'
+# Set MAKE variable if the environment does not already define it
+MAKE ?= make
+
# Programs in the target FLASH memory using the HID_BOOTLOADER_CLI tool
hid: $(TARGET).hex $(MAKEFILE_LIST)
@echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with hid_bootloader_cli using \"$<\"
--- /dev/null
+#
+# DMBS Build System
+# Released into the public domain.
+#
+# dean [at] fourwalledcubicle [dot] com
+# www.fourwalledcubicle.com
+#
+
+# Include Guard
+ifeq ($(filter TEMPLATE_LIB, $(DMBS_BUILD_MODULES)),)
+
+# Sanity check user supplied DMBS path
+ifndef DMBS_PATH
+$(error Makefile DMBS_PATH option cannot be blank)
+endif
+
+# Location of the current module
+TEMPLATE_LIB_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
+
+# Import the CORE module of DMBS
+include $(DMBS_PATH)/core.mk
+
+# This module needs to be included before gcc.mk
+ifneq ($(findstring GCC, $(DMBS_BUILD_MODULES)),)
+$(error Include this module before gcc.mk)
+endif
+
+# Help settings
+DMBS_BUILD_MODULES += TEMPLATE_LIB
+DMBS_BUILD_TARGETS +=
+DMBS_BUILD_MANDATORY_VARS += DMBS_PATH
+DMBS_BUILD_OPTIONAL_VARS +=
+DMBS_BUILD_PROVIDED_VARS += TEMPLATE_LIB_SRC
+DMBS_BUILD_PROVIDED_MACROS +=
+
+# Sanity check user supplied values
+$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
+
+# TEMPLATE_LIB Library
+TEMPLATE_LIB_SRC := $(TEMPLATE_LIB_MODULE_PATH)/src/template_lib.c
+
+# Compiler flags and sources
+SRC += $(TEMPLATE_LIB_SRC)
+CC_FLAGS += -DDMBS_MODULE_TEMPLATE_LIB
+CC_FLAGS += -I$(TEMPLATE_LIB_MODULE_PATH)/include/
+
+# Phony build targets for this module
+.PHONY: $(DMBS_BUILD_TARGETS)
+
+endif
--- /dev/null
+/*
+ DMBS Build System
+ Released into the public domain.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+ */
+
+// Include Guard
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Software version
+#define TEMPLATE_LIB_VERSION 100
+
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null
+/*
+ DMBS Build System
+ Released into the public domain.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+ */
+
+#include "template_lib.h"
+#include "template_lib_private.h"
--- /dev/null
+/*
+ DMBS Build System
+ Released into the public domain.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+ */
+
+// Include Guard
+#pragma once
+
+#include <stdint.h>
+#include <stddef.h>
+#include <avr/io.h>
# Default target
all:
-# Include DMBS build script makefiles
+# Include libraries and DMBS build script makefiles
DMBS_PATH ?= ../DMBS
+LIB_PATH ?= lib
+
+include $(LIB_PATH)/TEMPLATE_LIB/TEMPLATE_LIB.mk
+
include $(DMBS_PATH)/core.mk
include $(DMBS_PATH)/gcc.mk
include $(DMBS_PATH)/cppcheck.mk