Replace LUFA build system with its successor, DMBS, for easier maintenance.pull/1469/head
@ -0,0 +1,9 @@
|
|||||||
|
*.lss
|
||||||
|
*.bin
|
||||||
|
*.elf
|
||||||
|
*.hex
|
||||||
|
*.eep
|
||||||
|
*.map
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.sym
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
DMBS Build System
|
||||||
|
Released into the public domain.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.fourwalledcubicle.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
*
|
||||||
|
* Special application to extract an EEPROM image stored in FLASH memory, and
|
||||||
|
* copy it to the device EEPROM. This application is designed to be used with
|
||||||
|
* the HID build system module of DMBS to program the EEPROM of a target device
|
||||||
|
* that uses the HID bootloader protocol, which does not have native EEPROM
|
||||||
|
* programming support.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
/* References to the binary EEPROM data linked in the AVR's FLASH memory space */
|
||||||
|
extern const char _binary_InputEEData_bin_start[];
|
||||||
|
extern const char _binary_InputEEData_bin_end[];
|
||||||
|
extern const char _binary_InputEEData_bin_size[];
|
||||||
|
|
||||||
|
/* Friendly names for the embedded binary data stored in FLASH memory space */
|
||||||
|
#define InputEEData _binary_InputEEData_bin_start
|
||||||
|
#define InputEEData_size ((int)_binary_InputEEData_bin_size)
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
/* Copy out the embedded EEPROM data from FLASH to EEPROM memory space */
|
||||||
|
for (uint16_t i = 0; i < InputEEData_size; i++)
|
||||||
|
eeprom_update_byte((uint8_t*)i, pgm_read_byte(&InputEEData[i]));
|
||||||
|
|
||||||
|
/* Infinite loop once complete */
|
||||||
|
for (;;);
|
||||||
|
}
|
@ -1,42 +1,35 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# DMBS Build System
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Released into the public domain.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.fourwalledcubicle.com
|
||||||
#
|
#
|
||||||
# --------------------------------------
|
|
||||||
# LUFA Project Makefile.
|
# Run "make help" for target help.
|
||||||
# --------------------------------------
|
|
||||||
|
MCU = atmega128
|
||||||
# Run "make help" for target help.
|
ARCH = AVR8
|
||||||
|
F_CPU = 1000000
|
||||||
MCU = at90usb1287
|
OPTIMIZATION = s
|
||||||
ARCH = AVR8
|
TARGET = HID_EEPROM_Loader
|
||||||
F_CPU = 1000000
|
SRC = $(TARGET).c
|
||||||
F_USB = $(F_CPU)
|
CC_FLAGS =
|
||||||
OPTIMIZATION = s
|
LD_FLAGS =
|
||||||
TARGET = HID_EEPROM_Loader
|
OBJECT_FILES = InputEEData.o
|
||||||
SRC = $(TARGET).c
|
|
||||||
LUFA_PATH = ../../../LUFA
|
# Default target
|
||||||
CC_FLAGS =
|
all:
|
||||||
LD_FLAGS =
|
|
||||||
OBJECT_FILES = InputEEData.o
|
# Determine the AVR sub-architecture of the build main application object file
|
||||||
|
FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)
|
||||||
# Default target
|
|
||||||
all:
|
# Create a linkable object file with the input binary EEPROM data stored in the FLASH section
|
||||||
|
InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)
|
||||||
# Determine the AVR sub-architecture of the build main application object file
|
@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"
|
||||||
FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)
|
avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@
|
||||||
|
|
||||||
# Create a linkable object file with the input binary EEPROM data stored in the FLASH section
|
# Include LUFA build script makefiles
|
||||||
InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)
|
include ../core.mk
|
||||||
@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"
|
include ../gcc.mk
|
||||||
avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@
|
include ../hid.mk
|
||||||
|
|
||||||
# Include LUFA build script makefiles
|
|
||||||
include $(LUFA_PATH)/Build/lufa_core.mk
|
|
||||||
include $(LUFA_PATH)/Build/lufa_build.mk
|
|
||||||
include $(LUFA_PATH)/Build/lufa_cppcheck.mk
|
|
||||||
include $(LUFA_PATH)/Build/lufa_doxygen.mk
|
|
||||||
include $(LUFA_PATH)/Build/lufa_hid.mk
|
|
@ -0,0 +1,32 @@
|
|||||||
|
DMBS Build System
|
||||||
|
Released into the public domain.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.fourwalledcubicle.com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
@ -0,0 +1,38 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Modules Overview
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The following modules are currently included:
|
||||||
|
|
||||||
|
- [ATPROGRAM](atprogram.md) - Device Programming
|
||||||
|
- [AVRDUDE](avrdude.md) - Device Programming
|
||||||
|
- [CORE](core.md) - DMBS Core Functionality
|
||||||
|
- [CPPCHECK](cppcheck.md) - Static Code Analysis
|
||||||
|
- [DFU](dfu.md) - Device Programming
|
||||||
|
- [DOXYGEN](doxygen.md) - Automated Source Code Documentation
|
||||||
|
- [GCC](gcc.md) - Compiling/Assembling/Linking with GCC
|
||||||
|
- [HID](hid.md) - Device Programming
|
||||||
|
|
||||||
|
## Importing modules into your project makefile
|
||||||
|
|
||||||
|
To use a module, it is recommended to add the following boilerplate to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
# Include DMBS build script makefiles
|
||||||
|
DMBS_PATH ?= ../DMBS
|
||||||
|
|
||||||
|
Which can then used to indicate the location of your DMBS installation, relative
|
||||||
|
to the current directory, when importing modules. For example:
|
||||||
|
|
||||||
|
DMBS_PATH ?= ../DMBS
|
||||||
|
include $(DMBS_PATH)/core.mk
|
||||||
|
include $(DMBS_PATH)/gcc.mk
|
||||||
|
|
||||||
|
Imports the `CORE` and `GCC` modules from DMBS using a single path relative to
|
||||||
|
your project's makefile.
|
||||||
|
|
||||||
|
If you wish to write your own DMBS module(s),
|
||||||
|
[see the documentation here for more details.](WritingYourOwnModules.md)
|
@ -0,0 +1,94 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Writing Your Own Modules
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
A DMBS module consists of the several boilerplate sections, explained below.
|
||||||
|
|
||||||
|
## The DMBS module hooks
|
||||||
|
|
||||||
|
Your module needs to advertise to DMBS its name, its makefile targets, the
|
||||||
|
required and optional variables, and the variables and macros the module
|
||||||
|
provides for use elsewhere. This is achieved with the following section:
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += EXAMPLE
|
||||||
|
DMBS_BUILD_TARGETS += example-target another-target
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += MANDATORY_NAME ALSO_MANDATORY
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS += OPTIONAL_NAME ALSO_OPTIONAL
|
||||||
|
DMBS_BUILD_PROVIDED_VARS += MEANING_OF_LIFE
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS += STRIP_WHITESPACE
|
||||||
|
|
||||||
|
The example above declares that this module is called `EXAMPLE`, and exposes the
|
||||||
|
listed targets, variable requirements and provides variables and macros.
|
||||||
|
|
||||||
|
Your module name and provided variable/macro names must be unique, however you
|
||||||
|
can (and should) re-use variable names where appropriate if they apply to
|
||||||
|
several modules (such as `ARCH` to specify the project's microcontroller
|
||||||
|
architecture). Re-using targets is not recommended, but can be used to extend
|
||||||
|
the dependencies of another module's targets.
|
||||||
|
|
||||||
|
## Importing the CORE module
|
||||||
|
|
||||||
|
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
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
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
|
||||||
|
your module.
|
||||||
|
|
||||||
|
## Setting optional variable's defaults
|
||||||
|
|
||||||
|
If a variable is optional, you should provide a default value. Do this via the
|
||||||
|
`?=` operator of `make`, which sets a variable's value if it has not yet been
|
||||||
|
set:
|
||||||
|
|
||||||
|
MY_OPTIONAL_VARIABLE ?= some_default_value
|
||||||
|
|
||||||
|
## Sanity checking user input
|
||||||
|
|
||||||
|
Sanity checks are what make DMBS useful. Where possible, validate user input and
|
||||||
|
convert generated errors to human-friendly messages. This can be achieved by
|
||||||
|
enforcing that all the declared module mandatory variables have been set by the
|
||||||
|
user:
|
||||||
|
|
||||||
|
# Sanity-check values of mandatory user-supplied variables
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
|
||||||
|
As well as complaining if they are set, but currently empty:
|
||||||
|
$(call ERROR_IF_EMPTY, SOME_MANDATORY_VARIABLE)
|
||||||
|
$(call ERROR_IF_EMPTY, SOME_OPTIONAL_BUT_NON_EMPTY_VARIABLE)
|
||||||
|
|
||||||
|
Or even if they are boolean (`Y` or `N`) variables that have an invalid value:
|
||||||
|
|
||||||
|
$(call ERROR_IF_NONBOOL, SOME_BOOL_VARIABLE)
|
||||||
|
|
||||||
|
## Adding targets
|
||||||
|
|
||||||
|
The meat of a DMBS module is the targets, which are run when the user types
|
||||||
|
`make {target name}` from the command line. These can be as complex or simple
|
||||||
|
as you like. See the GNU make manual for information on writing make targets.
|
||||||
|
|
||||||
|
example-target:
|
||||||
|
echo "Your DMBS module works!"
|
||||||
|
|
||||||
|
## And finally, list the PHONYs
|
||||||
|
|
||||||
|
Important in GNU Make is the concept of phony targets; this special directive
|
||||||
|
tells make that a given target should never be considered a valid file. Listing
|
||||||
|
phonies ensures that, for example, if your module had a target called `build`,
|
||||||
|
it would always run when the user types `make build` from the command line, even
|
||||||
|
if a file called `build` existed in the user project folder.
|
||||||
|
|
||||||
|
You can list module-internal targets here, as well as mark all public targets
|
||||||
|
via the module header's `DMBS_BUILD_TARGETS` variable.
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: $(DMBS_BUILD_TARGETS) some-module-internal-target another-internal-target
|
@ -0,0 +1,119 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: ATPROGRAM
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The ATPROGRAM module provides build targets for use with the official
|
||||||
|
`ATPROGRAM` back-end utility distributed with the free
|
||||||
|
[Atmel Studio](http://www.atmel.com) software released by Atmel.
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/atprogram.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
This module requires the `atprogram.exe` utility to be available in your
|
||||||
|
system's `PATH` variable. The `atprogram.exe` utility is distributed in Atmel
|
||||||
|
Studio (usually) inside the application install folder's `atbackend`
|
||||||
|
subdirectory.
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>atprogram</td>
|
||||||
|
<td>Program the device FLASH memory with the application's executable data.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>atprogram-ee</td>
|
||||||
|
<td>Program the device EEPROM memory with the application's EEPROM data.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>MCU</td>
|
||||||
|
<td>Name of the Atmel processor model (e.g. `at90usb1287`).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>TARGET</td>
|
||||||
|
<td>Name of the application output file prefix (e.g. `TestApplication`).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>ATPROGRAM_PROGRAMMER</td>
|
||||||
|
<td>Name of the Atmel programmer or debugger tool to communicate with (e.g. `jtagice3`). Default is `atmelice`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ATPROGRAM_INTERFACE</td>
|
||||||
|
<td>Name of the programming interface to use when programming the target (e.g. `spi`). Default is `jtag`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ATPROGRAM_PORT</td>
|
||||||
|
<td>Name of the communication port to use when when programming with a serially connected tool (e.g. `COM2`). Default is `usb`.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no macros.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,68 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += ATPROGRAM
|
||||||
|
DMBS_BUILD_TARGETS += atprogram atprogram-ee
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += MCU TARGET
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS += ATPROGRAM_PROGRAMMER ATPROGRAM_INTERFACE ATPROGRAM_PORT
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
# Conditionally import the CORE module of DMBS if it is not already imported
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Default values of optionally user-supplied variables
|
||||||
|
ATPROGRAM_PROGRAMMER ?= atmelice
|
||||||
|
ATPROGRAM_INTERFACE ?= jtag
|
||||||
|
ATPROGRAM_PORT ?=
|
||||||
|
|
||||||
|
# Sanity check user supplied values
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, MCU)
|
||||||
|
$(call ERROR_IF_EMPTY, TARGET)
|
||||||
|
$(call ERROR_IF_EMPTY, ATPROGRAM_PROGRAMMER)
|
||||||
|
$(call ERROR_IF_EMPTY, ATPROGRAM_INTERFACE)
|
||||||
|
|
||||||
|
# Output Messages
|
||||||
|
MSG_ATPROGRAM_CMD := ' [ATPRGRM] :'
|
||||||
|
|
||||||
|
# Construct base atprogram command flags
|
||||||
|
BASE_ATPROGRAM_FLAGS := --tool $(ATPROGRAM_PROGRAMMER) --interface $(ATPROGRAM_INTERFACE) --device $(MCU)
|
||||||
|
ifneq ($(ATPROGRAM_PORT),)
|
||||||
|
BASE_ATPROGRAM_FLAGS += --port $(ATPROGRAM_PORT)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Construct the flags to use for the various memory spaces
|
||||||
|
ifeq ($(ARCH), AVR8)
|
||||||
|
ATPROGRAM_FLASH_FLAGS := --chiperase --flash
|
||||||
|
ATPROGRAM_EEPROM_FLAGS := --eeprom
|
||||||
|
else ifeq ($(ARCH), XMEGA)
|
||||||
|
ATPROGRAM_FLASH_FLAGS := --erase --flash
|
||||||
|
ATPROGRAM_EEPROM_FLAGS := --eeprom
|
||||||
|
else ifeq ($(ARCH), UC3)
|
||||||
|
ATPROGRAM_FLASH_FLAGS := --erase
|
||||||
|
ATPROGRAM_EEPROM_FLAGS := --eeprom
|
||||||
|
else
|
||||||
|
$(error Unsupported architecture "$(ARCH)")
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Programs in the target FLASH memory using ATPROGRAM
|
||||||
|
atprogram: $(TARGET).elf $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" FLASH using \"$(ATPROGRAM_PROGRAMMER)\"
|
||||||
|
atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_FLASH_FLAGS) --file $<
|
||||||
|
|
||||||
|
# Programs in the target EEPROM memory using ATPROGRAM
|
||||||
|
atprogram-ee: $(TARGET).elf $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" EEPROM using \"$(ATPROGRAM_PROGRAMMER)\"
|
||||||
|
atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_EEPROM_FLAGS) --file $<
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: $(DMBS_BUILD_TARGETS)
|
@ -0,0 +1,124 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: AVRDUDE
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The AVRDUDE module provides build targets for use with the official
|
||||||
|
open source `AVRDUDE` programmer utility, for the reprogramming of Atmel devices
|
||||||
|
using a wide variety of official and non-official programming devices and
|
||||||
|
bootloaders.
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/avrdude.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
This module requires the `avrdude` utility to be available in your
|
||||||
|
system's `PATH` variable. The `avrdude` utility is distributed on the project's
|
||||||
|
[official site](https://savannah.nongnu.org/projects/avrdude) but is also
|
||||||
|
made available in many *nix operating system's package managers.
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>avrdude</td>
|
||||||
|
<td>Program the device FLASH memory with the application's executable data.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>avrdude-ee</td>
|
||||||
|
<td>Program the device EEPROM memory with the application's EEPROM data.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>MCU</td>
|
||||||
|
<td>Name of the Atmel processor model (e.g. `at90usb1287`).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>TARGET</td>
|
||||||
|
<td>Name of the application output file prefix (e.g. `TestApplication`).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>AVRDUDE_PROGRAMMER</td>
|
||||||
|
<td>Name of the programmer/debugger tool or bootloader to communicate with (e.g. `jtagicemkii`). Default is `jtagicemkii`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>AVRDUDE_PORT</td>
|
||||||
|
<td>Name of the communication port to use when when programming with a serially connected tool (e.g. `COM2`). Default is `usb`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>AVRDUDE_FLAGS</td>
|
||||||
|
<td>Additional flags to pass to `avrdude` when invoking the tool. Default is empty (no additional flags).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<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>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no macros.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,52 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += AVRDUDE
|
||||||
|
DMBS_BUILD_TARGETS += avrdude avrdude-ee
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += MCU TARGET
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS AVRDUDE_MEMORY
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
# Conditionally import the CORE module of DMBS if it is not already imported
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Default values of optionally user-supplied variables
|
||||||
|
AVRDUDE_PROGRAMMER ?= jtagicemkii
|
||||||
|
AVRDUDE_PORT ?= usb
|
||||||
|
AVRDUDE_FLAGS ?=
|
||||||
|
AVRDUDE_MEMORY ?= flash
|
||||||
|
|
||||||
|
# Sanity check user supplied values
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, MCU)
|
||||||
|
$(call ERROR_IF_EMPTY, TARGET)
|
||||||
|
$(call ERROR_IF_EMPTY, AVRDUDE_PROGRAMMER)
|
||||||
|
$(call ERROR_IF_EMPTY, AVRDUDE_PORT)
|
||||||
|
|
||||||
|
# Output Messages
|
||||||
|
MSG_AVRDUDE_CMD := ' [AVRDUDE] :'
|
||||||
|
|
||||||
|
# Construct base avrdude command flags
|
||||||
|
BASE_AVRDUDE_FLAGS := -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
|
|
||||||
|
# Programs in the target FLASH memory using AVRDUDE
|
||||||
|
avrdude: $(TARGET).hex $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" FLASH using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\"
|
||||||
|
avrdude $(BASE_AVRDUDE_FLAGS) -U $(AVRDUDE_MEMORY):w:$< $(AVRDUDE_FLAGS)
|
||||||
|
|
||||||
|
# Programs in the target EEPROM memory using AVRDUDE
|
||||||
|
avrdude-ee: $(TARGET).eep $(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)
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: $(DMBS_BUILD_TARGETS)
|
@ -0,0 +1,136 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: CORE
|
||||||
|
------------
|
||||||
|
|
||||||
|
The CORE module provides the core DMBS infrastructure used by other DMBS
|
||||||
|
modules, and must always be imported. Additionally, this module provides the
|
||||||
|
help system for DMBS.
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/core.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>help</td>
|
||||||
|
<td>Show help for the current project, including a list of all available targets, variables and macros from the imported modules.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>list_targets</td>
|
||||||
|
<td>Show a list of all build targets from the imported modules.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>list_modules</td>
|
||||||
|
<td>Show a list of all imported modules.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>list_mandatory</td>
|
||||||
|
<td>Show a list of all mandatory variables from the imported modules.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>list_optional</td>
|
||||||
|
<td>Show a list of all optional variables from the imported modules.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>list_provided</td>
|
||||||
|
<td>Show a list of all variables provided by the imported modules.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>list_macros</td>
|
||||||
|
<td>Show a list of all macros provided by the imported modules.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module has no mandatory variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module has no optional variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>DMBS_VERSION</td>
|
||||||
|
<td>Current version of this DMBS release, as a ISO 8601 integer (such as `160403` for `2016-04-03`).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>DMBS_CHECK_VERSION</td>
|
||||||
|
<td>Macro to check the current DMBS version against the first argument and abort if the required version is newer than the current version.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ERROR_IF_UNSET</td>
|
||||||
|
<td>Macro to check the given makefile variable name passed as the first argument, and abort if it has not been set by any makefile module.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ERROR_IF_EMPTY</td>
|
||||||
|
<td>Macro to check the given makefile variable name passed as the first argument, and abort if it has an empty value.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ERROR_IF_NONBOOL</td>
|
||||||
|
<td>Macro to check the given makefile variable name passed as the first argument, and abort if it has a value other than `Y` or `N`.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,147 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += CORE
|
||||||
|
DMBS_BUILD_TARGETS += help list_targets list_modules list_mandatory list_optional list_provided list_macros
|
||||||
|
DMBS_BUILD_MANDATORY_VARS +=
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_VARS += DMBS_VERSION
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS += DMBS_CHECK_VERSION ERROR_IF_UNSET ERROR_IF_EMPTY ERROR_IF_NONBOOL
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
# Current DMBS release version
|
||||||
|
DMBS_VERSION := 20160403
|
||||||
|
|
||||||
|
# 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)))
|
||||||
|
|
||||||
|
# Macros to use in other modules to check various conditions
|
||||||
|
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
||||||
|
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
||||||
|
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
||||||
|
|
||||||
|
# Converts a given input to a printable output using "(None)" if no items are in the list
|
||||||
|
CONVERT_TO_PRINTABLE = $(if $(strip $(1)), $(1), (None))
|
||||||
|
|
||||||
|
# Build sorted and filtered lists of the included build module data
|
||||||
|
SORTED_DMBS_BUILD_MODULES = $(sort $(DMBS_BUILD_MODULES))
|
||||||
|
SORTED_DMBS_BUILD_TARGETS = $(sort $(DMBS_BUILD_TARGETS))
|
||||||
|
SORTED_DMBS_MANDATORY_VARS = $(sort $(DMBS_BUILD_MANDATORY_VARS))
|
||||||
|
SORTED_DMBS_OPTIONAL_VARS = $(filter-out $(SORTED_DMBS_MANDATORY_VARS), $(sort $(DMBS_BUILD_OPTIONAL_VARS)))
|
||||||
|
SORTED_DMBS_PROVIDED_VARS = $(sort $(DMBS_BUILD_PROVIDED_VARS))
|
||||||
|
SORTED_DMBS_PROVIDED_MACROS = $(sort $(DMBS_BUILD_PROVIDED_MACROS))
|
||||||
|
|
||||||
|
# Create printable versions of the sorted build module data (use "(None)" when no data is available)
|
||||||
|
PRINTABLE_DMBS_BUILD_MODULES = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_MODULES))
|
||||||
|
PRINTABLE_DMBS_BUILD_TARGETS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_TARGETS))
|
||||||
|
PRINTABLE_DMBS_MANDATORY_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_MANDATORY_VARS))
|
||||||
|
PRINTABLE_DMBS_OPTIONAL_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_OPTIONAL_VARS))
|
||||||
|
PRINTABLE_DMBS_PROVIDED_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_VARS))
|
||||||
|
PRINTABLE_DMBS_PROVIDED_MACROS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_MACROS))
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "==================================================================="
|
||||||
|
@echo " The DMBS Build System "
|
||||||
|
@echo " By Dean Camera { dean @ fourwalledcubicle . com } "
|
||||||
|
@echo "==================================================================="
|
||||||
|
@echo "DESCRIPTION: "
|
||||||
|
@echo " This build system is a set of makefile modules for (GNU) Make, to "
|
||||||
|
@echo " provide a simple system for building DMBS powered applications. "
|
||||||
|
@echo " Each makefile module can be included from within a user makefile, "
|
||||||
|
@echo " to expose the build rules documented in the comments at the top of"
|
||||||
|
@echo " each build module. "
|
||||||
|
@echo " "
|
||||||
|
@echo "USAGE: "
|
||||||
|
@echo " To execute a rule, define all variables indicated in the desired "
|
||||||
|
@echo " module as a required parameter before including the build module "
|
||||||
|
@echo " in your project makefile. Parameters marked as optional will "
|
||||||
|
@echo " assume a default value in the modules if not user-assigned. "
|
||||||
|
@echo " "
|
||||||
|
@echo " By default the target output shows both a friendly summary, as "
|
||||||
|
@echo " well as the actual invoked command. To suppress the output of the "
|
||||||
|
@echo " invoked commands and show only the friendly command output, run "
|
||||||
|
@echo " make with the \"-s\" switch added before the target(s). "
|
||||||
|
@echo "==================================================================="
|
||||||
|
@echo " "
|
||||||
|
@echo " Currently used build system modules in this application: "
|
||||||
|
@echo " "
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%= - %\n)"
|
||||||
|
@echo " "
|
||||||
|
@echo " "
|
||||||
|
@echo " Currently available build targets in this application: "
|
||||||
|
@echo " "
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%= - %\n)"
|
||||||
|
@echo " "
|
||||||
|
@echo " "
|
||||||
|
@echo " Mandatory variables required by the selected build Modules: "
|
||||||
|
@echo " "
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%= - %\n)"
|
||||||
|
@echo " "
|
||||||
|
@echo " "
|
||||||
|
@echo " Optional variables required by the selected build Modules: "
|
||||||
|
@echo " "
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%= - %\n)"
|
||||||
|
@echo " "
|
||||||
|
@echo " "
|
||||||
|
@echo " Variables provided by the selected build Modules: "
|
||||||
|
@echo " "
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%= - %\n)"
|
||||||
|
@echo " "
|
||||||
|
@echo " "
|
||||||
|
@echo " Macros provided by the selected build Modules: "
|
||||||
|
@echo " "
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%= - %\n)"
|
||||||
|
@echo " "
|
||||||
|
@echo "==================================================================="
|
||||||
|
@echo " The DMBS Build System $(DMBS_VERSION) - Making MAKE easier."
|
||||||
|
@echo "==================================================================="
|
||||||
|
|
||||||
|
# Lists build modules included by the project makefile, in alphabetical order
|
||||||
|
list_modules:
|
||||||
|
@echo Currently Used Build System Modules:
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%= - %\n)"
|
||||||
|
|
||||||
|
# Lists build targets included by the project makefile, in alphabetical order
|
||||||
|
list_targets:
|
||||||
|
@echo Currently Available Build Targets:
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%= - %\n)"
|
||||||
|
|
||||||
|
# Lists mandatory variables that must be set by the project makefile, in alphabetical order
|
||||||
|
list_mandatory:
|
||||||
|
@echo Mandatory Variables for Included Modules:
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%= - %\n)"
|
||||||
|
|
||||||
|
# Lists optional variables that must be set by the project makefile, in alphabetical order
|
||||||
|
list_optional:
|
||||||
|
@echo Optional Variables for Included Modules:
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%= - %\n)"
|
||||||
|
|
||||||
|
# Lists variables provided by the included build modules, in alphabetical order
|
||||||
|
list_provided:
|
||||||
|
@echo Variables Provided by the Included Modules:
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%= - %\n)"
|
||||||
|
|
||||||
|
# Lists macros provided by the included build modules, in alphabetical order
|
||||||
|
list_macros:
|
||||||
|
@echo Macros Provided by the Included Modules:
|
||||||
|
@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%= - %\n)"
|
||||||
|
|
||||||
|
# Debugging; "make print-VARNAME" will output the variable VARNAME's value
|
||||||
|
print-%:
|
||||||
|
@printf "%s = %s" $(@:print-%=%) $($(@:print-%=%))
|
||||||
|
|
||||||
|
# Disable default in-built make rules (those that are needed are explicitly
|
||||||
|
# defined, and doing so has performance benefits when recursively building)
|
||||||
|
ifeq ($(filter -r,$(MAKEFLAGS)),)
|
||||||
|
MAKEFLAGS += -r
|
||||||
|
endif
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: $(DMBS_BUILD_TARGETS)
|
@ -0,0 +1,134 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: CPPCHECK
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The CPPCHECK module provides build targets to perform static analysis of the
|
||||||
|
user application, using the open source `cppcheck` tool.
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/cppcheck.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
This module requires the `cppcheck` utility to be available in your system's
|
||||||
|
`PATH` variable. The `cppcheck` utility is distributed on the project's
|
||||||
|
[official site](http://cppcheck.sourceforge.net/) but is also
|
||||||
|
made available in many *nix operating system's package managers.
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>cppcheck</td>
|
||||||
|
<td>Scan the project with CPPCHECK, and show all discovered issues.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>cppcheck-config</td>
|
||||||
|
<td>Check the project with CPPCHECK, to find missing header paths.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>SRC</td>
|
||||||
|
<td>List of all project source files to scan.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_INCLUDES</td>
|
||||||
|
<td>Extra include paths to search, for any missing header files. Default is empty (no additional paths).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_EXCLUDES</td>
|
||||||
|
<td>List of source files, file paths or path fragments to exclude from the scan. Default is empty (no exclusions).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_MSG_TEMPLATE</td>
|
||||||
|
<td>Template for error and warning message output. Default is `{file}:{line}: {severity} ({id}): {message}`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_ENABLE</td>
|
||||||
|
<td>List of CPPCHECK checks to enable. Default is `all`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_SUPPRESS</td>
|
||||||
|
<td>List of CPPCHECK checks to ignore. Default is `variableScope missingInclude`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_FAIL_ON_WARNING</td>
|
||||||
|
<td>Boolean, if `Y` the build will fail if CPPCHECK discovers any errors or warnings. If `N`, fail only on errors. Default is `Y`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_QUIET</td>
|
||||||
|
<td>Boolean, if `Y` CPPCHECK will suppress all output except for discovered errors or warnings. If `N`, scan progress will be emitted. Default is `Y`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPPCHECK_FLAGS_</td>
|
||||||
|
<td>Additional flags to pass to CPPCHECK when scans are started. Default is empty (no additional flags).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no macros.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,66 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += CPPCHECK
|
||||||
|
DMBS_BUILD_TARGETS += cppcheck cppcheck-config
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += SRC
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS += CPPCHECK_INCLUDES CPPCHECK_EXCLUDES CPPCHECK_MSG_TEMPLATE CPPCHECK_ENABLE \
|
||||||
|
CPPCHECK_SUPPRESS CPPCHECK_FAIL_ON_WARNING CPPCHECK_QUIET CPPCHECK_FLAGS
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
# Conditionally import the CORE module of DMBS if it is not already imported
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Default values of optionally user-supplied variables
|
||||||
|
CPPCHECK_INCLUDES ?=
|
||||||
|
CPPCHECK_EXCLUDES ?=
|
||||||
|
CPPCHECK_MSG_TEMPLATE ?= {file}:{line}: {severity} ({id}): {message}
|
||||||
|
CPPCHECK_ENABLE ?= all
|
||||||
|
CPPCHECK_SUPPRESS ?= variableScope missingInclude
|
||||||
|
CPPCHECK_FAIL_ON_WARNING ?= Y
|
||||||
|
CPPCHECK_QUIET ?= Y
|
||||||
|
CPPCHECK_FLAGS ?=
|
||||||
|
|
||||||
|
# Sanity check user supplied values
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, SRC)
|
||||||
|
$(call ERROR_IF_EMPTY, CPPCHECK_MSG_TEMPLATE)
|
||||||
|
$(call ERROR_IF_EMPTY, CPPCHECK_ENABLE)
|
||||||
|
$(call ERROR_IF_NONBOOL, CPPCHECK_FAIL_ON_WARNING)
|
||||||
|
$(call ERROR_IF_NONBOOL, CPPCHECK_QUIET)
|
||||||
|
|
||||||
|
# Build a default argument list for cppcheck
|
||||||
|
BASE_CPPCHECK_FLAGS := --template="$(CPPCHECK_MSG_TEMPLATE)" $(CPPCHECK_INCLUDES:%=-I%) $(CPPCHECK_EXCLUDES:%=-i%) --inline-suppr --force --std=c99
|
||||||
|
|
||||||
|
# Sanity check parameters and construct additional command line arguments to cppcheck
|
||||||
|
ifeq ($(CPPCHECK_FAIL_ON_WARNING), Y)
|
||||||
|
BASE_CPPCHECK_FLAGS += --error-exitcode=1
|
||||||
|
endif
|
||||||
|
ifeq ($(CPPCHECK_QUIET), Y)
|
||||||
|
BASE_CPPCHECK_FLAGS += --quiet
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Output Messages
|
||||||
|
MSG_CPPCHECK_CMD := ' [CPPCHECK]:'
|
||||||
|
|
||||||
|
# Checks the CPPCheck configuration as used in the user project, to determine if any paths are missing or invalid
|
||||||
|
cppcheck-config: $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_CPPCHECK_CMD) Checking cppcheck configuration check on source files
|
||||||
|
cppcheck $(BASE_CPPCHECK_FLAGS) --check-config $(CPPCHECK_FLAGS) $(SRC)
|
||||||
|
|
||||||
|
# Runs a static analysis using CPPCheck to determine if there are any issues
|
||||||
|
cppcheck: $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_CPPCHECK_CMD) Performing static analysis on source files
|
||||||
|
cppcheck $(BASE_CPPCHECK_FLAGS) --enable=$(CPPCHECK_ENABLE) $(CPPCHECK_SUPPRESS:%=--suppress=%) $(CPPCHECK_FLAGS) $(SRC)
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: $(DMBS_BUILD_TARGETS)
|
@ -0,0 +1,122 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: DFU
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The DFU module provides build targets to program a USB connected target running
|
||||||
|
a DFU class bootloader, via the official Atmel FLIP utility running via the
|
||||||
|
command line, or the open source `DFU-Programmer` tool.
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/dfu.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
This module requires the `batchisp` utility to be available in your system's
|
||||||
|
`PATH` variable. The `batchisp` utility is distributed as part of Atmel's FLIP
|
||||||
|
software which can be downloaded from the [official site](http://www.atmel.com).
|
||||||
|
|
||||||
|
This module requires the `dfu-programmer` utility to be available in your
|
||||||
|
system's `PATH` variable. The `dfu-programmer` utility is distributed from the
|
||||||
|
[official project site](https://dfu-programmer.github.io/).
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>flip</td>
|
||||||
|
<td>Program the application into the device's flash memory, using Atmel FLIP.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>flip-ee</td>
|
||||||
|
<td>Program the application's EEPROM data into the device's EEPROM memory, using Atmel FLIP.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>dfu</td>
|
||||||
|
<td>Program the application into the device's flash memory, using `dfu-programmer`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>dfu-ee</td>
|
||||||
|
<td>Program the application's EEPROM data into the device's EEPROM memory, using `dfu-programmer`.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>MCU</td>
|
||||||
|
<td>Name of the Atmel processor model (e.g. `at90usb1287`).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>TARGET</td>
|
||||||
|
<td>Name of the application output file prefix (e.g. `TestApplication`).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module has no optional variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no macros.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,62 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += DFU
|
||||||
|
DMBS_BUILD_TARGETS += flip flip-ee dfu dfu-ee
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += MCU TARGET
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
# Conditionally import the CORE module of DMBS if it is not already imported
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Sanity-check values of mandatory user-supplied variables
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, MCU)
|
||||||
|
$(call ERROR_IF_EMPTY, TARGET)
|
||||||
|
|
||||||
|
# Output Messages
|
||||||
|
MSG_COPY_CMD := ' [CP] :'
|
||||||
|
MSG_REMOVE_CMD := ' [RM] :'
|
||||||
|
MSG_DFU_CMD := ' [DFU] :'
|
||||||
|
|
||||||
|
# Programs in the target FLASH memory using BATCHISP, the command line tool used by FLIP
|
||||||
|
flip: $(TARGET).hex $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_DFU_CMD) Programming FLASH with batchisp using \"$<\"
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation erase f loadbuffer $< program
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
|
# Programs in the target EEPROM memory using BATCHISP, the command line tool used by FLIP
|
||||||
|
flip-ee: $(TARGET).eep $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_COPY_CMD) Copying EEP file to temporary file \"$<.hex\"
|
||||||
|
cp $< $<.hex
|
||||||
|
@echo $(MSG_DFU_CMD) Programming EEPROM with batchisp using \"$<.hex\"
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $<.hex program
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
@echo $(MSG_REMOVE_CMD) Removing temporary file \"$<.hex\"
|
||||||
|
rm $<.hex
|
||||||
|
|
||||||
|
# Programs in the target FLASH memory using DFU-PROGRAMMER
|
||||||
|
dfu: $(TARGET).hex $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_DFU_CMD) Programming FLASH with dfu-programmer using \"$<\"
|
||||||
|
dfu-programmer $(MCU) erase
|
||||||
|
dfu-programmer $(MCU) flash $<
|
||||||
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
# Programs in the target EEPROM memory using DFU-PROGRAMMER
|
||||||
|
dfu-ee: $(TARGET).eep $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_DFU_CMD) Programming EEPROM with dfu-programmer using \"$<\"
|
||||||
|
dfu-programmer $(MCU) flash --eeprom $<
|
||||||
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: $(DMBS_BUILD_TARGETS)
|
@ -0,0 +1,118 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: DOXYGEN
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The DOXYGEN module provides build targets to automatically generate API
|
||||||
|
documentation for a project, using the open-source Doxygen tool.
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/doxygen.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
This module requires the `doxygen` utility to be available in your system's
|
||||||
|
`PATH` variable. The `doxygen` utility is distributed on the project's
|
||||||
|
[official site](http://doxygen.org/) but is also
|
||||||
|
made available in many *nix operating system's package managers.
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>doxygen</td>
|
||||||
|
<td>Generate project documentation, via Doxygen.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>doxygen-create</td>
|
||||||
|
<td>Create a new project Doxygen template, which can then be customized.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>doxygen-upgrade</td>
|
||||||
|
<td>Upgrade an existing project Doxygen template to the latest Doxygen version.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module has no mandatory variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>DOXYGEN_CONF</td>
|
||||||
|
<td>Name of the Doxygen project configuration file that should be used when generating documentation, or creating/upgrading the configuration file.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>DOXYGEN_FAIL_ON_WARNING</td>
|
||||||
|
<td>Boolean, if `Y` the build will fail if Doxygen encounters any errors or warnings. If `N`, fail only on errors. Default is `Y`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>DOXYGEN_OVERRIDE_PARAMS</td>
|
||||||
|
<td>List of `NAME=VALUE` parameters which should override the values specified in the project configuration file, when building documentation.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no macros.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,62 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += DOXYGEN
|
||||||
|
DMBS_BUILD_TARGETS += doxygen doxygen-upgrade doxygen-create
|
||||||
|
DMBS_BUILD_MANDATORY_VARS +=
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS += DOXYGEN_CONF DOXYGEN_FAIL_ON_WARNING DOXYGEN_OVERRIDE_PARAMS
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
# Conditionally import the CORE module of DMBS if it is not already imported
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Default values of optionally user-supplied variables
|
||||||
|
DOXYGEN_CONF ?= doxyfile
|
||||||
|
DOXYGEN_FAIL_ON_WARNING ?= Y
|
||||||
|
DOXYGEN_OVERRIDE_PARAMS ?= QUIET=YES
|
||||||
|
|
||||||
|
# Sanity check user supplied values
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, DOXYGEN_CONF)
|
||||||
|
$(call ERROR_IF_NONBOOL, DOXYGEN_FAIL_ON_WARNING)
|
||||||
|
|
||||||
|
# Output Messages
|
||||||
|
MSG_DOXYGEN_CMD := ' [DOXYGEN] :'
|
||||||
|
|
||||||
|
# Determine Doxygen invocation command
|
||||||
|
BASE_DOXYGEN_CMD := ( cat $(DOXYGEN_CONF) $(DOXYGEN_OVERRIDE_PARAMS:%=; echo "%") ) | doxygen -
|
||||||
|
ifeq ($(DOXYGEN_FAIL_ON_WARNING), Y)
|
||||||
|
DOXYGEN_CMD := if ( $(BASE_DOXYGEN_CMD) 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then exit 1; fi;
|
||||||
|
else
|
||||||
|
DOXYGEN_CMD := $(BASE_DOXYGEN_CMD)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Error if the specified Doxygen configuration file does not exist
|
||||||
|
$(DOXYGEN_CONF):
|
||||||
|
$(error Doxygen configuration file $@ does not exist)
|
||||||
|
|
||||||
|
# Builds the project documentation using the specified configuration file and the DOXYGEN tool
|
||||||
|
doxygen: $(DOXYGEN_CONF) $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_DOXYGEN_CMD) Configuration file \"$(DOXYGEN_CONF)\" with parameters \"$(DOXYGEN_OVERRIDE_PARAMS)\"
|
||||||
|
$(DOXYGEN_CMD)
|
||||||
|
|
||||||
|
# Upgrades an existing Doxygen configuration file to the latest Doxygen template, preserving settings
|
||||||
|
doxygen-upgrade: $(DOXYGEN_CONF) $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_DOXYGEN_CMD) Upgrading configuration file \"$(DOXYGEN_CONF)\" with latest template
|
||||||
|
doxygen -u $(DOXYGEN_CONF) > /dev/null
|
||||||
|
|
||||||
|
# Creates a new Doxygen configuration file with the set file name
|
||||||
|
doxygen-create: $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_DOXYGEN_CMD) Creating new configuration file \"$(DOXYGEN_CONF)\" with latest template
|
||||||
|
doxygen -g $(DOXYGEN_CONF) > /dev/null
|
||||||
|
|
||||||
|
|
@ -0,0 +1,204 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: GCC
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The GCC module provides build targets to compile a user application, using a
|
||||||
|
variant of GCC for a specific target architecture (such as `avr-gcc`).
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/gcc.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
This module requires the GCC compiler to be installed and available in the
|
||||||
|
system's `PATH` variable for the desired target architecture.
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>size</td>
|
||||||
|
<td>Show the compiled binary size for the various memory segments.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>symbol-sizes</td>
|
||||||
|
<td>Show the size of each symbol in the compiled binary (useful to find large functions to optimize further).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>all</td>
|
||||||
|
<td>Build application and generate all binary (BIN, ELF, HEX) and auxiliary (LSS, MAP, SYM, etc.) output files.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>lib</td>
|
||||||
|
<td>Generate a static `.a` library from the application code, containing the flash region's data.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>elf</td>
|
||||||
|
<td>Generate an ELF debug file from the application code, containing all region's data.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>bin</td>
|
||||||
|
<td>Generate a flat BIN binary file from the application code, containing the flash region's data.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>hex</td>
|
||||||
|
<td>Generate a pair of Intel HEX files from the application code, containing the flash region's data (HEX) and EEPROM data (EEP).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>lss</td>
|
||||||
|
<td>Generate a LSS listing file showing the disassembly of the compiled application.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>clean</td>
|
||||||
|
<td>Remove all generated project intermediary and binary output files.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>mostlyclean</td>
|
||||||
|
<td>Remove all generated project intermediary output files, but preserve the binary output files.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>MCU</td>
|
||||||
|
<td>Name of the Atmel processor model (e.g. `at90usb1287`).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>TARGET</td>
|
||||||
|
<td>Name of the application output file prefix (e.g. `TestApplication`).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ARCH</td>
|
||||||
|
<td>Target device architecture (e.g. `AVR8`).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>SRC</td>
|
||||||
|
<td>List of all project source files (C, C++, ASM).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>OPTIMIZATION</td>
|
||||||
|
<td>Optimization level to use when compiling C and C++ source files. Default is `s` (optimize for smallest size).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>C_STANDARD</td>
|
||||||
|
<td>C language standard used when compiling C language source files. Default is `gnu99` (C99 standard with GNU extensions)./td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPP_STANDARD</td>
|
||||||
|
<td>C++ language standard used when compiling C++ language source files. Default is `gnu++98` (C++98 standard with GNU extensions)./td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>F_CPU</td>
|
||||||
|
<td>Processor core clock frequency, in Hz. This is used by some architectures for functions such as software spin-loop delays. Default is blank (no value defined).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>C_FLAGS</td>
|
||||||
|
<td>Common GCC flags passed to the compiler for C language (C) input files. Default is blank (no additional flags).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CPP_FLAGS</td>
|
||||||
|
<td>Common GCC flags passed to the compiler for C++ language (CPP) input files. Default is blank (no additional flags).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ASM_FLAGS</td>
|
||||||
|
<td>Common GCC flags passed to the assembler for assembly language (S) input files. Default is blank (no additional flags).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CC_FLAGS</td>
|
||||||
|
<td>Common GCC flags passed to the compiler for all source file types. Default is blank (no additional flags).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>LD_FLAGS</td>
|
||||||
|
<td>Extra flags to pass to the GNU linker when linking the compiled object files into the resulting binary. Default is blank (no additional flags).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>LINKER_RELAXATIONS</td>
|
||||||
|
<td>Boolean, if `Y` linker relaxations will be enabled to slightly reduce the resulting binary's size. Default is `Y`.</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>
|
||||||
|
<tr>
|
||||||
|
<td>OBJECT_FILES</td>
|
||||||
|
<td>List of additional `.o` object files to link into the final binary. Default is blank (no additional objects).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>DEBUG_FORMAT</td>
|
||||||
|
<td>Debug ELF file format to generate. Default is `dwarf-2`.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>DEBUG_LEVEL</td>
|
||||||
|
<td>Level of the debugging information to generate in the compiled object files. Debug is 2 (medium level debugging information).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>COMPILER_PATH</td>
|
||||||
|
<td>Path to the compiler to use, in case a specific compiler should be substituted for the one in the system's `PATH` variable. Default is blank (use `PATH` provided compiler).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no macros.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,270 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
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 += BOARD 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 COMPILER_PATH
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
# Conditionally import the CORE module of DMBS if it is not already imported
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Default values of optionally user-supplied variables
|
||||||
|
COMPILER_PATH ?=
|
||||||
|
OPTIMIZATION ?= s
|
||||||
|
F_CPU ?=
|
||||||
|
C_STANDARD ?= gnu99
|
||||||
|
CPP_STANDARD ?= gnu++98
|
||||||
|
C_FLAGS ?=
|
||||||
|
CPP_FLAGS ?=
|
||||||
|
ASM_FLAGS ?=
|
||||||
|
CC_FLAGS ?=
|
||||||
|
OBJDIR ?= obj
|
||||||
|
OBJECT_FILES ?=
|
||||||
|
DEBUG_FORMAT ?= dwarf-2
|
||||||
|
DEBUG_LEVEL ?= 2
|
||||||
|
LINKER_RELAXATIONS ?= Y
|
||||||
|
|
||||||
|
# Sanity check user supplied values
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, MCU)
|
||||||
|
$(call ERROR_IF_EMPTY, TARGET)
|
||||||
|
$(call ERROR_IF_EMPTY, ARCH)
|
||||||
|
$(call ERROR_IF_EMPTY, OPTIMIZATION)
|
||||||
|
$(call ERROR_IF_EMPTY, C_STANDARD)
|
||||||
|
$(call ERROR_IF_EMPTY, CPP_STANDARD)
|
||||||
|
$(call ERROR_IF_EMPTY, OBJDIR)
|
||||||
|
$(call ERROR_IF_EMPTY, DEBUG_FORMAT)
|
||||||
|
$(call ERROR_IF_EMPTY, DEBUG_LEVEL)
|
||||||
|
$(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS)
|
||||||
|
|
||||||
|
# Determine the utility prefix to use for the selected architecture
|
||||||
|
ifeq ($(ARCH), AVR8)
|
||||||
|
CROSS := $(COMPILER_PATH)avr
|
||||||
|
else ifeq ($(ARCH), XMEGA)
|
||||||
|
CROSS := $(COMPILER_PATH)avr
|
||||||
|
else ifeq ($(ARCH), UC3)
|
||||||
|
CROSS := $(COMPILER_PATH)avr32
|
||||||
|
else
|
||||||
|
$(error Unsupported architecture "$(ARCH)")
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Output Messages
|
||||||
|
MSG_INFO_MESSAGE := ' [INFO] :'
|
||||||
|
MSG_COMPILE_CMD := ' [GCC] :'
|
||||||
|
MSG_ASSEMBLE_CMD := ' [GAS] :'
|
||||||
|
MSG_NM_CMD := ' [NM] :'
|
||||||
|
MSG_REMOVE_CMD := ' [RM] :'
|
||||||
|
MSG_LINK_CMD := ' [LNK] :'
|
||||||
|
MSG_ARCHIVE_CMD := ' [AR] :'
|
||||||
|
MSG_SIZE_CMD := ' [SIZE] :'
|
||||||
|
MSG_OBJCPY_CMD := ' [OBJCPY] :'
|
||||||
|
MSG_OBJDMP_CMD := ' [OBJDMP] :'
|
||||||
|
|
||||||
|
# Convert input source file list to differentiate them by type
|
||||||
|
C_SOURCE := $(filter %.c, $(SRC))
|
||||||
|
CPP_SOURCE := $(filter %.cpp, $(SRC))
|
||||||
|
ASM_SOURCE := $(filter %.S, $(SRC))
|
||||||
|
|
||||||
|
# Create a list of unknown source file types, if any are found throw an error
|
||||||
|
UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC))
|
||||||
|
ifneq ($(UNKNOWN_SOURCE),)
|
||||||
|
$(error Unknown input source file formats: $(UNKNOWN_SOURCE))
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Convert input source filenames into a list of required output object files
|
||||||
|
OBJECT_FILES += $(addsuffix .o, $(basename $(SRC)))
|
||||||
|
|
||||||
|
# Check if an output object file directory was specified instead of the input file location
|
||||||
|
ifneq ($(OBJDIR),.)
|
||||||
|
# Prefix all the object filenames with the output object file directory path
|
||||||
|
OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES)))
|
||||||
|
|
||||||
|
# Check if any object file (without path) appears more than once in the object file list
|
||||||
|
ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES)))
|
||||||
|
$(error Cannot build with OBJDIR parameter set - one or more object file name is not unique)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Create the output object file directory if it does not exist and add it to the virtual path list
|
||||||
|
$(shell mkdir $(OBJDIR) 2> /dev/null)
|
||||||
|
VPATH += $(dir $(SRC))
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Create a list of dependency files from the list of object files
|
||||||
|
DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d)
|
||||||
|
|
||||||
|
# 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
|
||||||
|
else ifneq ($(findstring $(ARCH), UC3),)
|
||||||
|
BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos
|
||||||
|
endif
|
||||||
|
BASE_CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections
|
||||||
|
BASE_CC_FLAGS += -I.
|
||||||
|
BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH)
|
||||||
|
ifneq ($(F_CPU),)
|
||||||
|
BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL
|
||||||
|
endif
|
||||||
|
ifeq ($(LINKER_RELAXATIONS), Y)
|
||||||
|
BASE_CC_FLAGS += -mrelax
|
||||||
|
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_ASM_FLAGS := -x assembler-with-cpp
|
||||||
|
|
||||||
|
# This flag is required for bootloaders as GCC will emit invalid jump table
|
||||||
|
# assembly code for devices with large amounts of flash; the jump table target
|
||||||
|
# is extracted from FLASH without using the correct ELPM instruction, resulting
|
||||||
|
# in a pseudo-random jump target.
|
||||||
|
BASE_CC_FLAGS += -fno-jump-tables
|
||||||
|
|
||||||
|
# Create a list of flags to pass to the linker
|
||||||
|
BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections
|
||||||
|
ifeq ($(LINKER_RELAXATIONS), Y)
|
||||||
|
BASE_LD_FLAGS += -Wl,--relax
|
||||||
|
endif
|
||||||
|
ifneq ($(findstring $(ARCH), AVR8 XMEGA),)
|
||||||
|
BASE_LD_FLAGS += -mmcu=$(MCU)
|
||||||
|
else ifneq ($(findstring $(ARCH), UC3),)
|
||||||
|
BASE_LD_FLAGS += -mpart=$(MCU:at32%=%) --rodata-writable --direct-data
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Determine flags to pass to the size utility based on its reported features (only invoke if size target required)
|
||||||
|
# and on an architecture where this non-standard patch is available
|
||||||
|
ifneq ($(ARCH), UC3)
|
||||||
|
size: SIZE_MCU_FLAG := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
||||||
|
size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Pre-build informational target, to give compiler and project name information when building
|
||||||
|
build_begin:
|
||||||
|
@echo $(MSG_INFO_MESSAGE) Begin compilation of project \"$(TARGET)\"...
|
||||||
|
@echo ""
|
||||||
|
@$(CROSS)-gcc --version
|
||||||
|
|
||||||
|
# Post-build informational target, to project name information when building has completed
|
||||||
|
build_end:
|
||||||
|
@echo $(MSG_INFO_MESSAGE) Finished building project \"$(TARGET)\".
|
||||||
|
|
||||||
|
# Prints size information of a compiled application (FLASH, RAM and EEPROM usages)
|
||||||
|
size: $(TARGET).elf
|
||||||
|
@echo $(MSG_SIZE_CMD) Determining size of \"$<\"
|
||||||
|
@echo ""
|
||||||
|
$(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $<
|
||||||
|
|
||||||
|
# Prints size information on the symbols within a compiled application in decimal bytes
|
||||||
|
symbol-sizes: $(TARGET).elf
|
||||||
|
@echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes
|
||||||
|
$(CROSS)-nm --size-sort --demangle --radix=d $<
|
||||||
|
|
||||||
|
# Cleans intermediary build files, leaving only the compiled application files
|
||||||
|
mostlyclean:
|
||||||
|
@echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\"
|
||||||
|
rm -f $(OBJECT_FILES)
|
||||||
|
@echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\"
|
||||||
|
rm -f $(DEPENDENCY_FILES)
|
||||||
|
|
||||||
|
# Cleans all build files, leaving only the original source code
|
||||||
|
clean: mostlyclean
|
||||||
|
@echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\"
|
||||||
|
rm -f $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym lib$(TARGET).a
|
||||||
|
|
||||||
|
# Performs a complete build of the user application and prints size information afterwards
|
||||||
|
all: build_begin elf hex bin lss sym size build_end
|
||||||
|
|
||||||
|
# Helper targets, to build a specific type of output file without having to know the project target name
|
||||||
|
lib: lib$(TARGET).a
|
||||||
|
elf: $(TARGET).elf
|
||||||
|
hex: $(TARGET).hex $(TARGET).eep
|
||||||
|
bin: $(TARGET).bin
|
||||||
|
lss: $(TARGET).lss
|
||||||
|
sym: $(TARGET).sym
|
||||||
|
|
||||||
|
# Default target to *create* the user application's specified source files; if this rule is executed by
|
||||||
|
# make, the input source file doesn't exist and an error needs to be presented to the user
|
||||||
|
$(SRC):
|
||||||
|
$(error Source file does not exist: $@)
|
||||||
|
|
||||||
|
# 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 $@
|
||||||
|
|
||||||
|
# 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 $@
|
||||||
|
|
||||||
|
# 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 $@
|
||||||
|
|
||||||
|
# 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 $@
|
||||||
|
|
||||||
|
# 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 $@
|
||||||
|
|
||||||
|
# Generates a library archive file from the user application, which can be linked into other applications
|
||||||
|
.PRECIOUS : $(OBJECT_FILES)
|
||||||
|
.SECONDARY : %.a
|
||||||
|
%.a: $(OBJECT_FILES)
|
||||||
|
@echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\"
|
||||||
|
$(CROSS)-ar rcs $@ $(OBJECT_FILES)
|
||||||
|
|
||||||
|
# Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data
|
||||||
|
# files, or used for programming and debugging directly
|
||||||
|
.PRECIOUS : $(OBJECT_FILES)
|
||||||
|
.SECONDARY : %.elf
|
||||||
|
%.elf: $(OBJECT_FILES)
|
||||||
|
@echo $(MSG_LINK_CMD) Linking object files into \"$@\"
|
||||||
|
$(CROSS)-gcc $^ -o $@ $(BASE_LD_FLAGS) $(LD_FLAGS)
|
||||||
|
|
||||||
|
# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it
|
||||||
|
%.hex: %.elf
|
||||||
|
@echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\"
|
||||||
|
$(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
|
||||||
|
|
||||||
|
# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Binary format file of it
|
||||||
|
%.bin: %.elf
|
||||||
|
@echo $(MSG_OBJCPY_CMD) Extracting BIN file data from \"$<\"
|
||||||
|
$(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@
|
||||||
|
|
||||||
|
# Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it
|
||||||
|
%.eep: %.elf
|
||||||
|
@echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\"
|
||||||
|
$(CROSS)-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings $< $@ || exit 0
|
||||||
|
|
||||||
|
# Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data
|
||||||
|
%.lss: %.elf
|
||||||
|
@echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\"
|
||||||
|
$(CROSS)-objdump -h -d -S -z $< > $@
|
||||||
|
|
||||||
|
# Creates a symbol file listing the loadable and discarded symbols from an input project ELF file
|
||||||
|
%.sym: %.elf
|
||||||
|
@echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\"
|
||||||
|
$(CROSS)-nm -n $< > $@
|
||||||
|
|
||||||
|
# Include build dependency files
|
||||||
|
-include $(DEPENDENCY_FILES)
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: build_begin build_end $(DMBS_BUILD_TARGETS)
|
@ -0,0 +1,129 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Module: HID
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The HID module provides build targets to program a target running a PJRC Teensy
|
||||||
|
or LUFA compatible HID class bootloader.
|
||||||
|
|
||||||
|
## Importing This Module into a Makefile:
|
||||||
|
|
||||||
|
To use this module in your application makefile, add the following code to your
|
||||||
|
makefile:
|
||||||
|
|
||||||
|
include $(DMBS_PATH)/hid.mk
|
||||||
|
|
||||||
|
## Prerequisites:
|
||||||
|
|
||||||
|
This module requires the `teensy_loader_cli` utility to be available in your
|
||||||
|
system's `PATH` variable. The `teensy_loader_cli` utility is distributed in
|
||||||
|
a modified form (from PJRC) in the LUFA project's
|
||||||
|
[official site](http://www.lufa-lib.org/), but is also
|
||||||
|
made available in its original form directly from the
|
||||||
|
[PJRC website](https://www.pjrc.com/teensy/loader_cli.html). Note that the
|
||||||
|
original tool works with Teensy boards only, and not LUFA HID bootloader
|
||||||
|
devices.
|
||||||
|
|
||||||
|
This module requires the `hid_bootloader_cli` utility to be available in your
|
||||||
|
system's `PATH` variable. The `hid_bootloader_cli` Python script utility is
|
||||||
|
distributed in LUFA project's [official site](http://www.lufa-lib.org/).
|
||||||
|
|
||||||
|
This module requires the AVR-GCC compiler to be installed and available in the
|
||||||
|
system's `PATH` variable.
|
||||||
|
|
||||||
|
## Build Targets:
|
||||||
|
|
||||||
|
The following targets are supported by this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>hid</td>
|
||||||
|
<td>Program a LUFA HID class bootloader device, using the `hid_bootloader_cli.py` Python script.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>hid-ee</td>
|
||||||
|
<td>Program a LUFA HID class bootloader device's EEPROM, using the `hid_bootloader_cli.py` Python script and a shim application which is programmed into the target's flash.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>teensy</td>
|
||||||
|
<td>Program a LUFA HID class bootloader device or Teensy board, using the `teensy_loader_cli` tool.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>teensy-ee</td>
|
||||||
|
<td>Program a LUFA HID class bootloader device's EEPROM, using the `teensy_loader_cli` tool and a shim application which is programmed into the target's flash.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Mandatory Variables:
|
||||||
|
|
||||||
|
The following variables must be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile to be able to use this module:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>MCU</td>
|
||||||
|
<td>Name of the Atmel processor model (e.g. `at90usb1287`).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>TARGET</td>
|
||||||
|
<td>Name of the application output file prefix (e.g. `TestApplication`).</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Optional Variables:
|
||||||
|
|
||||||
|
The following variables may be defined (with a `NAME = VALUE` syntax, one
|
||||||
|
variable per line) in the user makefile. If not specified, a default value will
|
||||||
|
be assumed.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module has no optional variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Variables:
|
||||||
|
|
||||||
|
The following variables may be referenced in a user makefile (via `$(NAME)`
|
||||||
|
syntax) if desired, as they are provided by this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no variables.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Provided Macros:
|
||||||
|
|
||||||
|
The following macros may be referenced in a user makefile (via
|
||||||
|
`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by
|
||||||
|
this module.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>N/A</td>
|
||||||
|
<td>This module provides no macros.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Module Changelog:
|
||||||
|
|
||||||
|
The changes to this module since its initial release are listed below, as of the
|
||||||
|
DMBS version where the change was made.
|
||||||
|
|
||||||
|
### 20160403
|
||||||
|
Initial release.
|
@ -0,0 +1,57 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += HID
|
||||||
|
DMBS_BUILD_TARGETS += hid hid-ee teensy teensy-ee
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += MCU TARGET
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
# Conditionally import the CORE module of DMBS if it is not already imported
|
||||||
|
DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
|
ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),)
|
||||||
|
include $(DMBS_MODULE_PATH)/core.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Sanity-check values of mandatory user-supplied variables
|
||||||
|
$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, MCU)
|
||||||
|
$(call ERROR_IF_EMPTY, TARGET)
|
||||||
|
|
||||||
|
# Output Messages
|
||||||
|
MSG_HID_BOOTLOADER_CMD := ' [HID] :'
|
||||||
|
MSG_OBJCPY_CMD := ' [OBJCPY] :'
|
||||||
|
MSG_MAKE_CMD := ' [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 \"$<\"
|
||||||
|
hid_bootloader_cli -mmcu=$(MCU) -v $<
|
||||||
|
|
||||||
|
# Programs in the target EEPROM memory using the HID_BOOTLOADER_CLI tool (note: clears target FLASH memory)
|
||||||
|
hid-ee: $(TARGET).eep $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\"
|
||||||
|
avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin
|
||||||
|
@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\"
|
||||||
|
$(MAKE) -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean hid
|
||||||
|
|
||||||
|
# Programs in the target FLASH memory using the TEENSY_BOOTLOADER_CLI tool
|
||||||
|
teensy: $(TARGET).hex $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with teensy_loader_cli using \"$<\"
|
||||||
|
teensy_loader_cli -mmcu=$(MCU) -v $<
|
||||||
|
|
||||||
|
# Programs in the target EEPROM memory using the TEENSY_BOOTLOADER_CLI tool (note: clears target FLASH memory)
|
||||||
|
teensy-ee: $(TARGET).hex $(MAKEFILE_LIST)
|
||||||
|
@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\"
|
||||||
|
avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin
|
||||||
|
@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\"
|
||||||
|
$(MAKE) -s -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean teensy
|
||||||
|
|
||||||
|
# Phony build targets for this module
|
||||||
|
.PHONY: $(DMBS_BUILD_TARGETS)
|
@ -0,0 +1,123 @@
|
|||||||
|
DMBS - Dean's Makefile Build System
|
||||||
|
===================================
|
||||||
|
|
||||||
|
|
||||||
|
Project Overview
|
||||||
|
----------------
|
||||||
|
|
||||||
|
GNU Make is scary, and it's tough to get the rules right sometimes. Many
|
||||||
|
projects get by via simple copy-pasting of old makefiles, resulting in many
|
||||||
|
redundant copies of the same old rules. DMBS aims to solve this by providing a
|
||||||
|
simple modular set of makefiles which can be included by your project to quickly
|
||||||
|
add various build functionality.
|
||||||
|
|
||||||
|
This aims to replace the old WinAVR "mfile" makefile template, giving better
|
||||||
|
functionality and much simpler user makefiles.
|
||||||
|
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Apart from much simpler, cleaner makefiles DMBS carries the aim of making the
|
||||||
|
process of troubleshooting build issues a little easier. Lots can go wrong, so
|
||||||
|
DMBS tries to sanity check its inputs wherever possible, and produce
|
||||||
|
human-readable error messages. Forgotten to set a variable? Get a
|
||||||
|
`Makefile {X} value not set.` message, rather than a possibly unrelated message.
|
||||||
|
Have the wrong filename? See `Source file does not exist: {X}` rather than the
|
||||||
|
infamous `No rule to make target {X}` message.
|
||||||
|
|
||||||
|
|
||||||
|
Use:
|
||||||
|
----------------
|
||||||
|
|
||||||
|
A template user makefile is provided in the `Template` directory. DMBS modules
|
||||||
|
are included via a GNU Make `include` directive. While the DMBS `core` module is
|
||||||
|
always required, you can pick and choose what other modules you wish to add to
|
||||||
|
your user project.
|
||||||
|
|
||||||
|
[See here for the documentation on the individual modules provided by DMBS.](DMBS/ModulesOverview.md)
|
||||||
|
If you're interested in writing your own DMBS module(s), [see here.](DMBS/WritingYourOwnModules.md)
|
||||||
|
|
||||||
|
Here's an example user makefile:
|
||||||
|
|
||||||
|
MCU = atmega128
|
||||||
|
ARCH = AVR8
|
||||||
|
F_CPU = 8000000
|
||||||
|
OPTIMIZATION = s
|
||||||
|
TARGET = Template
|
||||||
|
SRC = $(TARGET).c
|
||||||
|
CC_FLAGS =
|
||||||
|
LD_FLAGS =
|
||||||
|
|
||||||
|
# Default target
|
||||||
|
all:
|
||||||
|
|
||||||
|
# Include DMBS build script makefiles
|
||||||
|
DMBS_PATH ?= ../DMBS
|
||||||
|
include $(DMBS_PATH)/core.mk
|
||||||
|
include $(DMBS_PATH)/gcc.mk
|
||||||
|
include $(DMBS_PATH)/cppcheck.mk
|
||||||
|
include $(DMBS_PATH)/doxygen.mk
|
||||||
|
include $(DMBS_PATH)/dfu.mk
|
||||||
|
include $(DMBS_PATH)/hid.mk
|
||||||
|
include $(DMBS_PATH)/avrdude.mk
|
||||||
|
include $(DMBS_PATH)/atprogram.mk
|
||||||
|
|
||||||
|
Each DMBS module can optionally supply one or more Make variables and macros,
|
||||||
|
which you can reference in your user makefile. Additionally, modules can require
|
||||||
|
one or more variables to be set by the user makefile, with (in some cases) sane
|
||||||
|
defaults used if left out.
|
||||||
|
|
||||||
|
As modules are added, you can get a list of available targets by simply typing
|
||||||
|
`make help` from the command line. This will produce a formatted list of targets
|
||||||
|
as well as mandatory and optional variables and exposed variables and macros.
|
||||||
|
|
||||||
|
|
||||||
|
Distribution
|
||||||
|
----------------
|
||||||
|
|
||||||
|
You can embed DMBS in your project any way you like - some options are:
|
||||||
|
1. A git submodule
|
||||||
|
2. A source tarball
|
||||||
|
3. A manually copied extracted archive
|
||||||
|
|
||||||
|
The intention of DMBS is that users can just import it from whatever source
|
||||||
|
they like. If your project needs to extend the existing modules in an unusual
|
||||||
|
manner, or if you want to provide your own modules, you can include them in
|
||||||
|
your project repository (or submit a patch to DMBS if your module is generic
|
||||||
|
enough to warrant wide use).
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
----------------
|
||||||
|
|
||||||
|
DMBS is released into the public domain, making is suitable for use everywhere,
|
||||||
|
by everyone. Contributions are greatly appreciated however, in order to make
|
||||||
|
DMBS better for everyone.
|
||||||
|
|
||||||
|
The actual license text is as follows:
|
||||||
|
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
DMBS Build System
|
||||||
|
Released into the public domain.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.fourwalledcubicle.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Application code here.
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
#
|
||||||
|
# DMBS Build System
|
||||||
|
# Released into the public domain.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.fourwalledcubicle.com
|
||||||
|
#
|
||||||
|
|
||||||
|
# Run "make help" for target help.
|
||||||
|
|
||||||
|
MCU = atmega128
|
||||||
|
ARCH = AVR8
|
||||||
|
F_CPU = 8000000
|
||||||
|
OPTIMIZATION = s
|
||||||
|
TARGET = Template
|
||||||
|
SRC = $(TARGET).c
|
||||||
|
CC_FLAGS =
|
||||||
|
LD_FLAGS =
|
||||||
|
|
||||||
|
# Default target
|
||||||
|
all:
|
||||||
|
|
||||||
|
# Include DMBS build script makefiles
|
||||||
|
DMBS_PATH ?= ../DMBS
|
||||||
|
include $(DMBS_PATH)/core.mk
|
||||||
|
include $(DMBS_PATH)/gcc.mk
|
||||||
|
include $(DMBS_PATH)/cppcheck.mk
|
||||||
|
include $(DMBS_PATH)/doxygen.mk
|
||||||
|
include $(DMBS_PATH)/dfu.mk
|
||||||
|
include $(DMBS_PATH)/hid.mk
|
||||||
|
include $(DMBS_PATH)/avrdude.mk
|
||||||
|
include $(DMBS_PATH)/atprogram.mk
|
@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
LUFA Library
|
|
||||||
Copyright (C) Dean Camera, 2016.
|
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
|
||||||
www.lufa-lib.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Copyright 2016 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
|
||||||
software and its documentation for any purpose is hereby granted
|
|
||||||
without fee, provided that the above copyright notice appear in
|
|
||||||
all copies and that both that the copyright notice and this
|
|
||||||
permission notice and warranty disclaimer appear in supporting
|
|
||||||
documentation, and that the name of the author not be used in
|
|
||||||
advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
The author disclaims all warranties with regard to this
|
|
||||||
software, including all implied warranties of merchantability
|
|
||||||
and fitness. In no event shall the author be liable for any
|
|
||||||
special, indirect or consequential damages or any damages
|
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
|
||||||
in an action of contract, negligence or other tortious action,
|
|
||||||
arising out of or in connection with the use or performance of
|
|
||||||
this software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
*
|
|
||||||
* Special application to extract an EEPROM image stored in FLASH memory, and
|
|
||||||
* copy it to the device EEPROM. This application is designed to be used with
|
|
||||||
* the HID build system module of LUFA to program the EEPROM of a target device
|
|
||||||
* that uses the HID bootloader protocol, which does not have native EEPROM
|
|
||||||
* programming support.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <avr/eeprom.h>
|
|
||||||
#include <avr/pgmspace.h>
|
|
||||||
|
|
||||||
/* References to the binary EEPROM data linked in the AVR's FLASH memory space */
|
|
||||||
extern const char _binary_InputEEData_bin_start[];
|
|
||||||
extern const char _binary_InputEEData_bin_end[];
|
|
||||||
extern const char _binary_InputEEData_bin_size[];
|
|
||||||
|
|
||||||
/* Friendly names for the embedded binary data stored in FLASH memory space */
|
|
||||||
#define InputEEData _binary_InputEEData_bin_start
|
|
||||||
#define InputEEData_size ((int)_binary_InputEEData_bin_size)
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
/* Copy out the embedded EEPROM data from FLASH to EEPROM memory space */
|
|
||||||
for (uint16_t i = 0; i < InputEEData_size; i++)
|
|
||||||
eeprom_update_byte((uint8_t*)i, pgm_read_byte(&InputEEData[i]));
|
|
||||||
|
|
||||||
/* Infinite loop once complete */
|
|
||||||
for (;;);
|
|
||||||
}
|
|
@ -0,0 +1,43 @@
|
|||||||
|
#
|
||||||
|
# LUFA Library
|
||||||
|
# Copyright (C) Dean Camera, 2015.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.lufa-lib.org
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += LUFA_GCC
|
||||||
|
DMBS_BUILD_TARGETS +=
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += LUFA_PATH ARCH F_USB
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS += BOARD
|
||||||
|
DMBS_BUILD_PROVIDED_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
||||||
|
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
||||||
|
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
||||||
|
|
||||||
|
# Sanity check user supplied values
|
||||||
|
$(call ERROR_IF_EMPTY, LUFA_PATH)
|
||||||
|
$(call ERROR_IF_EMPTY, ARCH)
|
||||||
|
$(call ERROR_IF_EMPTY, F_USB)
|
||||||
|
|
||||||
|
# Default values of optionally user-supplied variables
|
||||||
|
BOARD ?= NONE
|
||||||
|
|
||||||
|
# Determine the utility prefix to use for the selected architecture
|
||||||
|
ifeq ($(ARCH), XMEGA)
|
||||||
|
$(warning The XMEGA device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.)
|
||||||
|
else ifeq ($(ARCH), UC3)
|
||||||
|
$(warning The UC3 device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Common LUFA C/C++ includes/definitions
|
||||||
|
LUFA_CXX_INCLUDES = -I. -I$(patsubst %/,%,$(LUFA_PATH))/..
|
||||||
|
LUFA_CXX_DEFINES = -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL
|
||||||
|
|
||||||
|
# LUFA specific standard build options
|
||||||
|
C_FLAGS += $(LUFA_CXX_INCLUDES) $(LUFA_CXX_DEFINES) $(LUFA_CXX_FLAGS)
|
||||||
|
CPP_FLAGS += $(LUFA_CXX_INCLUDES) $(LUFA_CXX_DEFINES) $(LUFA_CXX_FLAGS)
|
@ -0,0 +1,95 @@
|
|||||||
|
#
|
||||||
|
# LUFA Library
|
||||||
|
# Copyright (C) Dean Camera, 2015.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.lufa-lib.org
|
||||||
|
#
|
||||||
|
|
||||||
|
DMBS_BUILD_MODULES += LUFA_SOURCES
|
||||||
|
DMBS_BUILD_TARGETS +=
|
||||||
|
DMBS_BUILD_MANDATORY_VARS += LUFA_PATH ARCH
|
||||||
|
DMBS_BUILD_OPTIONAL_VARS +=
|
||||||
|
DMBS_BUILD_PROVIDED_VARS += LUFA_SRC_USB_DEVICE LUFA_SRC_USB_HOST \
|
||||||
|
LUFA_SRC_USB LUFA_SRC_USBCLASS_DEVICE \
|
||||||
|
LUFA_SRC_USBCLASS_HOST LUFA_SRC_USBCLASS \
|
||||||
|
LUFA_SRC_TEMPERATURE LUFA_SRC_SERIAL \
|
||||||
|
LUFA_SRC_TWI LUFA_SRC_PLATFORM
|
||||||
|
DMBS_BUILD_PROVIDED_MACROS +=
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
||||||
|
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
||||||
|
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
||||||
|
|
||||||
|
# Sanity check user supplied values
|
||||||
|
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
||||||
|
$(call ERROR_IF_EMPTY, LUFA_PATH)
|
||||||
|
$(call ERROR_IF_EMPTY, ARCH)
|
||||||
|
|
||||||
|
# Allow LUFA_ROOT_PATH to be overridden elsewhere to support legacy LUFA makefiles
|
||||||
|
LUFA_ROOT_PATH ?= $(patsubst %/,%,$(LUFA_PATH))
|
||||||
|
|
||||||
|
# Construct LUFA module source variables
|
||||||
|
LUFA_SRC_USB_COMMON := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/ConfigDescriptors.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/Events.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/USBTask.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Common/HIDParser.c \
|
||||||
|
|
||||||
|
LUFA_SRC_USB_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/PipeStream_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/HostStandardReq.c \
|
||||||
|
$(LUFA_SRC_USB_COMMON)
|
||||||
|
|
||||||
|
LUFA_SRC_USB_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/EndpointStream_$(ARCH).c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Core/DeviceStandardReq.c \
|
||||||
|
$(LUFA_SRC_USB_COMMON)
|
||||||
|
|
||||||
|
LUFA_SRC_USBCLASS_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/AudioClassDevice.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/HIDClassDevice.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MassStorageClassDevice.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MIDIClassDevice.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/PrinterClassDevice.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/RNDISClassDevice.c \
|
||||||
|
|
||||||
|
LUFA_SRC_USBCLASS_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AudioClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/CDCClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/HIDClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MassStorageClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MIDIClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/PrinterClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/RNDISClassHost.c \
|
||||||
|
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/StillImageClassHost.c
|
||||||
|
|
||||||
|
LUFA_SRC_USB := $(sort $(LUFA_SRC_USB_COMMON) $(LUFA_SRC_USB_HOST) $(LUFA_SRC_USB_DEVICE))
|
||||||
|
|
||||||
|
LUFA_SRC_USBCLASS := $(LUFA_SRC_USBCLASS_DEVICE) $(LUFA_SRC_USBCLASS_HOST)
|
||||||
|
|
||||||
|
LUFA_SRC_TEMPERATURE := $(LUFA_ROOT_PATH)/Drivers/Board/Temperature.c
|
||||||
|
|
||||||
|
LUFA_SRC_SERIAL := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/Serial_$(ARCH).c
|
||||||
|
|
||||||
|
LUFA_SRC_TWI := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/TWI_$(ARCH).c
|
||||||
|
|
||||||
|
ifeq ($(ARCH), UC3)
|
||||||
|
LUFA_SRC_PLATFORM := $(LUFA_ROOT_PATH)/Platform/UC3/Exception.S \
|
||||||
|
$(LUFA_ROOT_PATH)/Platform/UC3/InterruptManagement.c
|
||||||
|
else
|
||||||
|
LUFA_SRC_PLATFORM :=
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Build a list of all available module sources
|
||||||
|
LUFA_SRC_ALL_FILES := $(LUFA_SRC_USB) \
|
||||||
|
$(LUFA_SRC_USBCLASS) \
|
||||||
|
$(LUFA_SRC_TEMPERATURE) \
|
||||||
|
$(LUFA_SRC_SERIAL) \
|
||||||
|
$(LUFA_SRC_TWI) \
|
||||||
|
$(LUFA_SRC_PLATFORM)
|
@ -1,103 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += ATPROGRAM
|
DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += atprogram atprogram-ee
|
include $(DMBS_PATH)/atprogram.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS += MCU TARGET
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS += ATPROGRAM_PROGRAMMER ATPROGRAM_INTERFACE ATPROGRAM_PORT
|
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA ATPROGRAM Programmer Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of targets to re-program a device using the Atmel atprogram
|
|
||||||
# utility in AVR Studio 5.x and Atmel Studio 6.0 onwards.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# atprogram - Program target FLASH with application using
|
|
||||||
# atprogram
|
|
||||||
# atprogram-ee - Program target EEPROM with application data
|
|
||||||
# using atprogram
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# MCU - Microcontroller device model name
|
|
||||||
# TARGET - Application name
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# ATPROGRAM_PROGRAMMER - Name of programming hardware to use
|
|
||||||
# ATPROGRAM_INTERFACE - Name of programming interface to use
|
|
||||||
# ATPROGRAM_PORT - Name of communication port to use
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Default values of optionally user-supplied variables
|
|
||||||
ATPROGRAM_PROGRAMMER ?= atmelice
|
|
||||||
ATPROGRAM_INTERFACE ?= jtag
|
|
||||||
ATPROGRAM_PORT ?=
|
|
||||||
|
|
||||||
# Sanity check user supplied values
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, MCU)
|
|
||||||
$(call ERROR_IF_EMPTY, TARGET)
|
|
||||||
$(call ERROR_IF_EMPTY, ATPROGRAM_PROGRAMMER)
|
|
||||||
$(call ERROR_IF_EMPTY, ATPROGRAM_INTERFACE)
|
|
||||||
|
|
||||||
# Output Messages
|
|
||||||
MSG_ATPROGRAM_CMD := ' [ATPRGRM] :'
|
|
||||||
|
|
||||||
# Construct base atprogram command flags
|
|
||||||
BASE_ATPROGRAM_FLAGS := --tool $(ATPROGRAM_PROGRAMMER) --interface $(ATPROGRAM_INTERFACE) --device $(MCU)
|
|
||||||
ifneq ($(ATPROGRAM_PORT),)
|
|
||||||
BASE_ATPROGRAM_FLAGS += --port $(ATPROGRAM_PORT)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Construct the flags to use for the various memory spaces
|
|
||||||
ifeq ($(ARCH), AVR8)
|
|
||||||
ATPROGRAM_FLASH_FLAGS := --chiperase --flash
|
|
||||||
ATPROGRAM_EEPROM_FLAGS := --eeprom
|
|
||||||
else ifeq ($(ARCH), XMEGA)
|
|
||||||
ATPROGRAM_FLASH_FLAGS := --erase --flash
|
|
||||||
ATPROGRAM_EEPROM_FLAGS := --eeprom
|
|
||||||
else ifeq ($(ARCH), UC3)
|
|
||||||
ATPROGRAM_FLASH_FLAGS := --erase
|
|
||||||
ATPROGRAM_EEPROM_FLAGS := --eeprom
|
|
||||||
else
|
|
||||||
$(error Unsupported architecture "$(ARCH)")
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Programs in the target FLASH memory using ATPROGRAM
|
|
||||||
atprogram: $(TARGET).elf $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" FLASH using \"$(ATPROGRAM_PROGRAMMER)\"
|
|
||||||
atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_FLASH_FLAGS) --file $<
|
|
||||||
|
|
||||||
# Programs in the target EEPROM memory using ATPROGRAM
|
|
||||||
atprogram-ee: $(TARGET).elf $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" EEPROM using \"$(ATPROGRAM_PROGRAMMER)\"
|
|
||||||
atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_EEPROM_FLAGS) --file $<
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: atprogram atprogram-ee
|
|
||||||
|
@ -1,89 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += AVRDUDE
|
DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += avrdude avrdude-ee
|
include $(DMBS_PATH)/avrdude.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS += MCU TARGET
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS AVRDUDE_MEMORY
|
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA AVRDUDE Programmer Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of targets to re-program a device using the open source
|
|
||||||
# avr-dude utility.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# avrdude - Program target FLASH with application using
|
|
||||||
# avrdude
|
|
||||||
# avrdude-ee - Program target EEPROM with application data
|
|
||||||
# using avrdude
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# MCU - Microcontroller device model name
|
|
||||||
# TARGET - Application name
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# AVRDUDE_PROGRAMMER - Name of programming hardware to use
|
|
||||||
# AVRDUDE_PORT - Name of communication port to use
|
|
||||||
# AVRDUDE_FLAGS - Flags to pass to avr-dude
|
|
||||||
# AVRDUDE_MEMORY - Memory space to program application into (e.g.
|
|
||||||
# "application" for an XMEGA DFU device)
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Default values of optionally user-supplied variables
|
|
||||||
AVRDUDE_PROGRAMMER ?= jtagicemkii
|
|
||||||
AVRDUDE_PORT ?= usb
|
|
||||||
AVRDUDE_FLAGS ?=
|
|
||||||
AVRDUDE_MEMORY ?= flash
|
|
||||||
|
|
||||||
# Sanity check user supplied values
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, MCU)
|
|
||||||
$(call ERROR_IF_EMPTY, TARGET)
|
|
||||||
$(call ERROR_IF_EMPTY, AVRDUDE_PROGRAMMER)
|
|
||||||
$(call ERROR_IF_EMPTY, AVRDUDE_PORT)
|
|
||||||
|
|
||||||
# Output Messages
|
|
||||||
MSG_AVRDUDE_CMD := ' [AVRDUDE] :'
|
|
||||||
|
|
||||||
# Construct base avrdude command flags
|
|
||||||
BASE_AVRDUDE_FLAGS := -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
|
||||||
|
|
||||||
# Programs in the target FLASH memory using AVRDUDE
|
|
||||||
avrdude: $(TARGET).hex $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" FLASH using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\"
|
|
||||||
avrdude $(BASE_AVRDUDE_FLAGS) -U $(AVRDUDE_MEMORY):w:$< $(AVRDUDE_FLAGS)
|
|
||||||
|
|
||||||
# Programs in the target EEPROM memory using AVRDUDE
|
|
||||||
avrdude-ee: $(TARGET).eep $(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)
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: avrdude avrdude-ee
|
|
||||||
|
@ -1,351 +1,12 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += BUILD
|
DMBS_PATH ?= $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += size symbol-sizes all lib elf bin hex lss clean mostlyclean
|
DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA
|
||||||
LUFA_BUILD_MANDATORY_VARS += TARGET ARCH MCU SRC F_USB LUFA_PATH
|
include $(DMBS_PATH)/gcc.mk
|
||||||
LUFA_BUILD_OPTIONAL_VARS += BOARD 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 COMPILER_PATH
|
include $(DMBS_LUFA_PATH)/lufa-gcc.mk
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA GCC Compiler Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of targets to build a C, C++ and/or Assembly application
|
|
||||||
# via the AVR-GCC compiler.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# size - List built application size
|
|
||||||
# symbol-sizes - Print application symbols from the binary ELF
|
|
||||||
# file as a list sorted by size in bytes
|
|
||||||
# all - Build application and list size
|
|
||||||
# lib - Build and archive source files into a library
|
|
||||||
# elf - Build application ELF debug object file
|
|
||||||
# bin - Build application BIN binary object file
|
|
||||||
# hex - Build application HEX object file
|
|
||||||
# lss - Build application LSS assembly listing file
|
|
||||||
# clean - Remove all project intermediary and binary
|
|
||||||
# output files
|
|
||||||
# mostlyclean - Remove intermediary output files, but
|
|
||||||
# preserve binaries
|
|
||||||
# <filename>.s - Compile C/C++ source file into an assembly file
|
|
||||||
# for manual code inspection
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# TARGET - Application name
|
|
||||||
# ARCH - Device architecture name
|
|
||||||
# MCU - Microcontroller device model name
|
|
||||||
# SRC - List of input source files (*.c, *.cpp, *.S)
|
|
||||||
# F_USB - Speed of the input clock of the USB controller
|
|
||||||
# in Hz
|
|
||||||
# LUFA_PATH - Path to the LUFA library core
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# BOARD - LUFA board hardware
|
|
||||||
# OPTIMIZATION - Optimization level
|
|
||||||
# C_STANDARD - C Language Standard to use
|
|
||||||
# CPP_STANDARD - C++ Language Standard to use
|
|
||||||
# F_CPU - Speed of the CPU, in Hz
|
|
||||||
# C_FLAGS - Flags to pass to the C compiler only
|
|
||||||
# CPP_FLAGS - Flags to pass to the C++ compiler only
|
|
||||||
# ASM_FLAGS - Flags to pass to the assembler only
|
|
||||||
# CC_FLAGS - Common flags to pass to the C/C++ compiler and
|
|
||||||
# assembler
|
|
||||||
# LD_FLAGS - Flags to pass to the linker
|
|
||||||
# LINKER_RELAXATIONS - Enable or disable linker relaxations to
|
|
||||||
# decrease binary size (note: can cause link
|
|
||||||
# failures on systems with an unpatched binutils)
|
|
||||||
# OBJDIR - Directory for the output object and dependency
|
|
||||||
# files; if equal to ".", the output files will
|
|
||||||
# be generated in the same folder as the sources
|
|
||||||
# OBJECT_FILES - Extra object files to link in to the binaries
|
|
||||||
# DEBUG_FORMAT - Format of the debugging information to
|
|
||||||
# generate in the compiled object files
|
|
||||||
# DEBUG_LEVEL - Level the debugging information to generate in
|
|
||||||
# the compiled object files
|
|
||||||
# COMPILER_PATH - Location of the GCC toolchain to use
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Default values of optionally user-supplied variables
|
|
||||||
COMPILER_PATH ?=
|
|
||||||
BOARD ?= NONE
|
|
||||||
OPTIMIZATION ?= s
|
|
||||||
F_CPU ?=
|
|
||||||
C_STANDARD ?= gnu99
|
|
||||||
CPP_STANDARD ?= gnu++98
|
|
||||||
C_FLAGS ?=
|
|
||||||
CPP_FLAGS ?=
|
|
||||||
ASM_FLAGS ?=
|
|
||||||
CC_FLAGS ?=
|
|
||||||
OBJDIR ?= .
|
|
||||||
OBJECT_FILES ?=
|
|
||||||
DEBUG_FORMAT ?= dwarf-2
|
|
||||||
DEBUG_LEVEL ?= 2
|
|
||||||
LINKER_RELAXATIONS ?= Y
|
|
||||||
|
|
||||||
# Sanity check user supplied values
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, MCU)
|
|
||||||
$(call ERROR_IF_EMPTY, TARGET)
|
|
||||||
$(call ERROR_IF_EMPTY, ARCH)
|
|
||||||
$(call ERROR_IF_EMPTY, F_USB)
|
|
||||||
$(call ERROR_IF_EMPTY, LUFA_PATH)
|
|
||||||
$(call ERROR_IF_EMPTY, BOARD)
|
|
||||||
$(call ERROR_IF_EMPTY, OPTIMIZATION)
|
|
||||||
$(call ERROR_IF_EMPTY, C_STANDARD)
|
|
||||||
$(call ERROR_IF_EMPTY, CPP_STANDARD)
|
|
||||||
$(call ERROR_IF_EMPTY, OBJDIR)
|
|
||||||
$(call ERROR_IF_EMPTY, DEBUG_FORMAT)
|
|
||||||
$(call ERROR_IF_EMPTY, DEBUG_LEVEL)
|
|
||||||
$(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS)
|
|
||||||
|
|
||||||
# Determine the utility prefix to use for the selected architecture
|
|
||||||
ifeq ($(ARCH), AVR8)
|
|
||||||
CROSS := $(COMPILER_PATH)avr
|
|
||||||
else ifeq ($(ARCH), XMEGA)
|
|
||||||
CROSS := $(COMPILER_PATH)avr
|
|
||||||
$(warning The XMEGA device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.)
|
|
||||||
else ifeq ($(ARCH), UC3)
|
|
||||||
CROSS := $(COMPILER_PATH)avr32
|
|
||||||
$(warning The UC3 device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.)
|
|
||||||
else
|
|
||||||
$(error Unsupported architecture "$(ARCH)")
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Output Messages
|
|
||||||
MSG_INFO_MESSAGE := ' [INFO] :'
|
|
||||||
MSG_COMPILE_CMD := ' [GCC] :'
|
|
||||||
MSG_ASSEMBLE_CMD := ' [GAS] :'
|
|
||||||
MSG_NM_CMD := ' [NM] :'
|
|
||||||
MSG_REMOVE_CMD := ' [RM] :'
|
|
||||||
MSG_LINK_CMD := ' [LNK] :'
|
|
||||||
MSG_ARCHIVE_CMD := ' [AR] :'
|
|
||||||
MSG_SIZE_CMD := ' [SIZE] :'
|
|
||||||
MSG_OBJCPY_CMD := ' [OBJCPY] :'
|
|
||||||
MSG_OBJDMP_CMD := ' [OBJDMP] :'
|
|
||||||
|
|
||||||
# Convert input source file list to differentiate them by type
|
|
||||||
C_SOURCE := $(filter %.c, $(SRC))
|
|
||||||
CPP_SOURCE := $(filter %.cpp, $(SRC))
|
|
||||||
ASM_SOURCE := $(filter %.S, $(SRC))
|
|
||||||
|
|
||||||
# Create a list of unknown source file types, if any are found throw an error
|
|
||||||
UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC))
|
|
||||||
ifneq ($(UNKNOWN_SOURCE),)
|
|
||||||
$(error Unknown input source file formats: $(UNKNOWN_SOURCE))
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Convert input source filenames into a list of required output object files
|
|
||||||
OBJECT_FILES += $(addsuffix .o, $(basename $(SRC)))
|
|
||||||
|
|
||||||
# Check if an output object file directory was specified instead of the input file location
|
|
||||||
ifneq ($(OBJDIR),.)
|
|
||||||
# Prefix all the object filenames with the output object file directory path
|
|
||||||
OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES)))
|
|
||||||
|
|
||||||
# Check if any object file (without path) appears more than once in the object file list
|
|
||||||
ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES)))
|
|
||||||
$(error Cannot build with OBJDIR parameter set - one or more object file name is not unique)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Create the output object file directory if it does not exist and add it to the virtual path list
|
|
||||||
$(shell mkdir $(OBJDIR) 2> /dev/null)
|
|
||||||
VPATH += $(dir $(SRC))
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Create a list of dependency files from the list of object files
|
|
||||||
DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d)
|
|
||||||
|
|
||||||
# Create a list of common flags to pass to the compiler/linker/assembler
|
|
||||||
BASE_CC_FLAGS := -pipe -g$(DEBUG_FORMAT) -g$(DEBUG_LEVEL)
|
|
||||||
ifeq ($(ARCH), AVR8)
|
|
||||||
BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct
|
|
||||||
else ifeq ($(ARCH), XMEGA)
|
|
||||||
BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct
|
|
||||||
else ifeq ($(ARCH), UC3)
|
|
||||||
BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos
|
|
||||||
endif
|
|
||||||
BASE_CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections
|
|
||||||
BASE_CC_FLAGS += -I. -I$(patsubst %/,%,$(LUFA_PATH))/..
|
|
||||||
BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL
|
|
||||||
ifneq ($(F_CPU),)
|
|
||||||
BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL
|
|
||||||
endif
|
|
||||||
ifeq ($(LINKER_RELAXATIONS), Y)
|
|
||||||
BASE_CC_FLAGS += -mrelax
|
|
||||||
endif
|
|
||||||
|
|
||||||
# This flag is required for bootloaders as GCC will emit invalid jump table
|
|
||||||
# assembly code for devices with large amounts of flash; the jump table target
|
|
||||||
# is extracted from FLASH without using the correct ELPM instruction, resulting
|
|
||||||
# in a pseudo-random jump target.
|
|
||||||
BASE_CC_FLAGS += -fno-jump-tables
|
|
||||||
|
|
||||||
# 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_ASM_FLAGS := -x assembler-with-cpp
|
|
||||||
|
|
||||||
# Create a list of flags to pass to the linker
|
|
||||||
BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections
|
|
||||||
ifeq ($(LINKER_RELAXATIONS), Y)
|
|
||||||
BASE_LD_FLAGS += -Wl,--relax
|
|
||||||
endif
|
|
||||||
ifeq ($(ARCH), AVR8)
|
|
||||||
BASE_LD_FLAGS += -mmcu=$(MCU)
|
|
||||||
else ifeq ($(ARCH), XMEGA)
|
|
||||||
BASE_LD_FLAGS += -mmcu=$(MCU)
|
|
||||||
else ifeq ($(ARCH), UC3)
|
|
||||||
BASE_LD_FLAGS += -mpart=$(MCU:at32%=%) --rodata-writable --direct-data
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Determine flags to pass to the size utility based on its reported features (only invoke if size target required)
|
|
||||||
# and on an architecture where this non-standard patch is available
|
|
||||||
ifneq ($(ARCH), UC3)
|
|
||||||
size: SIZE_MCU_FLAG := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
|
||||||
size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Pre-build informational target, to give compiler and project name information when building
|
|
||||||
build_begin:
|
|
||||||
@echo $(MSG_INFO_MESSAGE) Begin compilation of project \"$(TARGET)\"...
|
|
||||||
@echo ""
|
|
||||||
@$(CROSS)-gcc --version
|
|
||||||
|
|
||||||
# Post-build informational target, to project name information when building has completed
|
|
||||||
build_end:
|
|
||||||
@echo $(MSG_INFO_MESSAGE) Finished building project \"$(TARGET)\".
|
|
||||||
|
|
||||||
# Prints size information of a compiled application (FLASH, RAM and EEPROM usages)
|
|
||||||
size: $(TARGET).elf
|
|
||||||
@echo $(MSG_SIZE_CMD) Determining size of \"$<\"
|
|
||||||
@echo ""
|
|
||||||
$(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $<
|
|
||||||
|
|
||||||
# Prints size information on the symbols within a compiled application in decimal bytes
|
|
||||||
symbol-sizes: $(TARGET).elf
|
|
||||||
@echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes
|
|
||||||
$(CROSS)-nm --size-sort --demangle --radix=d $<
|
|
||||||
|
|
||||||
# Cleans intermediary build files, leaving only the compiled application files
|
|
||||||
mostlyclean:
|
|
||||||
@echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\"
|
|
||||||
rm -f $(OBJECT_FILES)
|
|
||||||
@echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\"
|
|
||||||
rm -f $(DEPENDENCY_FILES)
|
|
||||||
|
|
||||||
# Cleans all build files, leaving only the original source code
|
|
||||||
clean: mostlyclean
|
|
||||||
@echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\"
|
|
||||||
rm -f $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym lib$(TARGET).a
|
|
||||||
|
|
||||||
# Performs a complete build of the user application and prints size information afterwards
|
|
||||||
all: build_begin elf hex bin lss sym size build_end
|
|
||||||
|
|
||||||
# Helper targets, to build a specific type of output file without having to know the project target name
|
|
||||||
lib: lib$(TARGET).a
|
|
||||||
elf: $(TARGET).elf
|
|
||||||
hex: $(TARGET).hex $(TARGET).eep
|
|
||||||
bin: $(TARGET).bin
|
|
||||||
lss: $(TARGET).lss
|
|
||||||
sym: $(TARGET).sym
|
|
||||||
|
|
||||||
# Default target to *create* the user application's specified source files; if this rule is executed by
|
|
||||||
# make, the input source file doesn't exist and an error needs to be presented to the user
|
|
||||||
$(SRC):
|
|
||||||
$(error Source file does not exist: $@)
|
|
||||||
|
|
||||||
# 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 $@
|
|
||||||
|
|
||||||
# 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 $@
|
|
||||||
|
|
||||||
# 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 $@
|
|
||||||
|
|
||||||
# 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 $@
|
|
||||||
|
|
||||||
# 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 $@
|
|
||||||
|
|
||||||
# Generates a library archive file from the user application, which can be linked into other applications
|
|
||||||
.PRECIOUS : $(OBJECT_FILES)
|
|
||||||
.SECONDARY : %.a
|
|
||||||
%.a: $(OBJECT_FILES)
|
|
||||||
@echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\"
|
|
||||||
$(CROSS)-ar rcs $@ $(OBJECT_FILES)
|
|
||||||
|
|
||||||
# Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data
|
|
||||||
# files, or used for programming and debugging directly
|
|
||||||
.PRECIOUS : $(OBJECT_FILES)
|
|
||||||
.SECONDARY : %.elf
|
|
||||||
%.elf: $(OBJECT_FILES)
|
|
||||||
@echo $(MSG_LINK_CMD) Linking object files into \"$@\"
|
|
||||||
$(CROSS)-gcc $^ -o $@ $(BASE_LD_FLAGS) $(LD_FLAGS)
|
|
||||||
|
|
||||||
# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it
|
|
||||||
%.hex: %.elf
|
|
||||||
@echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\"
|
|
||||||
$(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
|
|
||||||
|
|
||||||
# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Binary format file of it
|
|
||||||
%.bin: %.elf
|
|
||||||
@echo $(MSG_OBJCPY_CMD) Extracting BIN file data from \"$<\"
|
|
||||||
$(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@
|
|
||||||
|
|
||||||
# Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it
|
|
||||||
%.eep: %.elf
|
|
||||||
@echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\"
|
|
||||||
$(CROSS)-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings $< $@ || exit 0
|
|
||||||
|
|
||||||
# Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data
|
|
||||||
%.lss: %.elf
|
|
||||||
@echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\"
|
|
||||||
$(CROSS)-objdump -h -d -S -z $< > $@
|
|
||||||
|
|
||||||
# Creates a symbol file listing the loadable and discarded symbols from an input project ELF file
|
|
||||||
%.sym: %.elf
|
|
||||||
@echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\"
|
|
||||||
$(CROSS)-nm -n $< > $@
|
|
||||||
|
|
||||||
# Include build dependency files
|
|
||||||
-include $(DEPENDENCY_FILES)
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: build_begin build_end size symbol-sizes lib elf hex lss clean mostlyclean
|
|
||||||
|
@ -1,175 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += CORE
|
DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += help list_targets list_modules list_mandatory list_optional list_provided list_macros
|
include $(DMBS_PATH)/core.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS +=
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA Core Build System Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of core build targets for the LUFA build system
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# help - Build system help
|
|
||||||
# list_targets - List all build targets
|
|
||||||
# list_modules - List all build modules
|
|
||||||
# list_mandatory - List all mandatory make variables required by
|
|
||||||
# the included build modules of the application
|
|
||||||
# list_optional - List all optional make variables required by
|
|
||||||
# the included build modules of the application
|
|
||||||
# list_provided - List all provided make variables from the
|
|
||||||
# included build modules of the application
|
|
||||||
# list_macros - List all provided make macros from the
|
|
||||||
# included build modules of the application
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
# Converts a given input to a printable output using "(None)" if no items are in the list
|
|
||||||
CONVERT_TO_PRINTABLE = $(if $(strip $(1)), $(1), (None))
|
|
||||||
|
|
||||||
|
|
||||||
# Build sorted and filtered lists of the included build module data
|
|
||||||
SORTED_LUFA_BUILD_MODULES = $(sort $(LUFA_BUILD_MODULES))
|
|
||||||
SORTED_LUFA_BUILD_TARGETS = $(sort $(LUFA_BUILD_TARGETS))
|
|
||||||
SORTED_LUFA_MANDATORY_VARS = $(sort $(LUFA_BUILD_MANDATORY_VARS))
|
|
||||||
SORTED_LUFA_OPTIONAL_VARS = $(filter-out $(SORTED_LUFA_MANDATORY_VARS), $(sort $(LUFA_BUILD_OPTIONAL_VARS)))
|
|
||||||
SORTED_LUFA_PROVIDED_VARS = $(sort $(LUFA_BUILD_PROVIDED_VARS))
|
|
||||||
SORTED_LUFA_PROVIDED_MACROS = $(sort $(LUFA_BUILD_PROVIDED_MACROS))
|
|
||||||
|
|
||||||
# Create printable versions of the sorted build module data (use "(None)" when no data is available)
|
|
||||||
PRINTABLE_LUFA_BUILD_MODULES = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_BUILD_MODULES))
|
|
||||||
PRINTABLE_LUFA_BUILD_TARGETS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_BUILD_TARGETS))
|
|
||||||
PRINTABLE_LUFA_MANDATORY_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_MANDATORY_VARS))
|
|
||||||
PRINTABLE_LUFA_OPTIONAL_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_OPTIONAL_VARS))
|
|
||||||
PRINTABLE_LUFA_PROVIDED_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_PROVIDED_VARS))
|
|
||||||
PRINTABLE_LUFA_PROVIDED_MACROS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_PROVIDED_MACROS))
|
|
||||||
|
|
||||||
help:
|
|
||||||
@echo "==================================================================="
|
|
||||||
@echo " LUFA Build System 2.0 "
|
|
||||||
@echo " (C) Dean Camera, 2016 { dean @ fourwalledcubicle . com } "
|
|
||||||
@echo "==================================================================="
|
|
||||||
@echo "DESCRIPTION: "
|
|
||||||
@echo " This build system is a set of makefile modules for (GNU) Make, to "
|
|
||||||
@echo " provide a simple system for building LUFA powered applications. "
|
|
||||||
@echo " Each makefile module can be included from within a user makefile, "
|
|
||||||
@echo " to expose the build rules documented in the comments at the top of"
|
|
||||||
@echo " each build module. "
|
|
||||||
@echo " "
|
|
||||||
@echo "USAGE: "
|
|
||||||
@echo " To execute a rule, define all variables indicated in the desired "
|
|
||||||
@echo " module as a required parameter before including the build module "
|
|
||||||
@echo " in your project makefile. Parameters marked as optional will "
|
|
||||||
@echo " assume a default value in the modules if not user-assigned. "
|
|
||||||
@echo " "
|
|
||||||
@echo " By default the target output shows both a friendly summary, as "
|
|
||||||
@echo " well as the actual invoked command. To suppress the output of the "
|
|
||||||
@echo " invoked commands and show only the friendly command output, run "
|
|
||||||
@echo " make with the \"-s\" switch added before the target(s). "
|
|
||||||
@echo " "
|
|
||||||
@echo "SEE ALSO: "
|
|
||||||
@echo " For more information, see the 'Build System' chapter of the LUFA "
|
|
||||||
@echo " project documentation. "
|
|
||||||
@echo "==================================================================="
|
|
||||||
@echo " "
|
|
||||||
@echo " Currently used build system modules in this application: "
|
|
||||||
@echo " "
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_BUILD_MODULES:%= - %\n)"
|
|
||||||
@echo " "
|
|
||||||
@echo " "
|
|
||||||
@echo " Currently available build targets in this application: "
|
|
||||||
@echo " "
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_BUILD_TARGETS:%= - %\n)"
|
|
||||||
@echo " "
|
|
||||||
@echo " "
|
|
||||||
@echo " Mandatory variables required by the selected build Modules: "
|
|
||||||
@echo " "
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_MANDATORY_VARS:%= - %\n)"
|
|
||||||
@echo " "
|
|
||||||
@echo " "
|
|
||||||
@echo " Optional variables required by the selected build Modules: "
|
|
||||||
@echo " "
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_OPTIONAL_VARS:%= - %\n)"
|
|
||||||
@echo " "
|
|
||||||
@echo " "
|
|
||||||
@echo " Variables provided by the selected build Modules: "
|
|
||||||
@echo " "
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_PROVIDED_VARS:%= - %\n)"
|
|
||||||
@echo " "
|
|
||||||
@echo " "
|
|
||||||
@echo " Macros provided by the selected build Modules: "
|
|
||||||
@echo " "
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_PROVIDED_MACROS:%= - %\n)"
|
|
||||||
@echo " "
|
|
||||||
@echo "==================================================================="
|
|
||||||
@echo " The LUFA BuildSystem 2.0 - Powered By Positive Thinking (tm) "
|
|
||||||
@echo "==================================================================="
|
|
||||||
|
|
||||||
# Lists build modules included by the project makefile, in alphabetical order
|
|
||||||
list_modules:
|
|
||||||
@echo Currently Used Build System Modules:
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_BUILD_MODULES:%= - %\n)"
|
|
||||||
|
|
||||||
# Lists build targets included by the project makefile, in alphabetical order
|
|
||||||
list_targets:
|
|
||||||
@echo Currently Available Build Targets:
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_BUILD_TARGETS:%= - %\n)"
|
|
||||||
|
|
||||||
# Lists mandatory variables that must be set by the project makefile, in alphabetical order
|
|
||||||
list_mandatory:
|
|
||||||
@echo Mandatory Variables for Included Modules:
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_MANDATORY_VARS:%= - %\n)"
|
|
||||||
|
|
||||||
# Lists optional variables that must be set by the project makefile, in alphabetical order
|
|
||||||
list_optional:
|
|
||||||
@echo Optional Variables for Included Modules:
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_OPTIONAL_VARS:%= - %\n)"
|
|
||||||
|
|
||||||
# Lists variables provided by the included build modules, in alphabetical order
|
|
||||||
list_provided:
|
|
||||||
@echo Variables Provided by the Included Modules:
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_PROVIDED_VARS:%= - %\n)"
|
|
||||||
|
|
||||||
# Lists macros provided by the included build modules, in alphabetical order
|
|
||||||
list_macros:
|
|
||||||
@echo Macros Provided by the Included Modules:
|
|
||||||
@printf " %b" "$(PRINTABLE_LUFA_PROVIDED_MACROS:%= - %\n)"
|
|
||||||
|
|
||||||
# Disable default in-built make rules (those that are needed are explicitly
|
|
||||||
# defined, and doing so has performance benefits when recursively building)
|
|
||||||
ifeq ($(filter -r,$(MAKEFLAGS)),)
|
|
||||||
MAKEFLAGS += -r
|
|
||||||
endif
|
|
||||||
.SUFFIXES:
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: help list_modules list_targets list_mandatory list_optional list_provided list_macros
|
|
||||||
|
@ -1,107 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += CPPCHECK
|
DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += cppcheck cppcheck-config
|
include $(DMBS_PATH)/cppcheck.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS += SRC
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS += CPPCHECK_INCLUDES CPPCHECK_EXCLUDES CPPCHECK_MSG_TEMPLATE CPPCHECK_ENABLE \
|
|
||||||
CPPCHECK_SUPPRESS CPPCHECK_FAIL_ON_WARNING CPPCHECK_QUIET CPPCHECK_FLAGS
|
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA CPPCheck Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of targets to scan a project with the free "cppcheck" static
|
|
||||||
# analysis tool, to check for code errors at runtime
|
|
||||||
# (see http://cppcheck.sourceforge.net).
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# cppcheck - Scan the project with CPPCheck
|
|
||||||
# cppcheck-config - Use CPPCheck to look for missing include files
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# SRC - List of source files to statically analyze
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# CPPCHECK_INCLUDES - Extra include paths to search for missing
|
|
||||||
# header files
|
|
||||||
# CPPCHECK_EXCLUDES - Source file paths to exclude checking (can be
|
|
||||||
# a path fragment if desired)
|
|
||||||
# CPPCHECK_MSG_TEMPLATE - Template for cppcheck error and warning output
|
|
||||||
# CPPCHECK_ENABLE - General cppcheck category checks to enable
|
|
||||||
# CPPCHECK_SUPPRESS - Specific cppcheck warnings to disable by ID
|
|
||||||
# CPPCHECK_FAIL_ON_WARNING - Set to Y to fail the build on cppcheck
|
|
||||||
# warnings, N to continue even if warnings occur
|
|
||||||
# CPPCHECK_QUIET - Enable cppcheck verbose or quiet output mode
|
|
||||||
# CPPCHECK_FLAGS - Additional flags to pass to cppcheck
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Default values of optionally user-supplied variables
|
|
||||||
CPPCHECK_INCLUDES ?=
|
|
||||||
CPPCHECK_EXCLUDES ?=
|
|
||||||
CPPCHECK_MSG_TEMPLATE ?= {file}:{line}: {severity} ({id}): {message}
|
|
||||||
CPPCHECK_ENABLE ?= all
|
|
||||||
CPPCHECK_SUPPRESS ?= variableScope missingInclude
|
|
||||||
CPPCHECK_FAIL_ON_WARNING ?= Y
|
|
||||||
CPPCHECK_QUIET ?= Y
|
|
||||||
CPPCHECK_FLAGS ?=
|
|
||||||
|
|
||||||
# Sanity check user supplied values
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, SRC)
|
|
||||||
$(call ERROR_IF_EMPTY, CPPCHECK_MSG_TEMPLATE)
|
|
||||||
$(call ERROR_IF_EMPTY, CPPCHECK_ENABLE)
|
|
||||||
$(call ERROR_IF_NONBOOL, CPPCHECK_FAIL_ON_WARNING)
|
|
||||||
$(call ERROR_IF_NONBOOL, CPPCHECK_QUIET)
|
|
||||||
|
|
||||||
# Build a default argument list for cppcheck
|
|
||||||
BASE_CPPCHECK_FLAGS := --template="$(CPPCHECK_MSG_TEMPLATE)" $(CPPCHECK_INCLUDES:%=-I%) $(CPPCHECK_EXCLUDES:%=-i%) --inline-suppr --force --std=c99
|
|
||||||
|
|
||||||
# Sanity check parameters and construct additional command line arguments to cppcheck
|
|
||||||
ifeq ($(CPPCHECK_FAIL_ON_WARNING), Y)
|
|
||||||
BASE_CPPCHECK_FLAGS += --error-exitcode=1
|
|
||||||
endif
|
|
||||||
ifeq ($(CPPCHECK_QUIET), Y)
|
|
||||||
BASE_CPPCHECK_FLAGS += --quiet
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Output Messages
|
|
||||||
MSG_CPPCHECK_CMD := ' [CPPCHECK]:'
|
|
||||||
|
|
||||||
# Checks the CPPCheck configuration as used in the user project, to determine if any paths are missing or invalid
|
|
||||||
cppcheck-config: $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_CPPCHECK_CMD) Checking cppcheck configuration check on source files
|
|
||||||
cppcheck $(BASE_CPPCHECK_FLAGS) --check-config $(CPPCHECK_FLAGS) $(SRC)
|
|
||||||
|
|
||||||
# Runs a static analysis using CPPCheck to determine if there are any issues
|
|
||||||
cppcheck: $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_CPPCHECK_CMD) Performing static analysis on source files
|
|
||||||
cppcheck $(BASE_CPPCHECK_FLAGS) --enable=$(CPPCHECK_ENABLE) $(CPPCHECK_SUPPRESS:%=--suppress=%) $(CPPCHECK_FLAGS) $(SRC)
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: cppcheck-config cppcheck
|
|
||||||
|
@ -1,95 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += DFU
|
DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += flip flip-ee dfu dfu-ee
|
include $(DMBS_PATH)/dfu.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS += MCU TARGET
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA DFU Bootloader Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of targets to re-program a device currently running a DFU
|
|
||||||
# class bootloader with a project's FLASH and EEPROM files.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# flip - Program FLASH into target via Atmel FLIP
|
|
||||||
# flip-ee - Program EEPROM into target via Atmel FLIP
|
|
||||||
# dfu - Program FLASH into target via dfu-programmer
|
|
||||||
# dfu-ee - Program EEPROM into target via dfu-programmer
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# MCU - Microcontroller device model name
|
|
||||||
# TARGET - Application name
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Sanity-check values of mandatory user-supplied variables
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, MCU)
|
|
||||||
$(call ERROR_IF_EMPTY, TARGET)
|
|
||||||
|
|
||||||
# Output Messages
|
|
||||||
MSG_COPY_CMD := ' [CP] :'
|
|
||||||
MSG_REMOVE_CMD := ' [RM] :'
|
|
||||||
MSG_DFU_CMD := ' [DFU] :'
|
|
||||||
|
|
||||||
# Programs in the target FLASH memory using BATCHISP, the command line tool used by FLIP
|
|
||||||
flip: $(TARGET).hex $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_DFU_CMD) Programming FLASH with batchisp using \"$<\"
|
|
||||||
batchisp -hardware usb -device $(MCU) -operation erase f loadbuffer $< program
|
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
|
||||||
|
|
||||||
# Programs in the target EEPROM memory using BATCHISP, the command line tool used by FLIP
|
|
||||||
flip-ee: $(TARGET).eep $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_COPY_CMD) Copying EEP file to temporary file \"$<.hex\"
|
|
||||||
cp $< $<.hex
|
|
||||||
@echo $(MSG_DFU_CMD) Programming EEPROM with batchisp using \"$<.hex\"
|
|
||||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $<.hex program
|
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
|
||||||
@echo $(MSG_REMOVE_CMD) Removing temporary file \"$<.hex\"
|
|
||||||
rm $<.hex
|
|
||||||
|
|
||||||
# Programs in the target FLASH memory using DFU-PROGRAMMER
|
|
||||||
dfu: $(TARGET).hex $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_DFU_CMD) Programming FLASH with dfu-programmer using \"$<\"
|
|
||||||
dfu-programmer $(MCU) erase
|
|
||||||
dfu-programmer $(MCU) flash $<
|
|
||||||
dfu-programmer $(MCU) reset
|
|
||||||
|
|
||||||
# Programs in the target EEPROM memory using DFU-PROGRAMMER
|
|
||||||
dfu-ee: $(TARGET).eep $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_DFU_CMD) Programming EEPROM with dfu-programmer using \"$<\"
|
|
||||||
dfu-programmer $(MCU) flash --eeprom $<
|
|
||||||
dfu-programmer $(MCU) reset
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: flip flip-ee dfu dfu-ee
|
|
||||||
|
@ -1,100 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += DOXYGEN
|
DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += doxygen doxygen_upgrade doxygen_create
|
include $(DMBS_PATH)/doxygen.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS += LUFA_PATH
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS += DOXYGEN_CONF DOXYGEN_FAIL_ON_WARNING DOXYGEN_OVERRIDE_PARAMS
|
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA Doxygen Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of targets to automatically build Doxygen documentation for
|
|
||||||
# a project (see www.doxygen.org).
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# doxygen - Build Doxygen Documentation
|
|
||||||
# doxygen_create - Create a new Doxygen configuration file using
|
|
||||||
# the latest template
|
|
||||||
# doxygen_upgrade - Upgrade an existing Doxygen configuration file
|
|
||||||
# to the latest template
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# LUFA_PATH - Path to the LUFA library core
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# DOXYGEN_CONF - Doxygen configuration filename
|
|
||||||
# DOXYGEN_FAIL_ON_WARNING - Set to Y to fail the build on Doxygen warnings,
|
|
||||||
# N to continue even if warnings occur
|
|
||||||
# DOXYGEN_OVERRIDE_PARAMS - Parameters to override in the doxygen
|
|
||||||
# configuration file
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Default values of optionally user-supplied variables
|
|
||||||
DOXYGEN_CONF ?= doxyfile
|
|
||||||
DOXYGEN_FAIL_ON_WARNING ?= Y
|
|
||||||
DOXYGEN_OVERRIDE_PARAMS ?= QUIET=YES HTML_EXTRA_STYLESHEET=$(patsubst %/,%,$(LUFA_PATH))/DoxygenPages/Style/Style.css
|
|
||||||
|
|
||||||
# Sanity check user supplied values
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, DOXYGEN_CONF)
|
|
||||||
$(call ERROR_IF_EMPTY, LUFA_PATH)
|
|
||||||
$(call ERROR_IF_NONBOOL, DOXYGEN_FAIL_ON_WARNING)
|
|
||||||
|
|
||||||
# Output Messages
|
|
||||||
MSG_DOXYGEN_CMD := ' [DOXYGEN] :'
|
|
||||||
|
|
||||||
# Determine Doxygen invocation command
|
|
||||||
BASE_DOXYGEN_CMD := ( cat $(DOXYGEN_CONF) $(DOXYGEN_OVERRIDE_PARAMS:%=; echo "%") ) | doxygen -
|
|
||||||
ifeq ($(DOXYGEN_FAIL_ON_WARNING), Y)
|
|
||||||
DOXYGEN_CMD := if ( $(BASE_DOXYGEN_CMD) 2>&1 | grep -v -e "[Ww]arning:\|recompile doxygen" ;); then exit 1; fi;
|
|
||||||
else
|
|
||||||
DOXYGEN_CMD := $(BASE_DOXYGEN_CMD)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Error if the specified Doxygen configuration file does not exist
|
|
||||||
$(DOXYGEN_CONF):
|
|
||||||
$(error Doxygen configuration file $@ does not exist)
|
|
||||||
|
|
||||||
# Builds the project documentation using the specified configuration file and the DOXYGEN tool
|
|
||||||
doxygen: $(DOXYGEN_CONF) $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_DOXYGEN_CMD) Configuration file \"$(DOXYGEN_CONF)\" with parameters \"$(DOXYGEN_OVERRIDE_PARAMS)\"
|
|
||||||
$(DOXYGEN_CMD)
|
|
||||||
|
|
||||||
# Upgrades an existing Doxygen configuration file to the latest Doxygen template, preserving settings
|
|
||||||
doxygen_upgrade: $(DOXYGEN_CONF) $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_DOXYGEN_CMD) Upgrading configuration file \"$(DOXYGEN_CONF)\" with latest template
|
|
||||||
doxygen -u $(DOXYGEN_CONF) > /dev/null
|
|
||||||
|
|
||||||
# Creates a new Doxygen configuration file with the set file name
|
|
||||||
doxygen_create: $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_DOXYGEN_CMD) Creating new configuration file \"$(DOXYGEN_CONF)\" with latest template
|
|
||||||
doxygen -g $(DOXYGEN_CONF) > /dev/null
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: doxygen doxygen_upgrade doxygen_create
|
|
||||||
|
@ -1,96 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += HID
|
DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS
|
||||||
LUFA_BUILD_TARGETS += hid hid-ee teensy teensy-ee
|
include $(DMBS_PATH)/hid.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS += MCU TARGET
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA HID Bootloader Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of targets to re-program a device currently running a HID
|
|
||||||
# class bootloader with a project's FLASH files.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# hid - Program FLASH into target via
|
|
||||||
# hid_bootloader_cli
|
|
||||||
# hid-ee - Program EEPROM into target via a temporary
|
|
||||||
# AVR application and hid_bootloader_cli
|
|
||||||
# teensy - Program FLASH into target via
|
|
||||||
# teensy_loader_cli
|
|
||||||
# teensy-ee - Program EEPROM into target via a temporary
|
|
||||||
# AVR application and teensy_loader_cli
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# MCU - Microcontroller device model name
|
|
||||||
# TARGET - Application name
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
LUFA_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Sanity-check values of mandatory user-supplied variables
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, MCU)
|
|
||||||
$(call ERROR_IF_EMPTY, TARGET)
|
|
||||||
|
|
||||||
# Output Messages
|
|
||||||
MSG_HID_BOOTLOADER_CMD := ' [HID] :'
|
|
||||||
MSG_OBJCPY_CMD := ' [OBJCPY] :'
|
|
||||||
MSG_MAKE_CMD := ' [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 \"$<\"
|
|
||||||
hid_bootloader_cli -mmcu=$(MCU) -v $<
|
|
||||||
|
|
||||||
# Programs in the target EEPROM memory using the HID_BOOTLOADER_CLI tool (note: clears target FLASH memory)
|
|
||||||
hid-ee: $(TARGET).eep $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\"
|
|
||||||
avr-objcopy -I ihex -O binary $< $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin
|
|
||||||
@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\"
|
|
||||||
$(MAKE) -C $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean hid
|
|
||||||
|
|
||||||
# Programs in the target FLASH memory using the TEENSY_BOOTLOADER_CLI tool
|
|
||||||
teensy: $(TARGET).hex $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with teensy_loader_cli using \"$<\"
|
|
||||||
teensy_loader_cli -mmcu=$(MCU) -v $<
|
|
||||||
|
|
||||||
# Programs in the target EEPROM memory using the TEENSY_BOOTLOADER_CLI tool (note: clears target FLASH memory)
|
|
||||||
teensy-ee: $(TARGET).hex $(MAKEFILE_LIST)
|
|
||||||
@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\"
|
|
||||||
avr-objcopy -I ihex -O binary $< $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin
|
|
||||||
@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\"
|
|
||||||
$(MAKE) -s -C $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean teensy
|
|
||||||
|
|
||||||
# Phony build targets for this module
|
|
||||||
.PHONY: hid hid-ee teensy teensy-ee
|
|
||||||
|
@ -1,144 +1,10 @@
|
|||||||
#
|
#
|
||||||
# LUFA Library
|
# LUFA Library
|
||||||
# Copyright (C) Dean Camera, 2016.
|
# Copyright (C) Dean Camera, 2015.
|
||||||
#
|
#
|
||||||
# dean [at] fourwalledcubicle [dot] com
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
# www.lufa-lib.org
|
# www.lufa-lib.org
|
||||||
#
|
#
|
||||||
|
|
||||||
LUFA_BUILD_MODULES += SOURCES
|
DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA
|
||||||
LUFA_BUILD_TARGETS +=
|
include $(DMBS_LUFA_PATH)/lufa-sources.mk
|
||||||
LUFA_BUILD_MANDATORY_VARS += LUFA_PATH ARCH
|
|
||||||
LUFA_BUILD_OPTIONAL_VARS +=
|
|
||||||
LUFA_BUILD_PROVIDED_VARS += LUFA_SRC_USB_DEVICE LUFA_SRC_USB_HOST \
|
|
||||||
LUFA_SRC_USB LUFA_SRC_USBCLASS_DEVICE \
|
|
||||||
LUFA_SRC_USBCLASS_HOST LUFA_SRC_USBCLASS \
|
|
||||||
LUFA_SRC_TEMPERATURE LUFA_SRC_SERIAL \
|
|
||||||
LUFA_SRC_TWI LUFA_SRC_PLATFORM
|
|
||||||
LUFA_BUILD_PROVIDED_MACROS +=
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LUFA Sources Buildsystem Makefile Module.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DESCRIPTION:
|
|
||||||
# Provides a set of makefile variables for the various LUFA module sources.
|
|
||||||
# Once included, the sources required to use a given LUFA module will become
|
|
||||||
# available using the makefile variable names listed in the LUFA project
|
|
||||||
# documentation.
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# TARGETS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# MANDATORY PARAMETERS:
|
|
||||||
#
|
|
||||||
# LUFA_PATH - Path to the LUFA library core
|
|
||||||
# ARCH - Device architecture name
|
|
||||||
#
|
|
||||||
# OPTIONAL PARAMETERS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# PROVIDED VARIABLES:
|
|
||||||
#
|
|
||||||
# LUFA_SRC_USB_DEVICE - List of LUFA USB driver source files required
|
|
||||||
# for USB Device mode only
|
|
||||||
# LUFA_SRC_USB_HOST - List of LUFA USB driver source files required
|
|
||||||
# for USB Host mode only
|
|
||||||
# LUFA_SRC_USB - List of LUFA USB driver source files for all
|
|
||||||
# USB modes
|
|
||||||
# LUFA_SRC_USBCLASS_DEVICE - List of LUFA USB Class driver source files for
|
|
||||||
# USB Device mode only
|
|
||||||
# LUFA_SRC_USBCLASS_HOST - List of LUFA USB Class driver source files for
|
|
||||||
# USB Host mode only
|
|
||||||
# LUFA_SRC_USBCLASS - List of LUFA USB Class driver source files for
|
|
||||||
# all USB modes
|
|
||||||
# LUFA_SRC_TEMPERATURE - List of LUFA temperature sensor driver source
|
|
||||||
# files
|
|
||||||
# LUFA_SRC_SERIAL - List of LUFA Serial U(S)ART driver source files
|
|
||||||
# LUFA_SRC_TWI - List of LUFA TWI driver source files
|
|
||||||
# LUFA_SRC_PLATFORM - List of LUFA architecture specific platform
|
|
||||||
# management source files
|
|
||||||
#
|
|
||||||
# PROVIDED MACROS:
|
|
||||||
#
|
|
||||||
# (None)
|
|
||||||
#
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))
|
|
||||||
ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))
|
|
||||||
ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))
|
|
||||||
|
|
||||||
# Sanity check user supplied values
|
|
||||||
$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))
|
|
||||||
$(call ERROR_IF_EMPTY, LUFA_PATH)
|
|
||||||
$(call ERROR_IF_EMPTY, ARCH)
|
|
||||||
|
|
||||||
# Allow LUFA_ROOT_PATH to be overridden elsewhere to support legacy LUFA makefiles
|
|
||||||
LUFA_ROOT_PATH ?= $(patsubst %/,%,$(LUFA_PATH))
|
|
||||||
|
|
||||||
# Construct LUFA module source variables
|
|
||||||
LUFA_SRC_USB_COMMON := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/ConfigDescriptors.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/Events.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/USBTask.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Common/HIDParser.c \
|
|
||||||
|
|
||||||
LUFA_SRC_USB_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/PipeStream_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/HostStandardReq.c \
|
|
||||||
$(LUFA_SRC_USB_COMMON)
|
|
||||||
|
|
||||||
LUFA_SRC_USB_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/EndpointStream_$(ARCH).c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Core/DeviceStandardReq.c \
|
|
||||||
$(LUFA_SRC_USB_COMMON)
|
|
||||||
|
|
||||||
LUFA_SRC_USBCLASS_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/AudioClassDevice.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/HIDClassDevice.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MassStorageClassDevice.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MIDIClassDevice.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/PrinterClassDevice.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/RNDISClassDevice.c \
|
|
||||||
|
|
||||||
LUFA_SRC_USBCLASS_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AudioClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/CDCClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/HIDClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MassStorageClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MIDIClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/PrinterClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/RNDISClassHost.c \
|
|
||||||
$(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/StillImageClassHost.c
|
|
||||||
|
|
||||||
LUFA_SRC_USB := $(sort $(LUFA_SRC_USB_COMMON) $(LUFA_SRC_USB_HOST) $(LUFA_SRC_USB_DEVICE))
|
|
||||||
|
|
||||||
LUFA_SRC_USBCLASS := $(LUFA_SRC_USBCLASS_DEVICE) $(LUFA_SRC_USBCLASS_HOST)
|
|
||||||
|
|
||||||
LUFA_SRC_TEMPERATURE := $(LUFA_ROOT_PATH)/Drivers/Board/Temperature.c
|
|
||||||
|
|
||||||
LUFA_SRC_SERIAL := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/Serial_$(ARCH).c
|
|
||||||
|
|
||||||
LUFA_SRC_TWI := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/TWI_$(ARCH).c
|
|
||||||
|
|
||||||
ifeq ($(ARCH), UC3)
|
|
||||||
LUFA_SRC_PLATFORM := $(LUFA_ROOT_PATH)/Platform/UC3/Exception.S \
|
|
||||||
$(LUFA_ROOT_PATH)/Platform/UC3/InterruptManagement.c
|
|
||||||
else
|
|
||||||
LUFA_SRC_PLATFORM :=
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Build a list of all available module sources
|
|
||||||
LUFA_SRC_ALL_FILES := $(LUFA_SRC_USB) \
|
|
||||||
$(LUFA_SRC_USBCLASS) \
|
|
||||||
$(LUFA_SRC_TEMPERATURE) \
|
|
||||||
$(LUFA_SRC_SERIAL) \
|
|
||||||
$(LUFA_SRC_TWI) \
|
|
||||||
$(LUFA_SRC_PLATFORM)
|
|
||||||
|
@ -1,112 +0,0 @@
|
|||||||
/** \file
|
|
||||||
*
|
|
||||||
* This file contains special DoxyGen information for the generation of the main page and other special
|
|
||||||
* documentation pages. It is not a project source file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \page Page_ExportingLibrary Exporting the Library for IDE Use
|
|
||||||
*
|
|
||||||
* While LUFA was designed to allow for easy compilation in a makefile driven environment,
|
|
||||||
* it is possible to export the library into a form suitable for drop-in use inside of an
|
|
||||||
* IDE.
|
|
||||||
*
|
|
||||||
* \note <b>LUFA is also available as a native Atmel Studio 6.1 extension</b>, which integrates LUFA into
|
|
||||||
* Atmel Studio including all demos and projects. If you are running Atmel Studio 6.1 or later, the
|
|
||||||
* below instructions are not required; download and install the native LUFA extension from the
|
|
||||||
* <a href="http://gallery.atmel.com">Atmel Gallery</a> instead.
|
|
||||||
*
|
|
||||||
* \section Sec_LibraryExport Exporting the Library
|
|
||||||
* An export of the library is at its most basic, a direct copy of the main "LUFA" source folder from the
|
|
||||||
* root download folder; this contains the library core which can be re-used within external projects.
|
|
||||||
* However, as many IDEs attempt to automatically compile all included source files, it is necessary to
|
|
||||||
* exclude some directories and files from the library core export to allow for easier integration into
|
|
||||||
* an IDE project.
|
|
||||||
*
|
|
||||||
* \subsection SSec_ManualExport Manual Export
|
|
||||||
* To manually export the library core, copy over the main LUFA library folder from the LUFA root directory,
|
|
||||||
* renaming as desired. Within the library core folder, the following directories should be removed or
|
|
||||||
* excluded from your IDE import:
|
|
||||||
* - Documentation/
|
|
||||||
* - DoxygenPages/
|
|
||||||
* - CodeTemplates/
|
|
||||||
* - StudioIntegration/
|
|
||||||
*
|
|
||||||
* If required, files from the CodeTemplates/ subdirectory may be copied to your IDE project as needed.
|
|
||||||
*
|
|
||||||
* The resulting copy of the library may then be imported into your chosen IDE according to the instructions
|
|
||||||
* shown in \ref Sec_LibraryImport.
|
|
||||||
*
|
|
||||||
* \subsection SSec_AutomaticExport Automatic Export
|
|
||||||
* If desired, the steps indicated in \ref SSec_ManualExport may be automatically performed, by running the
|
|
||||||
* command <b><code>make export_tar</code></b> from the command line. This will generate two .tar files in the
|
|
||||||
* current directory, named <code>LUFA_YYMMDD.tar</code> and <code>LUFA_YYMMDD_Code_Templates.tar</code> (where
|
|
||||||
* "YYMMDD" is the version of the library being exported). The first archive contains the exported LUFA core
|
|
||||||
* with the non-required files removed, while the second contains an archived copy of the code template files
|
|
||||||
* for the current LUFA version.
|
|
||||||
*
|
|
||||||
* The resulting archived copy of the library may then be extracted to your chosen IDE project source directory
|
|
||||||
* and imported according to the instructions shown in \ref Sec_LibraryImport.
|
|
||||||
*
|
|
||||||
* \section Sec_LibraryImport Importing the Library
|
|
||||||
* An exported copy of the library may be imported wholesale into an IDE project, if the instructions detailed
|
|
||||||
* in \ref Sec_LibraryExport are followed.
|
|
||||||
*
|
|
||||||
* Specific instructions for importing an exported version of LUFA into various IDEs are listed below.
|
|
||||||
*
|
|
||||||
* \subsection SSec_AS56_Import Importing into AVRStudio 5.x/Atmel Studio 6.0
|
|
||||||
* To import LUFA into a new or existing project, the following steps must be followed.
|
|
||||||
*
|
|
||||||
* \subsubsection SSSec_AS56_Import_Step1 Copy over the exported library
|
|
||||||
* Copy over the exported library archive created via the steps listed in \ref Sec_LibraryExport to your AS5/AS6
|
|
||||||
* project directory.
|
|
||||||
*
|
|
||||||
* \image html Images/AS5_AS6_Import/AS5_AS6_Import_Step1.png
|
|
||||||
*
|
|
||||||
* \subsubsection SSSec_AS56_Import_Step2 Extract exported library
|
|
||||||
* Extract out the contents of the archive to a new folder. This may be any name you wish, however keep in mind
|
|
||||||
* that this name will need to be referenced within your user application under most circumstances. It is
|
|
||||||
* suggested that this folder be named "LUFA", or "LUFA" followed by the version string for easy reference.
|
|
||||||
*
|
|
||||||
* \image html Images/AS5_AS6_Import/AS5_AS6_Import_Step2.png
|
|
||||||
*
|
|
||||||
* \subsubsection SSSec_AS56_Import_Step3 Add the library files
|
|
||||||
* Open your AVRStudio 5/Atmel Studio 6 project. From the "Solution Explorer" pane, click the "Show All Files"
|
|
||||||
* button on the toolbar to display ghosted icons of files and folders located in the project source directory
|
|
||||||
* that are not currently added to the project.
|
|
||||||
*
|
|
||||||
* \image html Images/AS5_AS6_Import/AS5_AS6_Import_Step3.png
|
|
||||||
*
|
|
||||||
* Right-click the ghosted version of the extracted LUFA export folder in the Solution Explorer pane, and
|
|
||||||
* choose the "Add to Project" option from the context menu. This will add the entire LUFA source tree to the
|
|
||||||
* current project.
|
|
||||||
*
|
|
||||||
* \subsubsection SSSec_AS56_Import_Step4 Open Project Toolchain Properties
|
|
||||||
* In the Solution Explorer pane, click the project node, and press the "Properties" button in the toolbar to
|
|
||||||
* open the Project Properties window. This window allows you to configure the various project global compiler,
|
|
||||||
* assembler and linker options.
|
|
||||||
*
|
|
||||||
* \image html Images/AS5_AS6_Import/AS5_AS6_Import_Step4.png
|
|
||||||
*
|
|
||||||
* Click the "Toolchain" tab on the left side of the Project Properties window.
|
|
||||||
*
|
|
||||||
* \subsubsection SSSec_AS56_Import_Step5 Configure Project Toolchain Properties
|
|
||||||
*
|
|
||||||
* In the GNU C Compiler section, open the "Symbols" page. Click the "Add Item" button to the top-right of the
|
|
||||||
* "Defined Symbols" section to add new symbols.
|
|
||||||
*
|
|
||||||
* At a minimum, you will need to define the following symbols (for more information on these symbols, see
|
|
||||||
* \ref Page_ConfiguringApps):
|
|
||||||
* - ARCH
|
|
||||||
* - F_CPU
|
|
||||||
* - F_USB
|
|
||||||
* - BOARD
|
|
||||||
* \image html Images/AS5_AS6_Import/AS5_AS6_Import_Step5_1.png
|
|
||||||
*
|
|
||||||
* Next, open the GNU C Compiler section's "Optimization" page. Ensure that the option to prepare functions for
|
|
||||||
* garbage collection is enabled.
|
|
||||||
* \image html Images/AS5_AS6_Import/AS5_AS6_Import_Step5_2.png
|
|
||||||
*
|
|
||||||
* Finally, in the GNU C Linker section, open the "Optimization" page. Ensure that the option to garbage collect
|
|
||||||
* unused sections is selected.
|
|
||||||
* \image html Images/AS5_AS6_Import/AS5_AS6_Import_Step5_3.png
|
|
||||||
*/
|
|
Before Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 158 KiB |
Before Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 23 KiB |