This set of makefiles is intended to be used by all embedded projects. Each file in tools/
is intended to be included from a main Makefile in your project. Each loads a particular set of features. You should include the ones you want, and not the ones you done.
Some sample Makefiles are provided for a couple systems.
This is still a Work In Progress.
I'm still flushing out the main interfaces and project standards.
This readme may not be quite up to date. See comments for most accurate documentation.
- Copy one of the sample Makefiles to your project dir and rename it to
Makefile
- Set the var
uMakerPath
to the uMaker directory, so that the includes work - Set the
C
and/orCPP
vars in your newMakefile
to compile your C/C++ files - Select which uMaker tools are included (only include the ones you use)
Descriptions of modules and how to use them
Add support for FreeRTOS to your project. This module enables compilation of their
sources and automatically copies the portmacro.h
and port.c
files to your
project.
Set FreeRTOS_Port
to one of the folder names in FreeRTOS\FreeRTOS\Source\portable\GCC
.
This module will copy both port.c
and portmacro.h
to your project. port.c
will be renamed and placed according to FreeRTOS_PortDefinitions_File
. portmacro.h
will keep its filename but be put into the folder FreeRTOS_PortInc_Dir
.
You will also need to create a file named FreeRTOSConfig.h
and put that in the
FreeRTOS_PortInc_Dir
folder. Samples of FreeRTOSConfig.h
are in the FreeRTOS demo
folders.
Add support for an Arduino core. By default, only works with the AVR core.
Does not handle Arduino Libraries. To use Arduino Libraries, copy them into your project's source folder and add them to the list of CPP files to build. This is required because Arduino's library "standard" is poorly defined and too inconsistent. Therefore, instead of trying to write a crazy uMaker module to support all of the possible libraries, we're forcing users to copy code and take ownership of the libraries they use.
This module reads the variable AUTO_GENERATED_FILES
and makes sure each
generated file depends on a target builds the destination folder when needed.
This module sets some useful default make command line arguments. In particular, it disables verbosity. It may also run multiple parallel jobs.
This is a core module that does the main compilation of your C/C++/S source files.
It also links object files into the final output .elf
and .hex
files.
This module basically runs the same commands as build
but only until intermediate
assembly .asm
files are built. The intention is to allow inspection of compiled
source files to check for low level issues.
Some guidelines to follow using the tools.
All variables should have a namespace prefix to keep things separate. There are a couple exceptions to this in the current tools where appropriate.
Most makefiles use uppercase variable names. This is how I've started this project's development, but I'm not seeing a good reason to continue using only uppercase variable names. I'm going to start converting them to CamelCase to ease readability and writeability.
See renames
Variables that end in Path
must end with a /
or be empty.
Variables that end in Dir
must not end with a /
nor be empty.
# Valid Paths vs Dirs
Build_Path = .build/
Arduino_BaseDir = Arduino
Build_LibPath =
Arduino_BuildDir = .
Most variables have sane defaults set. If you need to override them or set extras, you can do so directly in your main Makefile. Nearly all assignments in make-tools are done with ?=, which allows you to define your own versions instead.
Many variables also incorporate the same variable but with Extra
suffixed so that values can be trivially added
You should be able to get by just copying and editing the Makefile.xxxxx.sample
files. However, if you are interesting in understanding what is going on, keep reading.
In general, you should understand the standard chain of gcc commands, input and output files, and includes directories.
Some points to remember:
- GCC preprocessor handles all the #directives and basically creates one temporary C/C++ file that has no #directives
- You don't need to use
.
as an include dir (-I.
) - GCC doesn't make folders that it would need to be there for build to succeed
file1.c -> file1.c.o file2.cpp -> file2.cpp.o lib.c -> lib.c.o lib.c.o -> lib.a
file1.c.o + file2.cpp.o + lib.a -> out.elf
You should be aware of how makefiles work. However, a few features that I use in particular are:
- Conditional assignment operators
- Filename functions (
$(dir ...)
) - Substring functions (
$(VAR:find=replace)
) - Implicit Rules
- Automatic Variables
Points to remember:
- Variables are just strings that get text replaced when they are used
- Variables are expanded at the time they are used
- Variables are "used" in only certain places. Especially:
- Explicit expansion:
:=
- Target [dependency] declaration - This is why variables are usually before targets
include
directives
- Explicit expansion: